如何附加到powershell Hashtable值?
Posted
技术标签:
【中文标题】如何附加到powershell Hashtable值?【英文标题】:How to append to powershell Hashtable value? 【发布时间】: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 中的泛型有点棘手。大多数时候我会说,如果您不是非常需要它们,请不要使用它们,因为代码实际上不太清楚。
【参考方案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 脚本。
【讨论】:
以上是关于如何附加到powershell Hashtable值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Powershell 将 ComboBox 选定文件附加到 TextBox?
powershell ConvertTo-Hashtable:Powershell实用程序函数,它将psCustomObject转换为HashTable,以便更好地寻找和迭代
PowerShell 是不是支持 HashTable 序列化?