Запуск команды CMD в PowerShell

87

У меня много проблем с запуском команды PowerShell. Все, что он делает, это запускает команду, которая запускается в окне командной строки CMD.

Вот команда:

"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

Я безуспешно пробовал следующее (я пробовал много итераций этого, чтобы попытаться получить тот, который работает. Синтаксис, вероятно, весь испорчен):

$TEXT = $textbox.Text #$textbox is where the user enters the PC name.
$CMDCOMMAND = "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"
Start-Process '"$CMDCOMMAND" $TEXT'
#iex -Command ('"C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe"' $TEXT)

Команда просто откроет окно удаленного подключения SCCM к компьютеру, указанному пользователем в текстовом поле.

пользователь3585839
источник
Я не уверен, какую версию SCCM вы используете, но 07 требует «-1», а 2012 не требует при запуске CmRcViewer. Просто к вашему сведению.
Kevin_

Ответы:

101

Попробуй это:

& "C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\bin\i386\CmRcViewer.exe" PCNAME

Для PowerShell строка «...» - это просто строка, и PowerShell оценивает ее, отображая ее на экране. Чтобы заставить PowerShell выполнить команду, имя которой указано в строке, вы используете оператор вызова &.

Кейт Хилл
источник
Круто, это сработало. Должно ли это работать для большинства команд cmd?
user3585839
4
Да, но это не обязательно для бывших, у которых нет пробела в имени или пути. Например, вы можете выполнить ipconfig.exeбез использования &. Единственный раз, когда вам нужно использовать, &- это вызвать имя команды в строковой форме. И вы должны использовать «строковую форму», когда в пути или имени файла есть пробел.
Keith Hill
17
Я бы добавил, что не получится создать строку командной строки и попытаться выполнить ее с помощью &, потому что PowerShell будет думать, что вся строка является именем исполняемого файла. Вместо этого укажите только имя исполняемого файла и затем укажите параметры исполняемого файла.
Bill_Stewart
В чем разница между &и cmd?
Тимо
1
&- это оператор вызова (или вызова) PowerShell. Это позволяет вам выполнять команду, когда у вас есть строка, содержащая либо имя команды, либо путь к exe. Вы также можете указать блок сценария, например, &{$foo=42}или объект CommandIno, например $cmd = Get-Command Get-Date; &$cmd. cmdэто другая оболочка. Обратите внимание, что &выполняется в дочерней области, поэтому вы заметите, что после завершения установленного $fooвыше блока сценария он $fooбольше не устанавливается.
Кейт Хилл
55

Чтобы запускать или преобразовывать командные файлы извне из PowerShell (особенно если вы хотите подписать все свои сценарии запланированных задач сертификатом), я просто создаю сценарий PowerShell, например deletefolders.ps1.

Введите в скрипт следующее:

cmd.exe /c "rd /s /q C:\#TEMP\test1"

cmd.exe /c "rd /s /q C:\#TEMP\test2"

cmd.exe /c "rd /s /q C:\#TEMP\test3"

* Каждую команду нужно помещать в новую строку, снова вызывая cmd.exe.

Теперь этот сценарий можно подписать и запустить из PowerShell, выводя команды cmdнапрямую в командную строку .

Это намного безопаснее, чем запуск командных файлов!

Арманд Г.
источник
Это отлично сработало для меня. Я пытался запустить: sc query serviceNameиз PowerShell думал, что он выполнится, но без вывода. Я пробовал несколько итераций техники &, без кубиков. Но запускать его так, как вы рекомендовали, сработало. Затем я нажимаю cmd.exe /? чтобы увидеть, какие еще чудеса меня ожидали. Мне нравится запускать cmd только при необходимости.
Пол Масек,
9

Одним из решений было бы трубы ваша команда из PowerShell для CMD. Выполнение следующей команды направит notepad.exeкоманду в CMD, который затем откроет приложение «Блокнот».

PS C:\> "notepad.exe" | cmd

После выполнения команды в CMD вы вернетесь в командную строку PowerShell и сможете продолжить выполнение сценария PowerShell.


Правки

Отображается стартовое сообщение CMD

Как указывает mklement0 , этот метод показывает стартовое сообщение CMD. Если вы должны были скопировать вывод, используя описанный выше метод, в другой терминал, сообщение о запуске будет скопировано вместе с ним.

Reelyard
источник
Он может работать, даже если &нет. Например & "mklink", у меня не "mklink" | cmdработал, пока работал
moudrick
2

Для тех, кому может понадобиться эта информация:

Я понял, что вы можете в значительной степени запустить команду PATHиз сценария PS, и она должна работать.

Иногда вам может потребоваться предварительно запустить эту команду с помощью cmd.exe /c

Примеры

Вызов git из сценария PS

Пришлось переупаковывать gitзавернутый клиент Chocolatey(для тех, кто не знает, это своего рода магазин приложений для Windows), который массово использует сценарии PS.

Я обнаружил, что когда-то gitв PATH, такие команды, как

$ca_bundle = git config --get http.sslCAInfo

сохранит расположение git crtфайла в $ca_bundleпеременной.

Ищу приложение

Другой пример, который представляет собой комбинацию настоящего сообщения SO и этого сообщения SO, - это использование whereкоманды

$java_exe = cmd.exe /c where java

сохранит расположение java.exeфайла в $java_exeпеременной.

avi.elkharrat
источник
1
Вам нужно только cmd /cвызвать его внутренние команды, такие как mklink. Напротив, where.exeэто внешняя программа, поэтому вы можете вызывать ее напрямую. Однако из-за конфликта имени со встроенным whereпсевдонимом PowerShell (for Where-Object) вы должны использовать where.exe; например, where.exe java.
mklement0
Или просто использовать PowerShell Get-Commandвместо вызова cmd? То же, что и раньше:$java_exe = $(Get-Command java.exe).Source
dtasev 03
-1

Для запуска этой внешней программы необходимо использовать командлет Invoke-Command. Обычно работает без усилий.

Если вам нужно более одной команды, вы должны использовать командлет Invoke-Expression с -scriptblockопцией.

Тим Кристин
источник
1
Invoke-Command в этом случае не требуется (см. Ответ Кейта Хилла).
Bill_Stewart
Да, я согласен с этим. Я больше думал о скриптовом решении.
Тим Кристин
4
Неважно, запускается команда из сценария или нет. В этом случае по-прежнему нет необходимости использовать Invoke-Command.
Bill_Stewart
Кроме того, следует избегать Invoke-Expression
mklement0
Пожалуйста, не предоставляйте «ответы» без примера
AX