【问题标题】:Powershell Execute remote exe with command line arguments on remote computerPowershell在远程计算机上使用命令行参数执行远程exe
【发布时间】:2012-03-21 02:05:34
【问题描述】:

我已经到处搜索并尝试了不同的命令变体,但我仍然没有。

我的目标是运行一个已经驻留在远程机器上的 exe 并传入命令行参数。我尝试过调用命令,但我似乎无法让我的语法识别参数。

尝试过的方法:

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

根据我的测试,我能得到的最接近的是使用以下命令:

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

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

【问题讨论】:

    标签: powershell command-line-arguments


    【解决方案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)
      

      【讨论】:

      • 欢迎来到 StackOverflow!也许您可以添加一些解释,这可能对提出问题的人有所帮助。
      【解决方案5】:
      $sb = ScriptBlock::Create("$command")
      Invoke-Command -ScriptBlock $sb
      

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

      【讨论】:

        猜你喜欢
        • 2011-11-23
        • 2018-01-14
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 2021-08-08
        • 2014-11-05
        • 2017-05-21
        相关资源
        最近更新 更多