【问题标题】:How to append to powershell Hashtable value?如何附加到powershell Hashtable值?
【发布时间】:2011-05-22 18:12:20
【问题描述】:

我正在遍历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?>)
        }
    }
}

干杯

【问题讨论】:

  • 顺便说一句,它不一定是一个 HashTable - 也许 System.Collections.Generic.Dictionary[string,string] 会更好?
  • Mark:不过,PowerShell 中的泛型有点棘手。大多数时候我会说,如果您不是非常需要它们,请不要使用它们,因为代码实际上不太清楚。

标签: sql-server powershell hashtable smo


【解决方案1】:

.Script() 方法返回一个字符串集合。可能有一种更优雅的方法,但是替换

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

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

应该可以。

【讨论】:

    【解决方案2】:
    $h= @{}
    
    $h.add("Test", "Item")
    $h; ""
    $h."Test" += " is changed"
    $h
    
    Name                           Value                                                                                                                                                   
    ----                           -----                                                                                                                                                   
    Test                           Item                                                                                                                                                    
    
    Test                           Item is changed                                                                                                                                         
    

    【讨论】:

    • $h.Test 其实就够了。如果键名中没有奇怪的字符,则不需要引号。
    • 是的。同意。我想显示引号,以便其他人知道这是一种选择。
    【解决方案3】:

    我会使用这段代码。

    $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 脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-24
      • 2021-05-14
      • 2017-03-22
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      相关资源
      最近更新 更多