无法使用PowerShell在远程计算机上运行参数化的批处理文件

时间:2019-05-03 09:38:53

标签: powershell remote-server parameterized

从PowerShell执行远程服务器参数化的批处理文件。

在远程计算机上不会引发错误或执行命令。

$path = "D:\run\test-5.2.bat";
Invoke-Command -ComputerName testserver -Scriptblock { "$path" }

bat文件中的脚本是带有参数的msiexec,只能通过命令提示符执行。

2 个答案:

答案 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