2012-03-02 78 views
15

我已经遍寻搜索并尝试了不同的命令变体,但我还没有。Powershell使用远程计算机上的命令行参数执行远程exe文件

我的目标是运行一个已经驻留在远程机器上的exe文件并传入命令行参数。我试过了invoke-command,但我似乎无法让我的语法来识别这些参数。

方法尝试:

  1. Win32_Process.Create()
  2. 调用命令
  3. 启动过程
  4. [diagnostics.process] ::启动
  5. 调用-WmiMethod

从我的测试中,我能得到的最接近的是以下命令:

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

该命令在没有错误或返回代码的情况下完成,但在远程机器上,它没有运行参数。我玩过单/双引号,看看有没有变化,但没有。

回答

19

你有没有尝试使用-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" } 
+0

感谢您的快速响应。出于某种原因,当我尝试这种方式时,我将它打印出可以工作的扩展命令,如果我手动运行它,但它并不实际运行它。我不得不删除“&”,因为它表示它是未来使用的保留字符。 – gregs 2012-03-02 16:34:04

+0

@gregs我必须在我的机器上启用远程测试才能测试。我将命令更改为发送localhost参数的简单ping测试。以上为我成功。 – 2012-03-02 17:16:37

+0

我可能已经想通了,但不是解决方案。如果我使用ping.exe和“localhost”作为参数,这条线会起作用,但由于路径中有空格,所以我必须在我的可执行文件路径中加引号。当我这样做时,它只是将我的字符串回复给我,但我认为它不会运行。 – gregs 2012-03-02 18:24:59

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

这应该工作,避免误导初学者。

3

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

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

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

我想通过一个远程计算机上的PowerShell脚本来做到这一点,想通了,所有我需要做的是把session里面

$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" 

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

+0

还没得到最好的答案 – 2016-11-03 11:29:29

-1
$sb = [scriptblock]::create($command) 
+2

欢迎来到StackOverflow!也许你可以添加一些解释,这可能对问问题的人有帮助。 – 2016-05-12 17:45:19