Сценарий Powershell ps1 запускает файл bat, но экран CMD закрывается после выполнения - PullRequest
1 голос
/ 29 мая 2020

Это мой код:

set-location [PATH]
$A = Start-Process -FilePath .\refresh.bat -Wait

set-location C:\

При выполнении в PowerShell система открывает окно командной строки и без проблем выполняет файл bat. Проблема в том, что окно закрывается, и я не могу увидеть, была ли ошибка, если это удалось.

Я хочу оставить окно CMD открытым.

Я также пробовал в конце летучей мыши файл:

:END
cmd /k

но не повезло.

Ответы [ 3 ]

3 голосов
/ 30 мая 2020

Во-первых, , если вам специально не нужно запускать командный файл в новом окне , не используйте Start-Process - используйте прямой вызов вместо , что неявно синхронно и позволяет захватить или перенаправить вывод :

# Invoke the batch file synchronously (wait for it to exit)
# and capture its (standard) output in variable $A
# To print the batch file's output to the console instead, just use:
#    .\refresh.bat
$A = .\refresh.bat

См. этот ответ для получения дополнительной информации.

Также обратите внимание, что Start-Process никогда не позволяет вам напрямую захватывать вывод вызванной программы (вы можете перенаправить его только в файлы с -RedirectStandardOutput и -RedirectStandardOutput); ваша команда c захватывает ничего [1] в $A; добавление -PassThru действительно возвращает что-то, но не вывод программы, а объект информации о процессе (System.Diagnostics.Process).

Если вы делаете необходимо запустить командный файл в новом окне и вы хотите оставить это окно открытым :

Start-Process -Wait -FilePath cmd -ArgumentList '/k .\refresh.bat'

Опираясь на привязку позиционных параметров, описанное выше можно упростить на:
Start-Process -Wait cmd '/k .\refresh.bat'


[1] Строго говоря, $A назначается синглтон [System.Management.Automation.Internal.AutomationNull]::Value, который в большинстве случаев ведет себя как $null.

0 голосов
/ 31 мая 2020

Спасибо mklement0 с вашим постом, который дал мне решение, которое я хотел. Вот как я решил это.

set-location [PATH]
$A = Start-Process -FilePath .\refresh.bat -Wait -NoNewWindow
set-location C:\

-NoNewWindow позволило мне запустить мой пакет в том же окне PowerShell, получая обратную связь с файлом bat. Таким образом, у меня есть ошибки, если они есть, и статус успеха, если ошибок нет.

Спасибо!

0 голосов
/ 29 мая 2020

Попробуйте PAUSE, чтобы удерживать окно командной строки.

:End
PAUSE

Я бы порекомендовал посмотреть Pu sh -Location и Pop-Location для вашего сценария PowerShell, если вы хотите вернуться в предыдущий каталог. Не является частью какого-либо исправления, только под использованными командлетами.))

...