我想使用 Invoke-Command 在本地机器上运行文件中的脚本,以便我可以使用 -ArgumentList 传递参数。我遇到了一个我无法理解的错误,所以我简化了我的命令。...
我想使用 Invoke-Command 在本地计算机上运行文件中的脚本,以便我可以使用 -ArgumentList 传递参数。我遇到了一个我无法理解的错误,因此我简化了我的命令。当我这样做时:
Invoke-Command -FilePath 'getprocess.ps1'
getprocess.ps1的内容为:
Get-Process
我收到的错误信息是:
Invoke-Command:无法使用指定的命名参数解析参数集。
位于行:1 字符:1
+ 调用命令 -FilePath 'getprocess.ps1'
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo:InvalidArgument:(:)[Invoke-Command],ParameterBindingException
+ FullyQualifiedErrorId:AmbiguousParameterSet,Microsoft.PowerShell.Commands.InvokeCommandCommand
这个错误信息让我很困惑。这是什么意思?我该如何让它正常工作?
长话短说:博士 :
p1
-FilePath
parameter by design works with remote invocations only - see the bottom section for details. p2
.\getprocess.ps1
注意:与cmd.exe
不同,PowerShell 在设计上要求.\
才能执行位于当前目录中的可执行文件。也就是说,为了避免意外执行当前目录中的可执行文件,而不是$env:Path
中列出的目录中的可执行文件,PowerShell 作为一项安全功能,要求您明确发出在当前目录 ( .
) 中执行某些文件的意图。
对于 脚本块 ( { ... }
),使用 &
调用 运算符 (例如 & { Get-Date }
)。
仅 出于语法原因, 脚本文件路径 &
被 指定为 引用 路径(例如 , & '.\getprocess.ps1'
并且/或者路径涉及 变量引用 (例如, & $HOME\getprocess.ps1
)。
(另外, .
两种 情况 下都需要使用 点源运算符, 以便 直接在调用者的作用域 而不是子作用域中执行脚本 [块])。
请注意,从 you can technically combine passing a script block to Invoke-Command
(parameter -ScriptBlock
) with invoking a local script :
# The script block positionally binds to the -ScriptBlock parameter.
# This is essentially the more expensive equivalent of:
# & .\getprocess.ps1
Invoke-Command { .\getprocess.ps1 }
这种方法比较 slower and offers NO advantage over direct invocation
( .\getprocess.ps1
or & .\getprocess.ps1
) .
p9
p10
但是,有 one conceivable use case :
如果脚本 不是 高级脚本 advanced script 而您想利用 Invoke-Command
参数 stream-output- collecting common parameters, such as -ErrorVariable
(如果被调用的脚本或函数 是 本身 就支持这些常见参数 ,这将再次使使用变得 Invoke-Command
不必要)。
# Invoke locally and collect errors in $errs
Invoke-Command { .\getprocess.ps1 } -ErrorVariable errs
警告 :
p14
第15页
至于 您尝试过的 :
在自己的答案中 指出的那样, , -FilePath
must be combined with the -ComputerName
parameter (错误消息如此通用是令人遗憾的)。
-FilePath
must be combined with any of the parameters that request remote execution ,其中包括 -Session
, -ConnectionUri
, -VmId
/ -VmName
,以及在类 Unix 平台上, -HostName
和 -SSHConnection
.
目的 purpose of parameter -FilePath
is to copy the content of a local script ( *.ps1
file) to a remote computer for execution there 。也就是说,它是一种方便的机制,用于执行(仅)在远程计算机上本地可用的脚本代码。
虽然从 you can technically target the local computer via -ComputerName localhost <)code>
/ -ComputerName .
/ -cn .
来定位本地计算机 does not amount to a local call :
Whenever -ComputerName
is specified - even with -ComputerName localhost
- PowerShell's remoting infrastructure is used ,这具有 重大影响 :
p21
第22页
p23
p24
也就是说, if the intent is to locally test remote execution 脚本的远程执行,并且本地机器设置为远程目标,那么使用 -ComputerName localhost
( -ComputerName .
/ -cn .
)就非常有意义,因为 PowerShell 的远程基础架构将以与真正的远程调用相同的方式参与其中。
但请注意,此类“环回远程”调用需要 提升权限 (以管理员身份运行)。