Powershell在远程计算机上使用命令行参数执行远程exe
Posted
技术标签:
【中文标题】Powershell在远程计算机上使用命令行参数执行远程exe【英文标题】:Powershell Execute remote exe with command line arguments on remote computer 【发布时间】:2012-03-21 02:05:34 【问题描述】:我已经到处搜索并尝试了不同的命令变体,但我仍然没有。
我的目标是运行一个已经驻留在远程机器上的 exe 并传入命令行参数。我尝试过调用命令,但我似乎无法让我的语法识别参数。
尝试过的方法:
-
Win32_Process.Create()
调用命令
启动进程
[diagnostics.process]::start
调用-WmiMethod
根据我的测试,我能得到的最接近的是使用以下命令:
$command = "program.exe -r param"
Invoke-Command -ComputerName $server -ScriptBlock $command
该命令在没有错误或返回代码的情况下完成,但在远程计算机上,它没有使用参数运行。我玩过单引号/双引号,看看是否有任何变化,但没有。
【问题讨论】:
【参考方案1】:您是否尝试过使用-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"
【讨论】:
感谢您的快速回复。出于某种原因,当我以这种方式尝试时,我让它打印出如果我手动运行它会起作用的扩展命令,但它实际上并没有运行它。我不得不删除“&”,因为它表示它是一个保留字符以供将来使用。 @gregs 我必须在我的机器上启用远程处理才能进行测试。我将命令更改为发送 localhost 参数的简单 ping 测试。以上对我来说是成功的。 我可能已经找到了解决办法,但没有找到解决方案。如果我使用 ping.exe 和“localhost”作为 arg,这条线确实有效,但我必须在我的可执行路径周围加上引号,因为路径有空格。当我这样做时,它只是用引号将我的字符串回显给我,但我认为它不会运行。 感谢您的示例。我实际上发现了我的问题,它不喜欢你尝试将 2 个参数放入一个变量中,我最终不得不做两个参数 $myarg1, $myarg2 所以远程命令会同时支持它们。 @gregs 对,ArgumentList
是一个数组。【参考方案2】:
您是否尝试在启动程序时将命令行参数传递给程序? 我现在正在做的事情正是这样做的,它比我想象的要简单得多。 如果我进入命令行,然后输入
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"
这不会挂起您的终端窗口等待远程进程结束。 只要确保您有办法终止该过程,如果它自己不这样做。 (我的没有,需要编码另一个参数)
【讨论】:
最佳答案【参考方案3】:我一直试图通过使用 1 行单条目来实现这一点,但我结束了 Invoke 命令没有成功运行,因为它在启动后立即终止进程,尽管如果你进入会话并在退出前等待足够长的时间它可以工作.
例如,在远程机器 HFVMACHINE1(运行 Windows 7)上运行带有参数和空间的命令的唯一工作方式如下:
([WMICLASS]"\\HFVMACHINE1\ROOT\CIMV2:win32_process").Create('c:\Program Files (x86)\Thinware\vBackup\vBackup.exe -v HFSVR12-WWW')
【讨论】:
【参考方案4】:$sb = [scriptblock]::create($command)
【讨论】:
欢迎来到 ***!也许您可以添加一些解释,这可能对提出问题的人有所帮助。【参考方案5】:$sb = ScriptBlock::Create("$command")
Invoke-Command -ScriptBlock $sb
这应该有效并且避免误导初学者。
【讨论】:
以上是关于Powershell在远程计算机上使用命令行参数执行远程exe的主要内容,如果未能解决你的问题,请参考以下文章
使用 PowerShell 2.0 在远程计算机上运行批处理文件
尝试使用模拟在远程计算机上运行 PowerShell 脚本时“不允许请求的注册表访问”