Powershell在远程计算机上使用命令行参数执行远程exe

时间:2012-03-02 15:07:48

标签: powershell command-line-arguments

我已经搜遍了所有并尝试了不同的命令变体,但我还没有。

我的目标是运行已驻留在远程计算机上的exe并传入命令行参数。我已经尝试过invoke-command,但我似乎无法通过语法来识别参数。

尝试了方法:

  1. Win32_Process.Create()
  2. 调用指令
  3. 启动过程
  4. [diagnostics.process] ::启动
  5. 调用-WmiMethod
  6. 从我的测试中,我能得到的最接近的是以下命令:

    $command = "program.exe -r param"
    Invoke-Command -ComputerName $server -ScriptBlock {$command}
    

    命令完成时没有错误或返回代码,但在远程计算机上,它没有运行参数。我玩过单/双引号,看是否有任何变化,但没有。

5 个答案:

答案 0 :(得分:23)

您是否尝试使用-ArgumentList参数:

invoke-command -ComputerName studio -ScriptBlock { param ( $myarg ) ping.exe $myarg } -ArgumentList localhost   

http://technet.microsoft.com/en-us/library/dd347578.aspx

调用不在路径中并且在其文件夹路径中有空格的程序的示例:

invoke-command -ComputerName Computer1 -ScriptBlock { param ($myarg) & 'C:\Program Files\program.exe' -something $myarg } -ArgumentList "myArgValue"

如果参数的值是静态的,你可以在脚本块中提供它,如下所示:

invoke-command -ComputerName Computer1 -ScriptBlock { & 'C:\Program Files\program.exe' -something "myArgValue" } 

答案 1 :(得分:4)

您是否尝试将命令行参数传递给您启动它的程序? 我现在正在做一些正确的事情,这比我想象的要简单得多。 如果我进入命令行,请键入

C:\folder\app.exe/xC:\folder\file.txt

然后我的应用程序启动,并在指定目录中创建一个具有指定名称的文件。

我想通过远程计算机上的Powershell脚本执行此操作,并想出我需要做的就是放

$s = New-PSSession -computername NAME -credential LOGIN
    Invoke-Command -session $s -scriptblock {C:\folder\app.exe /xC:\folder\file.txt}
Remove-PSSession $s

(我在会话中有更多类似的命令,这只是它运行所需的最小值) 注意可执行文件和命令行参数之间的空格。 它适用于我,但我不确定您的应用程序是如何工作的,或者甚至是如何将参数传递给它。

*我也可以让我的应用程序通过将脚本块更改为

将文件推回到我自己的本地计算机
C:\folder\app.exe /x"\\LocalPC\DATA (C)\localfolder\localfile.txt"

如果文件路径中有空格,则需要引号。

编辑:实际上,这带来了一些愚蠢的问题,Powershell将应用程序作为服务或其他东西启动,所以我做了一些搜索,并发现你可以调用CMD在远程计算机上为你执行命令。 这样,命令就可以完全执行,就好像刚刚将它输入远程机器上的CMD窗口一样。将脚本块中的命令放入双引号中,然后在其前面放置一个cmd.exe / C.像这样:

cmd.exe /C "C:\folder\app.exe/xC:\folder\file.txt"

这解决了我最近遇到的所有问题。

编辑编辑: 有更多的问题,并找到了一个更好的方法来做到这一点。

start-process -filepath C:\folder\app.exe -argumentlist "/xC:\folder\file.txt"

这不会挂断您的终端窗口,等待远程进程结束。 只要确保你有办法终止进程,如果它不自己这样做。 (我没有,需要另一个论点的编码)

答案 2 :(得分:1)

我一直试图通过使用1行单一条目来实现这一点,但我结束了Invoke命令没有成功运行,因为它在启动后立即终止进程,尽管如果你进入会话并且在退出之前等待它就可以工作

我能找到的唯一工作方式,例如,在远程机器HFVMACHINE1(运行Windows 7)上运行带参数和空格的命令如下:

([WMICLASS]"\\HFVMACHINE1\ROOT\CIMV2:win32_process").Create('c:\Program Files (x86)\Thinware\vBackup\vBackup.exe -v HFSVR12-WWW')

答案 3 :(得分:-1)

$sb = [scriptblock]::create($command)

答案 4 :(得分:-2)

$sb = ScriptBlock::Create("$command")
Invoke-Command -ScriptBlock $sb

这应该有效,避免误导初学者。