Запустите команду в cmd.exe с помощью PowerShell - PullRequest
1 голос
/ 24 марта 2020

Я открываю cmd. Я указываю путь и хочу выполнить команду, которая хранится в файле createDBsQuery, который я сохранил в переменной $createdbs.

Я сомневаюсь: можем ли мы отправить cd ... (путь) и затем команду, которую я хочу выполнить, одновременно используя PowerShell. Если приведенный выше случай возможен, мой способ передачи аргументов правильный или нет?

Мой код:

$somefile = "C:\ProgramFiles\site.txt"     

$createdbs = "C:\PowerShell\createDBsQuery"

Start-Process cmd.exe -Args '/c cd C:\ProgramFiles\Infor\Tools',$createdbs -RedirectStandardOutput $somefile

Ответы [ 4 ]

1 голос
/ 24 марта 2020

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 закрывается (слишком) быстро из-за ошибки, чтобы увидеть, что выводится там.

1 голос
/ 24 марта 2020

В вашем CMD введите «PowerShell». Это должно перенаправить вас в новейшую версию Windows PowerShell. Это может быть до версии 5.1. Если у вас уже установлено NET Core, вы можете ввести «Pw sh». Это введет вас в более новую версию PowerShell, т.е. 6.2. Ваше приглашение также должно иметь префикс «PS [...]>».

0 голосов
/ 24 марта 2020

Вы можете создать файл сценария powershell .ps1 со всеми необходимыми параметрами и вызвать его из CMD, например, как показано ниже.

powershell -command "&{"C:\temp\script.ps1"}"
0 голосов
/ 24 марта 2020

Если действительно необходимо запустить cmd, уже используя PowerShell, это послужит вашей цели:

$somefile = "C:\ProgramFiles\site.txt"     

$createdbs = "C:\PowerShell\createDBsQuery"

Start-Process cmd.exe -ArgumentList "/c cd C:\ProgramFiles\Infor\Tools & $createdbs" -RedirectStandardOutput $somefile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...