J'interagis à travers une list d'objects Microsoft.SqlServer.Management.Smo.Server
et en les ajoutant à une hashtable comme ceci:
$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()) } }
Jusqu'ici tout va bien. Ce que je veux faire maintenant est d'append une string à la fin de la valeur de hachage. Donc, pour une instance $, je veux append une string à la valeur de hachage pour cette instance $. Comment ferais-je cela? J'ai commencé avec ceci, mais je ne suis pas sûr si je suis sur la bonne voie:
foreach ($db in $instance.Databases) { foreach ($luser in $db.Users) { if(!$luser.IsSystemObject) { $scripts.Set_Item ($instance, <what do I add in here?>) } } }
À votre santé
$h= @{} $h.add("Test", "Item") $h; "" $h."Test" += " is changed" $h Name Value ---- ----- Test Item Test Item is changed
J'irais avec ce code.
$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().ToSsortingng() } }
.
foreach ($db in $instance.Databases) { foreach ($luser in $db.Users) { if(!$luser.IsSystemObject) { $scripts[$instance] = @($scripts[$instance]) + $luser.Script().ToSsortingng() } } }
Le résultat sera une table de hachage avec chaque instance comme une key, et un tableau de strings où chaque string est le script T-SQL pour un user.
La méthode .Script()
renvoie une collection de strings. Il y a probablement une façon plus élégante de le faire, mais en remplaçant
$scripts.Set_Item ($instance, <what do I add in here?>)
avec
$val = $scripts[$instance] $val.Add("text to add") $scripts.Set_Item($instance, $val)
devrait marcher.