我正在尝试通过PowerShell远程从客户端升级具有特定应用程序的服务器:
Invoke-Command -ComputerName $server -Credential $mycreds {Start-Process -FilePath "C:\temp\xxx.exe" -ArgumentList "-default", "-acceptEULA" -wait }
无论我如何尝试,都会收到类似“找不到指定的文件...”的消息,我该怎么办? FilePath在本地(客户端)计算机上。
答案 0 :(得分:1)
您的C:\temp\xxx.exe
可执行文件必须存在于服务器(远程计算机)上,才能使命令起作用,因为这是脚本块({ {1}})执行。
注意:相反,如果将{ ... }
与Invoke-Command
参数一起使用,以运行本地存在的 script 文件(-FilePath
)在远程运行时,PowerShell 自动将其复制到远程计算机;来自the docs:“使用此参数时,PowerShell会将指定脚本文件的内容转换为脚本块,将该脚本块传输到远程计算机,然后在远程计算机上运行。”
要从本地(客户端)计算机上复制可执行文件,由于使用了{{1},因此您需要采用四步方法( PSv5 + } [1] ):
.ps1
的远程会话
使用Copy-Item
及其Copy-Item -ToSession
参数将本地(客户端)可执行文件复制到该会话(远程计算机)
使用$server
参数(而不是
-ToSession
)运行Invoke-Command
命令,以便在显式创建的会话中运行(并非严格如此)是必要的,但无需创建另一个(临时)会话。
运行Remove-PSSession
以关闭远程会话。
重要:在PowerShell远程会话中,您无法运行需要交互式用户输入 的外部程序:
虽然您可以启动 GUI 应用程序,但它们始终会运行 invisible 。
类似地,不支持交互式 console 应用程序(尽管客户端收到控制台应用程序 的 output )。 / p>
但是,支持 PowerShell命令中的交互式提示。
将它们放在一起:
-Session
[1]如果您正在运行 Powershell v4或更低版本,请考虑下载 psexec 。