从PowerShell执行远程服务器参数化的批处理文件。
在远程计算机上不会引发错误或执行命令。
$path = "D:\run\test-5.2.bat";
Invoke-Command -ComputerName testserver -Scriptblock { "$path" }
bat文件中的脚本是带有参数的msiexec
,只能通过命令提示符执行。
答案 0 :(得分:0)
基于此msdn link,您可以在远程计算机上运行ps1
脚本文件。因此,如果可以将bat
文件的内容“移植”到ps1
中,它应该可以工作。这是msdn示例:
示例11:在文本文件中列出的所有计算机上运行脚本
PS C:\> Invoke-Command -ComputerName (Get-Content Servers.txt) -FilePath C:\Scripts\Sample.ps1 -ArgumentList Process, Service
此示例使用Invoke-Command cmdlet在Servers.txt文件中列出的所有计算机上运行Sample.ps1脚本。该命令使用FilePath参数指定脚本文件。即使该脚本文件不可被远程计算机访问,使用此命令也可以在远程计算机上运行脚本。
提交命令时,Sample.ps1文件的内容将复制到一个脚本块中,并且该脚本块将在每台远程计算机上运行。此过程等效于使用ScriptBlock参数提交脚本的内容。
希望有帮助
答案 1 :(得分:0)
$path
是一个字符串。与CMD或bash不同,PowerShell仅回显裸字符串而不执行它们。使用呼叫运算符(&
):
& "$path"
或Start-Process
:
Start-Process cmd.exe -ArgumentList '/c', $path -NoNewWindow -Wait
让PowerShell执行命令字符串。由于您说要从批处理脚本运行msiexec.exe
,因此可能需要使用后者。
最重要的是,您遇到了示波器问题。脚本块中的变量$path
与全局范围中的变量不同。您可以通过using:
范围限定符来减轻这种情况:
Invoke-Command -Computer testserver -Scriptblock { & "$using:path" }
或通过将$path
作为参数传递给脚本块:
Invoke-Command -Computer testserver -Scriptblock { & "$($args[0])" } -ArgumentList $path