В вашем коде 3 проблемы:
- отсутствует
;
перед оператором do
(несколько операторов, помещенных в одну строку, должны быть ;
-разделены в PowerShell)
- вы позже добавили это, что делает вашу команду несовместимой с описанным симптомом.
пропущенное ключевое слово until
после do { ... }
- вы позже добавили это, но с предшествующим
;
, что нарушает оператор do
.
беспрепятственное использование |
, что означает, что cmd.exe
сам интерпретировал его, а не PowerShell, как предполагалось (я предполагаю, что вы вызываете это из cmd.exe
, иначе не было бы необходимости вызовите интерфейс командной строки PowerShell через powershell.exe
).
|
необходимо экранировать как ^|
, чтобы cmd.exe
передать его в PowerShell.
Исправление этих проблем приводит к следующей команде для использования из cmd.exe
:
# From cmd.exe / a batch file:
powershell -Command $OutputString = 'Hello World'; $WScript = New-Object -ComObject 'wscript.shell'; $WScript.Run('notepad.exe') ^| Out-Null; do{ Start-Sleep -Milliseconds 100} until ($WScript.AppActivate('notepad')); $WScript.SendKeys($OutputString)
Если вы хотите запустить свой код из PowerShell , вы можете просто вызвать его напрямую , как показано в первом фрагменте вашего вопроса - создавать * 1052 не нужно * другой процесс PowerShell через powershell.exe
Если по какой-то причине вам необходимо создать другой процесс PowerShell, используйте синтаксис блока скриптов ({ ... }
) для передачи команды, и в этом случае экранирование не требуется:
# From PowerShell
powershell -Command { $OutputString = 'Hello World'; $WScript = New-Object -ComObject 'wscript.shell'; $WScript.Run('notepad.exe') | Out-Null; do{ Start-Sleep -Milliseconds 100} until ($WScript.AppActivate('notepad')); $WScript.SendKeys($OutputString) }