Полезный ответ Ансгара Вичерса содержит эффективное решение и разумные предупреждения безопасности.
Использование System.Diagnostics.Process
экземпляра с .RedirectStandardInput = $true
и использование .StandardInput
для обеспечения стандартного ввода после запуска процесса, дает вам больше гибкости, но в вашем случае единственное изменение, которое было необходимо, это передать вашу командную строку как аргумент (2-й параметр),через опцию -c
, для программа cmd.exe
(1-й параметр) .
[Diagnostics.Process]::Start()
'* первый параметрэто только имя исполняемого файла / путь , а не полная командная строка.
Это 2-й параметр , который принимает строку, содержащую аргументы для передачи в исполняемый файл.
Поскольку вы используете функции shell , а именно соединение нескольких команд с pipe , вы должны использовать cmd.exe
в качестве исполняемого файла и передавать ваш конвейер в качестве аргумента to cmd.exe
/c
.
- Вы также можете использовать
powershell.exe
, но в этом простом случае достаточно - и быстрее - использовать cmd.exe
.
Вот упрощенный пример:
$meProcessID = ([Diagnostics.Process]::Start(
# Program to launch
'cmd',
# Arguments to pass
'/c echo 42 | powershell -nop -c "''stdin input: '' + $Input" & pause'
).Id
Выше показано, что ввод stdin 42
воспринимается процессом powershell
как таковым ($Input
);открывается новое окно консоли, в котором отображается следующее:
stdin input: 42
Press any key to continue . . .