Как я могу запустить мой сценарий PowerShell в строке? - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу выполнить powershell inline, но когда я пытаюсь выполнить все.Я получил Out-Null : A positional parameter cannot be found that accepts argument 'do'.

$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

 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);

Я хочу получить тот же результат, но я получил эту проблему

1 Ответ

0 голосов
/ 02 апреля 2019

В вашем коде 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) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...