2010-12-09 11 views
5

Ich interating durch eine Liste von Microsoft.SqlServer.Management.Smo.Server Objekten und das Hinzufügen von ihnen zu einer Hash-Tabelle etwa so:Wie hängt man den Hashtable-Wert der Powershell an?

$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())  
    } 
} 

So weit so gut. Ich möchte jetzt eine Zeichenfolge an das Ende des Hashtable-Werts anhängen. Daher möchte ich für eine $ Instanz eine Zeichenfolge an den Hashtable-Wert für diese $ Instanz anhängen. Wie würde ich das tun? Ich habe mit diesem begonnen, aber ich bin nicht sicher, ob ich auf dem richtigen Weg bin:

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

Prost

+0

Übrigens muss es keine HashTable sein - vielleicht wäre ein 'System.Collections.Generic.Dictionary [string, string]' besser? –

+0

Mark: Generics in PowerShell sind ein bisschen eklig, obwohl. Die meiste Zeit würde ich sagen, wenn du sie nicht dringend benötigst, benutze sie nicht, da der Code eigentlich weniger klar ist. – Joey

Antwort

11
$h= @{} 

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

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

Test       Item is changed                                   
+0

'$ h.Test' ist eigentlich genug. Wenn der Schlüsselname keine seltsamen Zeichen enthält, sind die Anführungszeichen nicht erforderlich. – Joey

+0

Ja. Einverstanden. Ich wollte die Zitate zeigen, damit andere wussten, dass das eine Option war. –

0

Die .Script() Methode liefert eine String-Sammlung. Wahrscheinlich gibt es eine elegantere Möglichkeit, es zu tun, aber unter Ersatz

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

mit

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

funktionieren soll.

1

Ich würde mit diesem Code gehen.

$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() 
     } 
    } 
} 

Das Ergebnis wird mit jeder Instanz als ein Schlüssel eine Hash-Tabelle sein, und eine Reihe von Strings, wobei jeder String der T-SQL-Skript für einen Benutzer.