PowerShell, как и любая оболочка, может запускать консольные приложения напрямую, синхронно со стандартными потоками приложения, подключенными к потокам PowerShell.
всегда использовать Start-Process
только если вы хотите запустить программа в новом окне [1] ; также обратите внимание, что Start-Process
по умолчанию является асинхронным .
Ниже показано, как напрямую и синхронно запускать команду createDbsQuery
из PowerShell, используя PowerShell для временного изменения рабочего каталога и чтобы записать вывод команды в файл:
$somefile = "C:\ProgramFiles\site.txt"
$createdbs = "C:\PowerShell\createDBsQuery"
# Change to the directory required by the $createdbs script.
# and save the current directory.
Push-Location 'C:\ProgramFiles\Infor\Tools'
# Invoke the script and capture its stdout out in file $somefile
# Since the command path is stored in a variable, `& ` is needed to
# invoke it.
# Note that in Windows PowerShell `>` creates Unicode (UTF-16LE) files by default.
# In PowerShell [Core] 6+, BOM-less UTF-8 is used.
# To control the encoding, pipe to Set-Content; e.g.:
# & $createdbs | Set-Content $someFile -Encoding Utf8
& $createdbs > $somefile
# Restore the previous directory.
Pop-Location
Как видите, нет необходимости задействовать cmd.exe
(но если $createdbs
окажется командный файл, (*.bat
, *.cmd
), cmd.exe
будет неявно выполнять его), учитывая, что PowerShell, как отдельная оболочка, предлагает те же функции, что и cmd.exe
- и многое другое.
[1] Существует также опция -NoNewWindow
, но она редко требуется, учитывая, что прямой вызов дает вам не только синхронное выполнение в одном окне по умолчанию, но и также соединяет стандартные выходные потоки вызываемой программы с PowerShell, обеспечивая захват и перенаправление вывода. -NoNewWindow
в первую очередь полезен с -Wait
для временного устранения неполадок Start-Process
вызовов, предназначенных для выполнения в новое окно, если это windows закрывается (слишком) быстро из-за ошибки, чтобы увидеть, что выводится там.