Я добавляю задачу Powershell в конвейер Azure, чтобы запустить exe-файл, принимая команды из канала и запуская процесс с двумя списками аргументов. Также мне нужно дождаться загрузки exe с аргументом, а затем передать команду (команды). Можем ли мы сделать это без start-process
Вот мой сценарий
$exeArguments = "arg1", "arg2"
"command1" | start-process -FilePath myapplication.exe -ArgumentList $exeArguments
И я получаю следующую ошибку
start-process : объект ввода не может быть привязан ни к каким параметрам команды, поскольку команда не принять входные данные конвейера или входные данные и их свойства не соответствуют ни одному из параметров, которые принимают входные данные конвейера.
Разве процесс запуска не принимает входные данные и аргументы канала одновременно?
Зачем вообще использовать start-process, если вы не ждете?
Нет, Start-Process принципиально не принимает входные данные конвейера, как отмечает JosefZ.
Вместо этого вы должны использовать параметр -RedirectStandardInput
, которому вы должны передать путь к (возможно, временному) файлу, содержащему данные, которые вы хотите отправить в поток stdin (стандартный ввод) целевого процесса.
Вот простой (надуманный пример):
# Create a temporary file...
$tempFile = New-TemporaryFile
# ... and fill it with sample data.
@'
hi
there
'@ | Set-Content $tempFile
# "Pipe" the file's content to `findstr.exe hi`, i.e. send it
# to the latter's stdin stream.
# This will print 'hi', i.e. the matching line to the console.
Start-Process -Wait -NoNewWindow -RedirectStandardInput $tempFile -FilePath findstr.exe -ArgumentList hi
# Clean up.
$tempFile | Remove-Item
Обратите внимание, что вы также не можете напрямую захватывать выходные данные процесса, запущенного с помощью Start-Process
, в конвейере PowerShell и должны использовать -RedirectStandardOutput
и -RedirectStandardError
для отправки выходных данных в файлы.
(В приведенном выше примере команды -NoNewWindow
гарантирует, что выходные данные процесса будут выведены на консоль, однако их невозможно захватить.)
Делаем шаг назад:
Если myapplication.exe
— консольное (терминальное) приложение и вы намерены выполнить его синхронно в текущей консоли (терминале), нет необходимости использовать Start-Process
— просто вызовите его напрямую, и в этом случае вы можете напрямую предоставить входные данные со стандартного ввода. через конвейер:[1]
$exeArguments = "arg1", "arg2"
"command1" | myapplication.exe @exeArguments
См. этот ответ для получения подробной информации и это руководство, когда использование Start-Process
уместно, а когда нет.
[1] Note that it is the value of the $OutputEncoding preference variable that controls the character encoding PowerShell uses for the data being sent to an external application (invariably as text up to PowerShell 7.3.x; in 7.4+, sending arbitrary [byte]
s is now supported). Complementarily, it is the value of [Console]::OutputEncoding
that determines how PowerShell decodes data received from an external application's stdout and stderr streams.
See this answer for more information.
Спасибо за этот ответ, это помогло. Старт-процесс мне не понадобился. Как было предложено, я просто вызвал exe напрямую. Но здесь я хочу дождаться загрузки exe, а затем запустить команды. Могу ли я сделать это без start-process?
Выше вы предоставили два решения. Я попробовал использовать ввод Pipe (I) для exe, который выдавал ошибку. Однако я заменил это вашим первым решением, используя Start-process, и предоставил команды через файл. Это сработало потрясающе. Большое спасибо. ты герой :) Я опубликую твое решение в качестве ответа на другой мой вопрос.
Прочтите Документацию «Старт-Процесс». Нет параметра, принимающего входные данные конвейера…