我正在使用这个(简化的)代码块从SQL Server中使用bcp提取一组表.
$OutputDirectory = "c:\junk\"
$ServerOption = "-SServerName"
$TargetDatabase = "Content.dbo."
$ExtractTables = @(
"Page"
, "ChecklistItemCategory"
, "ChecklistItem"
)
for ($i=0; $i -le $ExtractTables.Length – 1; $i++) {
$InputFullTableName = "$TargetDatabase$($ExtractTables[$i])"
$OutputFullFileName = "$OutputDirectory$($ExtractTables[$i])"
bcp $InputFullTableName out $OutputFullFileName -T -c $ServerOption
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但现在有些表需要通过视图提取,有些则不需要.所以我需要一个像这样的数据结构:
"Page" "vExtractPage"
, "ChecklistItemCategory" "ChecklistItemCategory"
, "ChecklistItem" "vExtractChecklistItem"
Run Code Online (Sandbox Code Playgroud)
我在看哈希,但我找不到任何关于如何循环哈希的东西.这里做什么是正确的?也许只是使用一个数组,但两个值都用空格分隔?
还是我错过了一些明显的东西?
Ver*_*Ray 180
脚本不喜欢速记; 它的可读性较差.%{}运算符被认为是简写.以下是如何在脚本中完成可读性和可重用性:
PS> $hash = @{
a = 1
b = 2
c = 3
}
PS> $hash
Name Value
---- -----
c 3
b 2
a 1
Run Code Online (Sandbox Code Playgroud)
注:个人喜好; 语法更容易阅读
GetEnumerator()方法将如下所示完成:
foreach ($h in $hash.GetEnumerator()) {
Write-Host "$($h.Name): $($h.Value)"
}
Run Code Online (Sandbox Code Playgroud)
输出:
c: 3
b: 2
a: 1
Run Code Online (Sandbox Code Playgroud)
Keys方法将如下所示完成:
foreach ($h in $hash.Keys) {
Write-Host "${h}: $($hash.Item($h))"
}
Run Code Online (Sandbox Code Playgroud)
输出:
c: 3
b: 2
a: 1
Run Code Online (Sandbox Code Playgroud)
小心排序哈希表...
Sort-Object可能会将其更改为数组:
PS> $hash.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Hashtable System.Object
PS> $hash = $hash.GetEnumerator() | Sort-Object Name
PS> $hash.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
Run Code Online (Sandbox Code Playgroud)
And*_*ndi 97
Christian的答案效果很好,并展示了如何使用该GetEnumerator方法遍历每个哈希表项.您也可以循环使用该keys属性.以下是一个示例:
$hash = @{
a = 1
b = 2
c = 3
}
$hash.Keys | % { "key = $_ , value = " + $hash.Item($_) }
Run Code Online (Sandbox Code Playgroud)
输出:
key = c , value = 3
key = a , value = 1
key = b , value = 2
Run Code Online (Sandbox Code Playgroud)
小智 10
您也可以在没有变量的情况下执行此操作
@{
'foo' = 222
'bar' = 333
'baz' = 444
'qux' = 555
} | % getEnumerator | % {
$_.key
$_.value
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢带有管道的枚举器方法上的这个变体,因为您不必在 foreach 中引用哈希表(在 PowerShell 5 中测试):
$hash = @{
'a' = 3
'b' = 2
'c' = 1
}
$hash.getEnumerator() | foreach {
Write-Host ("Key = " + $_.key + " and Value = " + $_.value);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Key = c and Value = 1
Key = b and Value = 2
Key = a and Value = 3
Run Code Online (Sandbox Code Playgroud)
现在,这不是故意按值排序的,枚举器只是以相反的顺序返回对象。
但由于这是一个管道,我现在可以对从枚举器接收到的对象进行排序:
$hash.getEnumerator() | sort-object -Property value -Desc | foreach {
Write-Host ("Key = " + $_.key + " and Value = " + $_.value);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Key = a and Value = 3
Key = b and Value = 2
Key = c and Value = 1
Run Code Online (Sandbox Code Playgroud)
关于循环哈希:
$Q = @{"ONE"="1";"TWO"="2";"THREE"="3"}
$Q.GETENUMERATOR() | % { $_.VALUE }
1
3
2
$Q.GETENUMERATOR() | % { $_.key }
ONE
THREE
TWO
Run Code Online (Sandbox Code Playgroud)
这是另一种快速的方法,只需将键用作哈希表的索引即可获取值:
$hash = @{
'a' = 1;
'b' = 2;
'c' = 3
};
foreach($key in $hash.keys) {
Write-Host ("Key = " + $key + " and Value = " + $hash[$key]);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
167650 次 |
| 最近记录: |