点源运算符为什么要把字符串转成命令

Why does the dot source operator convert strings into commands

我遇到了一个使用 dot sourcing operator.

混淆其调用的脚本

$ORMEFyak=.('n'+'ew-obje'+'ct') NeT.WebcLIENt;

这似乎等同于: $var = New-Object Net.WebClient

运行 . "help" returns help cmdlet 的内容。

点源运营商究竟为何如此?

此行为并非特定于 .dot-sourcing operator; it equally applies to &, the call operator

  • 仅当您调用 脚本文件时 (*.ps1)(或者,不太常见,函数 脚本块 ) do .& 的行为不同:. 直接在调用者的范围内运行代码 ,而更典型的 & 子范围 中运行它 - 请参阅 了解更多信息。

  • New-Object 的情况下,作为 cmdlet,您可以在技术上互换使用它们(或完全省略它们 - 见下文),但为了概念清晰,最好使用 & 除非需要实际的点源。

与其说他们将字符串转换成命令,不如说他们的目的是执行 由其 name 给出的命令,作为 string,以及其他形式(见下文)。

用于为 .& 提供或构建此名称的 特定语法 附带的 ,在你的例子中,字符串连接表达式被用来隐藏被调用的命令的名称。

  • 但是,指定命令的名称 不加引号,逐字 (如果语法上可能)是特殊的,因为您可以在没有运算符的情况下调用 - & 然后是 隐含的 ;请参阅下面的示例。

因此,以下所有变体都是等效的(出于上述原因,我使用 &):

# Bareword (unquoted, verbatim) command name
# If you don't need dot-sourcing, you can invoke *as-is* - 
# use of & is implied.
New-Object regex 'foo?'

# Optionally, use &
& New-Object regex 'foo?'

# If the command name *needs quoting*, is *(based on) a variable* or
# *built by an expression*, & is *required*
$cmd = 'New-Object'
& $cmd regex 'foo?'

& ('New-' + 'Object') regex 'foo?'

请注意,除了作用于命令 names(字符串)之外,.& 还可以调用 script blocks (e.g. & { New-Object regex 'foo?' }) and command-information objects returned by Get-Command(例如, & (Get-Command New-Object) regex 'foo?')