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


112

我已经看到在PowerShell中使用@符号初始化数组。@符号确切表示什么,我在哪里可以了解更多信息?

Answers:


81

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

"server1","server2"

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

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

正式地,@是“数组运算符”。您可以在与PowerShell一起安装的文档中或在我与他人合着的《 Windows PowerShell:TFM》一书中了解有关此内容的更多信息。


12
确保检查以下Jeffrey Snover的答案... @不仅仅是数组标识符。
Eric Sc​​hoonover

115

在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

1
这就是我想要的:此操作符在Azure资源组部署脚本的splat上下文中使用。
亚历克斯·马歇尔

57

尽管以上回答提供了大多数答案,但对于问题的完整解答,即使是问题的后期,也很有用:

数组子表达式(请参阅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
"@

因为此类问题(PowerShell中的“ x”符号是什么意思?)在StackOverflow以及许多读者的评论中都很常见,所以我整理了一份Powershell标点词典,该词典刚刚在Simple-Talk.com上发布。阅读所有有关@以及%和#和$ _和?的信息。有关更多信息,请参见《 PowerShell标点的完整指南》。该文章的附件是此挂图,可在一张纸上为您提供所有功能: 在此处输入图片说明


非常详尽地介绍了@的所有用法。我来到这里寻找这里的字符串。谢谢!
Nixphoe

27

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

例如,dir通常返回一个列表,但是根据选项的不同,它可能返回单个对象。如果您打算使用foreach对象遍历结果,则需要确保返回列表。这是一个人为的示例:

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

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


[array] $ a语法在视觉上比较清晰,但技巧不错。
唐·琼斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.