这很奇怪。通常,当我从powershell执行外部命令时,我使用&
运算符,如下所示:
& somecommand.exe -p somearguments
然而,今天我遇到了这样使用的.
运算符:
.$env:systemdrive\chocolatey\chocolateyinstall\chocolatey.cmd install notepadplusplus
在这种情况下,期间的目的是什么?我不明白。
答案 0 :(得分:23)
“。” call operator将从你调用的其他脚本发送和接收变量。 “&”呼叫运营商只会发送变量。
例如,考虑以下因素:
脚本1(call-operator.ps1):
clear
$funny = "laughing"
$scriptpath = split-path -parent $MyInvocation.MyCommand.Definition
$filename = "laughing.ps1"
"Example 1:" # Call another script. Variables are passed only forward.
& $scriptpath\$filename
"Example 2:" # Call another script. Variables are passed backwards and forwards.
. $scriptpath\$filename
$variableDefinedInOtherScript
脚本2(laughing.ps1):
# This is to test the passing of variables from call-operator.ps1
"I am $funny so hard. Passing variables is so hilarious."
$variableDefinedInOtherScript = "Hello World!"
创建两个脚本并仅运行第一个脚本。你会看到“。” call运算符发送和接收变量。
两者都有它们的用途,所以要有创意。例如,“&”如果要在保留当前脚本中的原始值的同时修改另一个脚本中的变量值,则调用运算符将非常有用。有点保障。 ;)
答案 1 :(得分:8)
短片:
它是一个特殊的操作员,用于实现常规操作员无法实现的目标。这个特殊的运算符.
实际上有两个截然不同的特殊运算符用例。
The Long:
与任何其他语言,脚本或其他语言一样,PowerShell脚本还支持许多不同类型的操作符来帮助操作值。这些常规运营商包括:
但是,PowerShell还支持称为特殊操作符的内容,这些操作用于执行其他类型的操作符无法执行的任务。
这些特别运营商包括:
@()
数组子表达式运算符&
致电运营商[ ]
演员,
逗号运算符.
点源运营商-f
格式化运算符[ ]
索引运算符|
管道运营商.
财产取消引用运营商..
范围运算符::
静态成员运营商$( )
Subexpression运算符 .
点源运算符,以允许脚本在当前作用域中运行,基本上允许脚本创建的任何函数,别名和变量要添加到当前脚本中。
示例:强>
. c:\scripts.sample.ps1
注意 .
特殊运算符的此应用程序后跟一个空格,以区别于代表当前目录的(.
)符号
示例:强>
. .\sample.ps1
.
属性取消引用运算符:允许通过指示.
左侧的表达式来访问.
后面的对象的属性和方法{1}}字符是一个对象,右侧的表达式是一个对象成员(属性或方法)。
示例:强>
$myProcess.peakWorkingSet
(get-process PowerShell).kill()
免责声明&来源:强>
我在查看PowerShell脚本时遇到了同样的问题,我试图在其功能集上进行扩展,并在进行研究时找到答案。然而,我设法在Microsoft开发网络上使用this华丽的写作找到了答案,并补充了this来自IT专业人员的相同想法的进一步扩展。
干杯。
答案 2 :(得分:6)
点是呼叫运营商:
$a = "Get-ChildItem"
. $a # (executes Get-ChildItem in the current scope)
但是,在你的情况下,我看不出它的作用。
答案 3 :(得分:1)
.Period或.full停止对象属性;喜欢
$CompSys.TotalPhysicalMemory
见这里:http://www.computerperformance.co.uk/powershell/powershell_syntax.htm#Operators_
答案 4 :(得分:0)
这个答案是对 David Brabant 和他的评论者已经提供的答案的稍微扩展。虽然这些言论都是真实和中肯的,但还是有些遗漏了。
OP 在调用外部命令时使用 &
是不必要的。省略 &
不会有任何影响(以他的用法为例)。 &
的目的是允许调用名称为(字符串)表达式值的命令。通过使用上面的 &
,powershell 然后(本质上)将后续参数视为字符串,其中第一个是 &
适当调用的命令名称。如果省略 &
,powershell 会将行中的第一项作为要执行的命令。
然而,第二个示例中的 .
是必要的(尽管正如其他人所指出的,&
在这种情况下也能正常工作)。没有它,命令行将以变量访问 ($env:systemdrive
) 开头,因此 powershell 将期待某种形式的表达式。但是,紧跟在变量引用之后的是一个裸文件路径,它不是一个有效的表达式并且会产生一个错误。通过在行的开头使用 .
(或 &
),它现在被视为命令(因为开头看起来不像一个有效的表达式)并且参数被处理为可扩展字符串 (" "
)。因此,命令行被视为
. "$env:systemdrive\chocolatey\chocolateyinstall\chocolatey.cmd" "install" "notepadplusplus"
第一个参数用 $env:systemdrive
代替,然后 .
调用这样命名的程序。
注意:关于 powershell 如何处理命令行参数的完整描述方式比此处给出的要复杂。这个版本被缩减为回答问题所需的基本部分。查看 about_Parsing 以获得全面的描述。它并不完整,但应涵盖大多数正常使用。在 stackoverflow 和 github(powershell 现在所在的地方)上还有其他帖子,涵盖了官方文档中未列出的一些看似古怪的行为。另一个有用的资源是 about_Operators,尽管这还不够完整。例如,在调用 powershell 脚本/cmdlet 以外的其他内容时,.
和 &
的等效性根本没有提及。