35

这是一个奇怪的问题。通常,当我从 powershell 执行外部命令时,我会使用这样的&运算符:

& somecommand.exe -p somearguments

但是,今天我遇到了.这样使用的运算符:

.$env:systemdrive\chocolatey\chocolateyinstall\chocolatey.cmd install notepadplusplus

在这种情况下,时间段的用途是什么?我不明白。

4

5 回答 5

36

这 ”。” dot sourcing 运算符将发送和接收来自您调用的其他脚本的变量。“&”调用运算符将​​只发送变量。

例如,考虑以下情况:

脚本 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!"

创建两个脚本并只运行第一个。你会看到“。” 点源运算符发送和接收变量。

两者都有其用途,所以要有创意。例如,如果您想修改另一个脚本中的变量值,同时保留当前脚本中的原始值,“&”调用运算符会很有用。有点保障。;)

于 2012-08-09T20:51:09.370 回答
15

简而言之: 它是一种特殊运算符,用于实现常规运算符无法实现的功能。这个特定的运算符.实际上有两个截然不同的特殊运算符用例。

长:

与任何其他语言、脚本或其他语言一样,PowerShell 脚本也支持许多不同类型的运算符来帮助操作值。这些常规运营商包括:

  • 算术
  • 任务
  • 比较
  • 逻辑的
  • 重定向
  • 项目清单
  • 拆分和加入
  • 类型
  • 一元

但是,PowerShell 还支持所谓的特殊运算符,用于执行其他类型的运算符无法执行的任务。

这些特殊运算符包括:

  • @()数组子表达式运算符
  • &呼叫接线员
  • [ ]演员表操作员
  • ,逗号运算符
  • .点源运营商
  • -f格式运算符
  • [ ]索引运算符
  • |管道操作员
  • .属性取消引用运算符
  • ..范围运算符
  • ::静态成员运算符
  • $( )子表达式运算符

. 点源运算符:在此上下文中用于允许脚本在当前范围内运行,本质上允许将脚本创建的任何函数、别名和变量添加到当前脚本中。

例子:

. c:\scripts.sample.ps1 

请注意,特殊运算符的此应用.后跟一个空格,以将其与.表示当前目录的 ( ) 符号区分开来

例子:

. .\sample.ps1

. 属性取消引用操作符:允许访问一个对象的属性和方法,.通过指示字符左侧的表达式.是一个对象,而右侧的表达式是一个对象成员(属性或方法)。

例子:

$myProcess.peakWorkingSet  
(get-process PowerShell).kill()

免责声明和来源:

在查看 PowerShell 脚本时,我遇到了同样的问题,我试图扩展其功能集并在研究答案时来到这里。但是,我设法使用Microsoft 开发网络上的这篇精彩文章找到了我的答案,并辅以 IT Pro 对相同想法进一步扩展。

干杯。

于 2017-07-16T10:47:20.780 回答
6

点是呼叫运算符:

$a = "Get-ChildItem" 
. $a # (executes Get-ChildItem in the current scope)

但是,在您的情况下,我看不到它的作用。

于 2012-05-23T20:05:46.883 回答
2

.Period 或 .full stop 用于对象属性;喜欢

$CompSys.TotalPhysicalMemory

见这里: http: //www.computerperformance.co.uk/powershell/powershell_syntax.htm#Operators_

于 2012-05-23T20:08:57.140 回答
0

这个答案是对 David Brabant 和他的评论者已经提供的答案稍加扩展。虽然这些言论都是真实和中肯的,但有些东西被遗漏了。

&调用外部命令时使用的 OP是不必要的。省略 the&不会有任何影响(以他的用法为例)。的目的&是允许调用名称为(字符串)表达式的值的命令。通过使用&上述内容,powershell 然后(基本上)将后续参数视为字符串,其中第一个是&适当调用的命令名称。如果&省略了,powershell 会将行中的第一项作为要执行的命令。

但是,.第二个示例中的必要的(尽管正如其他人所指出的,&在这种情况下也可以正常工作)。没有它,命令行将以变量 access ( $env:systemdrive) 开头,因此 powershell 会期望某种形式的表达式。但是,紧随变量引用的是一个裸文件路径,它不是有效的表达式,会产生错误。通过在行首使用.(或&),它现在被视为一个命令(因为开头看起来不像一个有效的表达式)并且参数被处理为可扩展字符串(" ")。因此,命令行被视为

. "$env:systemdrive\chocolatey\chocolateyinstall\chocolatey.cmd" "install" "notepadplusplus"

第一个参数已$env:systemdrive代入其中,然后.调用由此命名的程序。

注意:关于 powershell 如何处理命令行参数的完整描述比这里给出要复杂得多。这个版本被缩减为回答问题所需的基本部分。查看about_Parsing以获得全面的描述。它不完整,但应该涵盖大多数正常使用。在 stackoverflow 和 github(powershell 现在所在的位置)上还有其他帖子,涵盖了官方文档中未列出的一些看似古怪的行为。另一个有用的资源是about_Operators,虽然这还不是很完整。一个例子是.&当调用除 powershell 脚本/cmdlet 之外的其他东西时,根本没有提及。

于 2021-06-13T17:26:46.153 回答