我曾在 PowerShell 中看到 @
符号被用于初始化数组。
这个 @
符号到底代表什么,我应该在哪里阅读更多相关信息?
我曾在 PowerShell 中看到 @
符号被用于初始化数组。
这个 @
符号到底代表什么,我应该在哪里阅读更多相关信息?
PS> # First use it to create a hashtable of parameters:
PS> $params = @{path = "c:\temp"; Recurse= $true}
PS> # Then use it to SPLAT the parameters - which is to say to expand a hash table
PS> # into a set of command line parameters.
PS> dir @params
PS> # That was the equivalent of:
PS> dir -Path c:\temp -Recurse:$true
PowerShell实际上会把任何由逗号分隔的列表看作数组:
"server1","server2"
所以在这些情况下@是可选的。但是,对于关联数组,@是必需的:
@{"Key"="Value";"Key2"="Value2"}
@官方上是“数组操作符”。您可以在随 PowerShell 一起安装的文档中了解更多信息,或者可以参考我合著的书籍《Windows PowerShell: TFM》。
虽然上面的回答提供了大部分答案,但是为了完整起见,在这个问题晚期提供完整的答案也很有用,具体如下:
数组子表达式(见about_arrays)
强制将值转换为数组,即使它是单例或null,例如:$a = @(ps | where name -like 'foo')
哈希初始化器(见about_hash_tables)
使用键值对初始化哈希表,例如:$HashArguments = @{ Path = "test.txt"; Destination = "test2.txt"; WhatIf = $true }
Splatting(见about_splatting)
允许您使用来自数组或哈希表的参数调用 cmdlet,而不是更常规的逐个枚举参数,例如使用上面的哈希表,Copy-Item @HashArguments
Here strings(见about_quoting_rules)
允许您创建带有易于嵌入引号的字符串,通常用于多行字符串,例如:
$data = @"
line one
line two
something "quoted" here
"@
因为这种类型的问题(在PowerShell中,'x'符号是什么意思?)在StackOverflow以及很多读者评论中非常普遍,所以我在Simple-Talk.com上编写了一个PowerShell标点符号词典,并刚刚发布了它。在The Complete Guide to PowerShell Punctuation中,您可以了解@、%、#、$_、?等内容。此外,文章附带了这个墙贴,将所有内容都呈现在一张纸上:
您可以使用@()
将cmdlet(或管道)的输出包装起来,以确保您得到的是一个数组而不是单个项。
例如,dir通常返回一个列表,但根据选项,它可能返回单个对象。如果您计划使用foreach-object遍历结果,您需要确保获取到的是一个列表。这是一个人为制造的例子:
$results = @( dir c:\autoexec.bat)
还有一件事......表示空数组(例如初始化变量)的符号为@()
。
扩展运算符
要创建一个数组,我们创建一个变量并赋值给这个数组。数组以“@”符号表示。让我们使用一个数组来连接多个远程计算机,以上面的讨论为例:
$strComputers = @("Server1", "Server2", "Server3")<enter>
它们用于数组和哈希表。
希望这能更好地帮助理解。 你可以在键内存储“值”,并返回该值以执行某些操作。 在这种情况下,我只提供了@ {a = ""; b = ""; c = "";},如果不在选项即“键”(a、b或c)中,则不返回值。
$array = @{
a = "test1";
b = "test2";
c = "test3"
}
foreach($elem in $array.GetEnumerator()){
if ($elem.key -eq "a"){
$key = $elem.key
$value = $elem.value
}
elseif ($elem.key -eq "b"){
$key = $elem.key
$value = $elem.value
}
elseif ($elem.key -eq "c"){
$key = $elem.key
$value = $elem.value
}
else{
Write-Host "No other value"
}
Write-Host "Key: " $key "Value: " $value
}