Powershell Выполнять удаленный exe с аргументами командной строки на удаленном компьютере
Я искал все и пробовал разные варианты команд, но я все еще не там.
Моя цель - запустить exe, который уже находится на удаленном компьютере, и передать аргументы командной строки. Я пробовал команду invoke-command, но я не могу заставить свой синтаксис распознавать аргументы.
Проверенные методы:
- Win32_Process.Create()
- Invoke-Command
- Запуск процесса
- [diagnostics.process]:: старт
- Invoke-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"
Если значение аргумента статично, вы можете просто предоставить его в блоке script следующим образом:
invoke-command -ComputerName Computer1 -ScriptBlock { & 'C:\Program Files\program.exe' -something "myArgValue" }
Ответ 2
Вы пытаетесь передать аргументы командной строки программе AS, которую вы запускаете?
Я сейчас что-то работаю над тем, что делает именно это, и это было намного проще, чем я думал.
Если я перейду в командную строку и наберите
C:\folder\app.exe/xC:\folder\file.txt
то мое приложение запускает и создает файл в указанном каталоге с указанным именем.
Я хотел сделать это через Powershell script на удаленной машине и понял, что все, что мне нужно было сделать, было помещено
$s = New-PSSession -computername NAME -credential LOGIN
Invoke-Command -session $s -scriptblock {C:\folder\app.exe /xC:\folder\file.txt}
Remove-PSSession $s
(У меня есть куча более похожих команд внутри сеанса, это всего лишь минимум, который требуется для запуска)
заметьте пробел между исполняемым файлом и аргументами командной строки.
Он работает для меня, но я точно не знаю, как работает ваше приложение, или даже если вы передаете ему аргументы.
* Я также могу заставить мое приложение вывести файл обратно на мой собственный локальный компьютер, изменив script -block на
C:\folder\app.exe /x"\\LocalPC\DATA (C)\localfolder\localfile.txt"
Вам нужны кавычки, если в вашем пути к файлу есть пробел.
EDIT: на самом деле это вызвало некоторые глупые проблемы с Powershell, которые запускали приложение как услугу или что-то в этом роде, поэтому я сделал несколько поисков и выяснил, что вы можете вызвать CMD для выполнения команд для вас на удаленном компьютере.
Таким образом, команда выполняется ТОЧНО, как если бы вы только что ввели ее в окно CMD на удаленной машине. Поместите команду в скриптблоке в двойные кавычки, а затем поставьте cmd.exe/C перед ним. например:
cmd.exe /C "C:\folder\app.exe/xC:\folder\file.txt"
это решило все проблемы, которые у меня были в последнее время.
EDIT EDIT:
Имел больше проблем и нашел гораздо лучший способ сделать это.
start-process -filepath C:\folder\app.exe -argumentlist "/xC:\folder\file.txt"
и это не повредит ваше окно терминала, ожидающее завершения удаленного процесса.
Просто убедитесь, что у вас есть способ прекратить процесс, если он не делает этого самостоятельно. (мой не требует, требует кодирования другого аргумента)
Ответ 3
$sb = [scriptblock]::create($command)
Ответ 4
$sb = ScriptBlock::Create("$command")
Invoke-Command -ScriptBlock $sb
Это должно работать и не вводить в заблуждение новичков.