PowerShell中的"@"符号有什么作用?

154

我曾在 PowerShell 中看到 @ 符号被用于初始化数组。

这个 @ 符号到底代表什么,我应该在哪里阅读更多相关信息?

6个回答

139
在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
这就是我要找的:这个运算符用于 Azure 资源组部署脚本中的展开上下文。 - Alex Marshall

106

PowerShell实际上会把任何由逗号分隔的列表看作数组:

"server1","server2"

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

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

@官方上是“数组操作符”。您可以在随 PowerShell 一起安装的文档中了解更多信息,或者可以参考我合著的书籍《Windows PowerShell: TFM》。


14
请确保查看下面Jeffrey Snover的回答...@不仅仅是一个数组标识符。 - Eric Schoonover

103

虽然上面的回答提供了大部分答案,但是为了完整起见,在这个问题晚期提供完整的答案也很有用,具体如下:

数组子表达式(见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中,您可以了解@、%、#、$_、?等内容。此外,文章附带了这个墙贴,将所有内容都呈现在一张纸上: enter image description here


比接受的答案好得多,实际上提供了更完整的答案并附带了文档链接。 - undefined

32

您可以使用@()将cmdlet(或管道)的输出包装起来,以确保您得到的是一个数组而不是单个项。

例如,dir通常返回一个列表,但根据选项,它可能返回单个对象。如果您计划使用foreach-object遍历结果,您需要确保获取到的是一个列表。这是一个人为制造的例子:

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

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


[array]$a 的语法在视觉上更加清晰,是个不错的提示。 - Don Jones

12

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接