Powershell Выполнение удаленного EXE с аргументами командной строки на удаленном компьютере - PullRequest
18 голосов
/ 02 марта 2012

Я искал все варианты и пробовал разные варианты команд, но пока еще не там.

Моя цель - запустить исполняемый файл, который уже находится на удаленном компьютере, и передать аргументы командной строки. Я пробовал использовать команду invoke, но не могу получить синтаксис для распознавания аргументов.

Использованные методы:

  1. Win32_Process.Create ()
  2. Invoke-Command
  3. Запуск процесса
  4. [diagnostics.process] :: начать
  5. Invoke-WmiMethod

Из моих тестов я могу получить следующую команду:

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

Команда завершается без кода ошибки или возврата, но на удаленной машине она не запускалась с аргументами. Я играл с одинарными / двойными кавычками, чтобы увидеть, есть ли изменения, но нет.

Ответы [ 5 ]

23 голосов
/ 02 марта 2012

Вы пытались использовать параметр -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" } 
4 голосов
/ 01 августа 2014

Вы пытаетесь передать аргументы командной строки программе, которую запускаете? Я сейчас работаю над чем-то, что делает именно это, и это было намного проще, чем я думал. Если я иду в командную строку, и введите

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"

и это не приводит к зависанию окна терминала в ожидании завершения удаленного процесса. Просто убедитесь, что у вас есть способ завершить процесс, если он не делает это самостоятельно. (мой нет, требуется код другого аргумента)

1 голос
/ 21 мая 2018

Я пытался добиться этого, используя одну запись в одну строку, но я закончил, что команда Invoke не сработала успешно, потому что она убивает процесс сразу после запуска, несмотря на то, что он может работать, если вы входите в сеанс и ждете достаточно перед выходом.

Единственный способ работы, который я мог найти, например, запустить команду с аргументами и пробелом на удаленной машине HFVMACHINE1 (под управлением Windows 7), заключается в следующем:

([WMICLASS]"\\HFVMACHINE1\ROOT\CIMV2:win32_process").Create('c:\Program Files (x86)\Thinware\vBackup\vBackup.exe -v HFSVR12-WWW')
0 голосов
/ 12 мая 2016
$sb = [scriptblock]::create($command)
0 голосов
/ 04 августа 2012
$sb = ScriptBlock::Create("$command")
Invoke-Command -ScriptBlock $sb

Это должно работать и не вводить новичков в заблуждение.

...