我想使用Invoke-Command在本地机器上运行一个文件中的脚本,这样我就可以使用-ArgumentList传入参数。我一直收到一个我不理解的错误,所以我简化了我的命令。当我这样做时:
Invoke-Command -FilePath 'getprocess.ps1'
getprocess.ps1的内容为:
Get-Process
我收到的错误消息是:
调用命令:无法使用指定的命名参数解析参数集。
第1行第1个字符
- 调用命令文件路径“getprocess.ps1”
- 类别信息:无效参数:(:)[调用命令],参数绑定异常
- 完全限定错误ID:不明确的参数集,Microsoft.PowerShell.命令.调用命令命令
我被这个错误信息弄糊涂了。这是什么意思?我该怎么做?
5条答案
按热度按时间rt4zxlrg1#
左;右:
*一般来说,不要将
Invoke-Command
用于 local 调用-虽然技术上可行,但只有一个特定用例需要这样做(见下文)。注:与
cmd.exe
不同,PowerShell在设计上需要.\
才能执行位于 * 当前目录 * 中的可执行文件。也就是说,为了避免意外执行当前目录中而不是$env:Path
中列出的目录中的可执行文件,PowerShell将此作为一项安全功能,要求您显式地发出在当前目录(.
)中执行某些内容的信号。对于script blocks(
{ ... }
),请使用&
,即呼叫操作符(例如& { Get-Date }
)。仅出于语法原因,如果 * 脚本文件路径 * 被指定为 * 带引号的 * 路径(例如,
& '.\getprocess.ps1'
)和/或如果该路径涉及 * 变量引用 *(例如,& $HOME\getprocess.ps1
)。(另外,
.
,在 * 两种 * 情况下都需要点源运算符,以便 * 直接在调用者的作用域 * 而不是在子作用域中执行脚本[block])。请注意,您可以在技术上 * 合并 * 向
Invoke-Command
(参数-ScriptBlock
)传递脚本块和调用本地脚本:这比直接 * 调用要慢,而且没有任何优势。但是,有*一个 * 可能的用例:
如果脚本 * 不是 * advanced script,并且您希望利用
Invoke-Command
的流输出收集公共参数,如-ErrorVariable
(如果被调用的脚本或函数 * 是 * 高级的,它 * 本身 * 支持这些公共参数)。型
Invoke-Command
* 不 * 将公共-ErrorAction
参数应用于 * 脚本块 * 中 * 发生的错误,因此它不能用于控制错误处理;例如-ErrorAction Stop
对脚本块中的命令没有影响。至于你所尝试的:
实际上,正如您所指出的in your own answer,
-FilePath
* 必须 * 与-ComputerName
参数(错误消息太常见,这是不幸的)。-FilePath
必须与请求 * 远程 * 执行的 * 任何 * 参数组合,包括-Session
、-ConnectionUri
、-VmId
/-VmName
,以及在类Unix平台上的-HostName
和-SSHConnection
。参数
-FilePath
的用途是将 * 本地 * 脚本(*.ps1
文件)的 * 内容 * 复制到 * 远程 * 计算机,以便在 * 那里执行。也就是说,它是执行(仅)在远程计算机上本地可用的脚本代码的一种方便机制。虽然从技术上讲,您可以通过
-ComputerName localhost
(或者更简洁地说,通过-ComputerName .
/-cn .
)将本地计算机作为目标,但这并 * 不 * 相当于 * 本地调用:只要指定
-ComputerName
(即使使用-ComputerName localhost
),就会使用PowerShell的 * 远程处理基础架构,这具有主要含义:也就是说,如果目的是在本地 * 测试脚本的远程执行*,并且您的本地计算机被设置为远程目标,那么使用
-ComputerName localhost
(-ComputerName .
/-cn .
)是非常有意义的,因为PowerShell的远程基础设施随后以与真正的远程调用相同的方式参与其中。但是,请注意,此类“回送远程处理”调用需要 elevation(以admin身份运行)。
6qftjkof2#
虽然错误消息没有明确说明,但**-FilePath参数使-ComputerName参数成为必需参数。若要显式地以本地计算机为目标,请使用-ComputerName localhost**。
utugiqy63#
我不能在本地使用
invoke-command
,当你试图在远程电脑上运行命令时,你会使用它。例如,您可能希望运行类似以下内容:
该错误基本上是告诉您需要填写更多与该命令绑定的参数。
试着运行
Get-Help Invoke-Command
来查看命令的一些信息以及如何运行它。u91tlkcl4#
必须有计算机名。
使用您的IP地址:)要允许这样做,您还必须包含
-credential
如果这样做不起作用......
invoke-expression
可能是一个半适合的测试替代品,直到您准备好在远程计算机上调用命令。epfja78i5#
你可以像这样在本地运行它,但是你必须在管理员(提升的)提示符下运行。
实际上,您还可以执行一种奇怪的并行形式: