本地计算机上具有FilePath的PowerShell调用命令-模糊参数错误?

qrjkbowd  于 2022-12-18  发布在  Shell
关注(0)|答案(5)|浏览(118)

我想使用Invoke-Command在本地机器上运行一个文件中的脚本,这样我就可以使用-ArgumentList传入参数。我一直收到一个我不理解的错误,所以我简化了我的命令。当我这样做时:

Invoke-Command -FilePath 'getprocess.ps1'

getprocess.ps1的内容为:

Get-Process

我收到的错误消息是:
调用命令:无法使用指定的命名参数解析参数集。
第1行第1个字符

  • 调用命令文件路径“getprocess.ps1”
  • 类别信息:无效参数:(:)[调用命令],参数绑定异常
  • 完全限定错误ID:不明确的参数集,Microsoft.PowerShell.命令.调用命令命令
    我被这个错误信息弄糊涂了。这是什么意思?我该怎么做?
rt4zxlrg

rt4zxlrg1#

左;右
*一般来说,不要将Invoke-Command用于 local 调用-虽然技术上可行,但只有一个特定用例需要这样做(见下文)。

  • 相反,直接调用脚本***:
.\getprocess.ps1

注:与cmd.exe不同,PowerShell在设计上需要.\才能执行位于 * 当前目录 * 中的可执行文件。也就是说,为了避免意外执行当前目录中而不是$env:Path中列出的目录中的可执行文件,PowerShell将此作为一项安全功能,要求您显式地发出在当前目录(.)中执行某些内容的信号。
对于script blocks{ ... }),请使用&,即呼叫操作符(例如& { Get-Date })。
仅出于语法原因,如果 * 脚本文件路径 * 被指定为 * 带引号的 * 路径(例如,& '.\getprocess.ps1')和/或如果该路径涉及 * 变量引用 *(例如,
& $HOME\getprocess.ps1)。
(另外,.,在 * 两种 * 情况下都需要点源运算符,以便 * 直接在调用者的作用域 * 而不是在子作用域中执行脚本[block])。
请注意,您可以在技术上 * 合并 * 向Invoke-Command(参数-ScriptBlock)传递脚本块和调用本地脚本

# The script block positionally binds to the -ScriptBlock parameter.
# This is essentially the more expensive equivalent of:
#     & .\getprocess.ps1
Invoke-Command { .\getprocess.ps1 }

这比直接 * 调用要慢,而且没有任何优势。但是,有*一个 * 可能的用例
如果脚本 * 不是 * advanced script,并且您希望利用Invoke-Command的流输出收集公共参数,如-ErrorVariable(如果被调用的脚本或函数 * 是 * 高级的,它 * 本身 * 支持这些公共参数)。

# Invoke locally and collect errors in $errs
Invoke-Command { .\getprocess.ps1 } -ErrorVariable errs

  • 警告 *:至少从PowerShell 7.2开始,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的 * 远程处理基础架构,这具有主要含义

  • 目标计算机(即使是本地计算机)必须设置为PowerShell远程处理-请参见about_Remote_Requirements
  • 如果专门针对本地计算机,则必须在 * 提升 * 会话中运行(以管理员身份运行)。
  • 执行将比 direct(本地)调用慢得多。
  • 如果涉及到通过PowerShell基于XML的序列化基础设施进行跨进程封送处理,输入和输出数据的类型保真度都可能丢失-请参见this answer

也就是说,如果目的是在本地 * 测试脚本的远程执行*,并且您的本地计算机被设置为远程目标,那么使用-ComputerName localhost-ComputerName ./-cn .)是非常有意义的,因为PowerShell的远程基础设施随后以与真正的远程调用相同的方式参与其中。
但是,请注意,此类“回送远程处理”调用需要 elevation(以admin身份运行)。

6qftjkof

6qftjkof2#

虽然错误消息没有明确说明,但**-FilePath参数使-ComputerName参数成为必需参数。若要显式地以本地计算机为目标,请使用-ComputerName localhost**。

Invoke-Command -FilePath 'getprocess.ps1' -ComputerName localhost
utugiqy6

utugiqy63#

我不能在本地使用invoke-command,当你试图在远程电脑上运行命令时,你会使用它。
例如,您可能希望运行类似以下内容:

invoke-Command -ComputerName REMOTE-PC -Credentials $credential -Scriptblock {Get-Process}

该错误基本上是告诉您需要填写更多与该命令绑定的参数。
试着运行Get-Help Invoke-Command来查看命令的一些信息以及如何运行它。

u91tlkcl

u91tlkcl4#

必须有计算机名。

$parameters = @{
    ComputerName = '255.255.255.255'
    FilePath = 'getprocess.ps1'
    Credential = 'Domain01\User01'
}

invoke-command @parameters

使用您的IP地址:)要允许这样做,您还必须包含-credential
如果这样做不起作用...... invoke-expression可能是一个半适合的测试替代品,直到您准备好在远程计算机上调用命令。

epfja78i

epfja78i5#

你可以像这样在本地运行它,但是你必须在管理员(提升的)提示符下运行。

invoke-command localhost getprocess.ps1

实际上,您还可以执行一种奇怪的并行形式:

invoke-command localhost,localhost,localhost getprocess.ps1

相关问题