Запуск команди 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 до комп'ютера, вказаного користувачем у текстовому полі.


Я не впевнений, яку версію SCCM ви використовуєте, але 07 вимагає "-1", але 2012 не запускає CmRcViewer. Просто FYI.
Kevin_

Відповіді:


101

Спробуйте це:

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

Для PowerShell рядок "..." - це просто рядок, і PowerShell обчислює його, переносячи його на екран. Щоб отримати PowerShell для виконання команди, ім'я якої є в рядку, ви використовуєте оператор виклику &.


Чудово, це спрацювало. Чи це має працювати для більшості команд cmd?
user3585839

4
Так, але це не потрібно для колишніх, які не мають пробілу в своєму імені чи шляху. Наприклад, ви можете виконувати ipconfig.exeбез необхідності використання &. Єдиний раз, який вам потрібно використовувати, &це викликати ім'я команди у формі рядка. І ви повинні використовувати "рядок", коли в шляху або назві файлу є пробіл.
Кіт Хілл

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. Якщо ви хотіли скопіювати вихідні дані за допомогою методу, наведеного вище, в інший термінал, разом із ним буде скопійовано повідомлення про запуск.


Це може працювати навіть тоді, коли &ні. Наприклад & "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змінній.


1
Вам потрібно лише cmd /cвикликати його внутрішні команди, такі як mklink. Навпаки, where.exeце зовнішня програма, тому ви можете викликати її безпосередньо. Однак через конфлікт імен із вбудованим whereпсевдонімом PowerShell (дляWhere-Object ) ви повинні використовувати where.exe; наприклад, where.exe java.
mklement0

Або просто використовувати PowerShell Get-Commandзамість дзвінків cmd? Так само, як і раніше:$java_exe = $(Get-Command java.exe).Source
dtasev

-1

Для запуску цієї зовнішньої програми потрібно використовувати командлет Invoke-Command. Зазвичай це працює без зусиль.

Якщо вам потрібно більше однієї команди, вам слід скористатися командлетом Invoke-Expression із -scriptblockопцією.


1
У цьому випадку команда Invoke-Command не потрібна (див. Відповідь Кіта Хілла).
Bill_Stewart

Так, я з цим згоден. Я більше думав про рішення сценаріїв.
Тім Крістін

4
Не має значення, запускається команда із сценарію чи ні. У цьому випадку не потрібно використовувати Invoke-Command.
Bill_Stewart


Будь ласка, не вказуйте "відповіді" без жодного прикладу
AX
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.