“@”符号在 PowerShell 中有什么作用?

我见过 PowerShell 中用来初始化数组的 @符号。

@符号到底表示什么,我可以在哪里阅读更多有关它的信息?

149139 次浏览

击打操作员

要创建数组,我们需要创建一个变量并分配数组。数组由“@”符号表示。让我们以上面的讨论为例,使用一个数组连接到多台远程计算机:

$strComputers = @("Server1", "Server2", "Server3")<enter>

它们用于数组和散列。

PowerShell 教程7: 积累、回忆和修改数据

PowerShell 中的数组文字

PowerShell 实际上将任何逗号分隔的列表视为一个数组:

"server1","server2"

所以在这些情况下@是可选的,但是对于关联数组,@是必需的:

@{"Key"="Value";"Key2"="Value2"}

官方的说法是“数组运算符”您可以在与 PowerShell 一起安装的文档中了解更多信息,或者在与我合著的《 Windows PowerShell: TFM 》一书中了解更多信息。

还可以在 @()中包装 cmdlet (或管道)的输出,以确保返回的是数组而不是单个项。

例如,dir 通常返回一个列表,但是根据选项的不同,它可能返回一个对象。如果计划使用 foreach-object 迭代结果,则需要确保返回一个列表。这里有一个人为的例子:

$results = @( dir c:\autoexec.bat)

还有一件事... 一个空数组(如初始化变量)表示为 @()

在 PowerShell V2中,@也是 飞溅操作员

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

虽然上述答复提供了答案的 大部分,但是提供完整的答案是有用的——即使在这个问题的后期——即:

数组子表达式 (参见 About _ array)

强制该值为数组,即使是单例或空值,例如 $a = @(ps | where name -like 'foo')

哈希初始化程序 (请参见 About _ hash _ tables)

使用键-值对初始化哈希表,例如。 $HashArguments = @{ Path = "test.txt"; Destination = "test2.txt"; WhatIf = $true }

溅血 (见 关于溅射)

让我们使用数组或散列表中的参数来调用 cmdlet,而不是使用更常见的单独枚举参数,例如使用上面的散列表 Copy-Item @HashArguments

这里的字符串 (参见 关于引用规则)

让我们用容易嵌入的引号创建字符串,通常用于多行字符串,例如:

$data = @"
line one
line two
something "quoted" here
"@

因为这种类型的问题(“ x”符号在 PowerShell 中是什么意思?)在 StackOverflow 和许多读者评论中都很常见,我整理了一本 PowerShell 标点符号词典,刚刚发布在 Simple-Talk.com 上。阅读所有关于@以及% 和 # 和 $_ and 的内容?在 PowerShell 标点符号完全指南更多。这篇文章的附件是这个挂图,它给你一张单独的表格上的所有东西: enter image description here

我希望这能帮助你更好地理解它。 您可以在键中存储“值”,并返回该值以执行某些操作。 在本例中,我只提供了@{ a = “”; b = “”; c = “ ; } ,如果没有在选项即“ key”(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
}