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

What does the "@" symbol do in PowerShell?

提问人:GrahamMc 提问时间:12/13/2008 最后编辑:ΩmegaManGrahamMc 更新时间:3/29/2022 访问量:166221

问:

我已经看到 PowerShell 中用于初始化数组的符号。@

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

语法 PowerShell

评论


答:

12赞 Cadoo 12/13/2008 #1

Splatting 运算符

为了创建一个数组,我们创建一个变量并赋值该数组。数组用“@”符号表示。让我们进行上面的讨论,并使用数组连接到多台远程计算机:

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

它们用于数组和哈希。

PowerShell 教程 7:累积、调用和修改数据

PowerShell 中的数组文本

106赞 Don Jones 12/13/2008 #2

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

"server1","server2"

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

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

正式地,@ 是“数组运算符”。您可以在随 PowerShell 一起安装的文档中阅读有关它的详细信息,也可以在我合著的“Windows PowerShell:TFM”等书中阅读。

评论

14赞 Eric Schoonover 9/15/2009
请务必在下面查看 Jeffrey Snover 的答案...... @ 不仅仅是一个数组标识符。
32赞 Mike Shepard 12/13/2008 #3

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

例如,dir 通常返回一个列表,但根据选项的不同,它可能会返回单个对象。如果您计划使用 foreach-object 遍历结果,则需要确保返回列表。下面是一个人为的例子:

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

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

评论

0赞 Don Jones 12/13/2008
[array]$a语法在视觉上更清晰一些,但很好的提示。
139赞 Jeffrey Snover - MSFT 2/22/2009 #4

在 PowerShell V2 中,@ 也是 Splat 运算符

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

评论

3赞 Alex Marshall 8/3/2016
这就是我一直在寻找的:此运算符用于 Azure 资源组部署脚本的 splat 上下文中。
103赞 Michael Sorens 10/3/2015 #5

虽然上面的回答提供了大部分答案,但提供完整的答案是有用的——即使问题这么晚了——也就是说:

数组子表达式(见about_arrays)

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

哈希初始值设定项(请参阅about_hash_tables)

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

溅射(见about_splatting)

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

这里是字符串(见about_quoting_rules)

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

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

因为这种类型的问题(“x”表示法在 PowerShell 中是什么意思?)在 StackOverflow 以及许多读者评论中非常普遍,所以我整理了一本 PowerShell 标点符号词典,刚刚发布在 Simple-Talk.com 上。阅读所有关于 @ 以及 % 和 # 以及 $_ 和 ?有关详细信息,请参阅 PowerShell 标点符号完整指南。文章附有这张挂图,它为您提供了一张纸上的所有内容:enter image description here

评论

0赞 bixb0012 9/27/2023
比公认的答案要好得多,实际上提供了更完整的答案和文档链接。
0赞 Brendan Harris 3/29/2022 #6

我希望这有助于更好地理解它。 您可以将“值”存储在键中,并返回该值以执行某些操作。 在这种情况下,我刚刚提供了@{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 
}