2010-12-09 11 views
5

मैं Microsoft.SqlServer.Management.Smo.Server ऑब्जेक्ट्स की एक सूची के माध्यम से इंटरैटिंग कर रहा हूं और उन्हें एक हैशटेबल में जोड़ रहा हूं:Powerhell हैशटेबल मूल्य में कैसे संलग्न करें?

$instances = Get-Content -Path .\Instances.txt 
$scripts = @{} 

foreach ($i in $instances) 
{ 
    $instance = New-Object Microsoft.SqlServer.Management.Smo.Server $i 
    foreach($login in $instance.Logins) 
    { 
     $scripts.Add($instance.Name, $login.Script())  
    } 
} 

अब तक इतना अच्छा है। मैं अब क्या करना चाहता हूं हैशटेबल मान के अंत में एक स्ट्रिंग जोड़ना है। तो एक $ उदाहरण के लिए मैं उस $ उदाहरण के लिए हैशटेबल मान में एक स्ट्रिंग जोड़ना चाहता हूं। मुझे यह कैसे करना है? मैंने इसके साथ शुरुआत की है, लेकिन मुझे यकीन नहीं है कि मैं सही रास्ते पर हूं:

foreach ($db in $instance.Databases) 
{  
    foreach ($luser in $db.Users) 
    { 
     if(!$luser.IsSystemObject) 
     { 
      $scripts.Set_Item ($instance, <what do I add in here?>) 
     } 
    } 
} 

चीयर्स

+0

जिस तरह से इसे हैशटेबल नहीं होना चाहिए - शायद एक 'System.Collections.Generic.Dictionary [स्ट्रिंग, स्ट्रिंग]' बेहतर होगा? –

+0

मार्क: पावरशेल में जेनेरिक थोड़ा मुश्किल है, यद्यपि। अधिकांश समय मैं कहूंगा कि यदि आपको उनकी अत्यधिक आवश्यकता नहीं है, तो उनका उपयोग न करें क्योंकि कोड वास्तव में कम स्पष्ट है। – Joey

उत्तर

11
$h= @{} 

$h.add("Test", "Item") 
$h; "" 
$h."Test" += " is changed" 
$h 

Name       Value                                     
----       -----                                     
Test       Item                                      

Test       Item is changed                                   
+0

'$ h.Test' वास्तव में पर्याप्त है। यदि कुंजी नाम में कोई अजीब अक्षर नहीं हैं तो उद्धरण आवश्यक नहीं हैं। – Joey

+0

हां। माना। मैं उद्धरण दिखाना चाहता था ताकि दूसरों को पता चले कि यह एक विकल्प था। –

0

.Script() विधि एक स्ट्रिंग संग्रह देता है। संभवतः यह कर रही है, लेकिन

$val = $scripts[$instance] 
$val.Add("text to add") 
$scripts.Set_Item($instance, $val) 

साथ

$scripts.Set_Item ($instance, <what do I add in here?>) 

की जगह काम करना चाहिए की एक और अधिक सुरुचिपूर्ण तरीका है।

1

मैं इस कोड के साथ जाऊंगा।

$instances = Get-Content -Path .\Instances.txt 
$scripts = @{} 

foreach ($i in $instances) 
{ 
    $instance = New-Object Microsoft.SqlServer.Management.Smo.Server $i 
    foreach($login in $instance.Logins) 
    { 
     $scripts[$instance.Name] = @($scripts[$instance.Name]) + $login.Script().ToString() 
    } 
} 

foreach ($db in $instance.Databases) 
{ 
    foreach ($luser in $db.Users) 
    { 
     if(!$luser.IsSystemObject) 
     { 
      $scripts[$instance] = @($scripts[$instance]) + $luser.Script().ToString() 
     } 
    } 
} 

परिणाम एक कुंजी के रूप प्रत्येक उदाहरण के साथ एक हैश तालिका, और तार की एक सरणी जहां प्रत्येक स्ट्रिंग एक उपयोगकर्ता के लिए T-SQL स्क्रिप्ट है किया जाएगा।

संबंधित मुद्दे