tl;dr:
.\getprocess.ps1
注意:与cmd.exe 不同,PowerShell 在设计上需要.\ 才能执行位于当前目录 中的可执行文件。也就是说,为了避免意外执行当前目录而不是$env:Path 中列出的目录中的可执行文件,PowerShell 作为一项安全功能,要求您明确表示要在当前目录(.)中执行某些内容的意图.
对于script blocks ({ ... }),使用&、call operator(例如& { Get-Date })。
仅出于句法原因,您在情境上还需要&作为脚本文件路径,如果它们被指定为引用路径(例如,& '.\getprocess.ps1')和/或如果路径涉及变量引用(例如,
& $HOME\getprocess.ps1)。
(另外,. ,dot-sourcing operator 在两种 情况下都需要,以便在调用者的范围内直接执行脚本 [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 的流输出收集
common parameters, such as -ErrorVariable(如果被调用的脚本或函数是高级的,它支持这些常用参数本身)。
# Invoke locally and collect errors in $errs
Invoke-Command { .\getprocess.ps1 } -ErrorVariable errs
警告:至少从 PowerShell 7.2 开始,Invoke-Command 不会将common -ErrorAction parameter 应用于脚本块中发生的错误 >,所以不能用来控制错误处理;例如,-ErrorAction Stop 对脚本块中的命令没有影响。
至于你尝试了什么:
确实,正如您指出的in your own answer,-FilePath 必须与
-ComputerName 参数结合使用(错误消息是如此通用很不幸)。
参数-FilePath的目的是将本地脚本(*.ps1文件)的内容复制到远程 em> 执行计算机那里。也就是说,它是一种执行脚本代码的便捷机制,该脚本(仅)在远程机器上本地可用。
虽然您可以通过-ComputerName localhost(或者,更简洁地,通过-ComputerName ./-cn .)在技术上定位本地计算机,但这确实不 相当于本地通话:
无论何时指定 -ComputerName - 即使是 -ComputerName localhost - PowerShell 的远程基础架构 都会被使用,它具有主要影响:
-
目标计算机 - 即使它是本地计算机 - 也必须设置为 PowerShell 远程处理 - 请参阅 about_Remote_Requirements。
-
如果您专门针对本地计算机,您必须在提升会话中运行(以管理员身份运行)。
-
执行将比直接(本地)调用慢得多。
-
考虑到通过 PowerShell 的基于 XML 的序列化基础设施进行跨进程封送处理,输入和输出数据都可能丢失类型保真度 - 请参阅 this answer。
也就是说,如果意图是在本地测试远程执行您的脚本,并且您的本地机器被设置为远程目标,那么使用@987654362 @ (-ComputerName . / -cn .) 非常有意义,因为 PowerShell 的远程处理基础架构随后以与真正远程调用相同的方式参与。
但请注意,此类“环回远程处理”调用需要 elevation(以管理员身份运行)。