()和$()

时间:2017-11-13 22:20:28

标签: powershell

之间有什么区别
Write-Host (Get-Date) # just paren

Write-Host $(Get-Date) # dollar-paren

parens中的内容可能是任何东西,只是举个简单的例子。两者之间有什么区别吗?

我认为自己对PS有相当的经验,但是这些小问题让我感到烦恼,特别是在代码审查等过程中。有没有人遇到过“这里是语言如何运作”的良好来源,有足够的细节来得出这些问题的答案?

3 个答案:

答案 0 :(得分:3)

子表达式($(...))包含StatementBlockAst。它可以使用任意数量的语句,意味着关键字(ifforeach等),管道,命令等。解析类似于命名块的内部,如begin / process / end

paren表达式((...))可以包含单个 ExpressionAst,它是AST的有限子集。语句和表达式之间最显着的区别是关键字未被解析。

$(if ($true) { 'It worked!' })
# It worked!

(if ($true) { 'It worked!' })
# if : The term 'if' is not recognized as the name of a cmdlet, function, 
# script file, or operable program. Check the spelling of the name, or
# if a path was included, verify that the path is correct and try again.
# At line:1 char:2
# + (if ($true) { 'It worked' })
# +  ~~
#     + CategoryInfo          : ObjectNotFound: (if:String) [], CommandNotFoundException
#     + FullyQualifiedErrorId : CommandNotFoundException

正如其他人所说,子表达式将以双引号字符串扩展。

答案 1 :(得分:2)

()有助于操作顺序

$()有助于评估()

内的值

例如,如果您尝试在字符串中查找今天的日期,则可以执行以下操作:

echo "The length of Bryce is (Get-Date)"
echo "The length of Bryce is $(Get-Date)"

你会看到输出是不同的(在一个中它给你字面上的“(Get-Date)”而在另一个中它给你得到了Get-Date的评估表达式)

您可以阅读有关语法运算符here

的更多信息

答案 2 :(得分:2)

括号用于分组和建立顺序,就像在数学中一样。从PowerShell v3开始,您还可以使用它们来评估组的属性,例如通过运行获取当前文件夹中文件的文件名:

(Get-ChildItem).Name

子表达式$()评估其中的脚本,然后显示要在命令中使用的输出。通常在字符串中使用以扩展对象的属性,例如:

"Hello $($User.Name), would you like to play a game?"

使用ComObjects时也很有用,例如Excel中您可能要针对每个项目的属性测试范围。虽然这不起作用,因为Range对象没有Font属性:

$Range.Font|Where{$_.Bold}

这样可行,因为它会将Range输出为Cell个对象的集合,每个对象都有Font属性:

$($Range).Font|Where{$_.Bold}

您可以将子表达式视为脚本中的脚本,因为它们可以是多个命令,并且可以立即计算整个事物,以便最终输出可以用于父命令。