Как добавить в PowerShell значение Hashtable? - PullRequest
6 голосов
/ 09 декабря 2010

Я перебираю список Microsoft.SqlServer.Management.Smo.Server объектов и добавляю их в хеш-таблицу примерно так:

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

Пока все хорошо.Сейчас я хочу добавить строку в конец значения хеш-таблицы.Поэтому для $ instance я хочу добавить строку к значению хеш-таблицы для этого $ instance.Как бы я это сделал?Я начал с этого, но я не уверен, что я на правильном пути:

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

Приветствия

Ответы [ 3 ]

13 голосов
/ 09 декабря 2010
$h= @{}

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

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

Test                           Item is changed                                                                                                                                         
1 голос
/ 09 декабря 2010

Я бы пошел с этим кодом.

$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 для пользователя.

0 голосов
/ 09 декабря 2010

Метод .Script() возвращает коллекцию строк.Возможно, есть более элегантный способ сделать это, но замена

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

на

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

должна работать.

...