Esecuzione del comando CMD in PowerShell


87

Sto riscontrando un sacco di problemi con l'esecuzione di un comando PowerShell. Tutto ciò che sta facendo è eseguire un comando che verrebbe eseguito in una finestra del prompt di CMD.

Ecco il comando:

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

Ho provato quanto segue senza successo (ho provato molte iterazioni di questo per provare a ottenerne uno che funzioni. La sintassi è probabilmente tutta sbagliata):

$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)

Il comando aprirà semplicemente la finestra di connessione remota SCCM al computer specificato dall'utente nella casella di testo.


Non sono sicuro della versione di SCCM che stai utilizzando, ma 07 richiede un "-1", ma il 2012 non lo fa quando si avvia CmRcViewer. Solo un FYI.
Kevin_

Risposte:


102

Prova questo:

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

Per PowerShell una stringa "..." è solo una stringa e PowerShell la valuta facendola eco sullo schermo. Per fare in modo che PowerShell esegua il comando il cui nome è in una stringa, utilizzare l'operatore di chiamata &.


Fantastico, ha funzionato. Dovrebbe funzionare per la maggior parte dei comandi cmd?
user3585839

4
Sì, ma non è necessario per gli ex che non hanno uno spazio nel nome o nel percorso. Ad esempio, puoi eseguire ipconfig.exesenza dover usare &. L'unica volta che devi usare &è invocare un nome di comando sotto forma di stringa. E devi usare "forma stringa" quando c'è uno spazio nel percorso o nel nome del file.
Keith Hill

17
Aggiungerei che non funzionerà per costruire una stringa della riga di comando e provare a eseguire con &, perché PowerShell penserà che l'intera stringa sia il nome dell'eseguibile. Cita invece solo il nome dell'eseguibile e inserisci i parametri dell'eseguibile in seguito.
Bill_Stewart

Qual è la differenza tra &e cmd?
Timo

1
&è l'operatore di chiamata di PowerShell (noto anche come invocazione). Ti consente di eseguire un comando quando ciò che hai è una stringa che contiene il nome del comando o il percorso dell'exe. È inoltre possibile specificare un blocco di script, ad esempio, &{$foo=42}o un oggetto CommandIno, ad esempio $cmd = Get-Command Get-Date; &$cmd. cmdè una shell diversa. Si noti che &viene eseguito in uno scope figlio, quindi si noterà che dopo che il blocco di script impostato $foosopra termina, $foonon viene più impostato.
Keith Hill

56

Per eseguire o convertire file batch esternamente da PowerShell (in particolare se si desidera firmare tutti gli script delle attività pianificate con un certificato), creo semplicemente uno script PowerShell, ad esempio deletefolders.ps1.

Immettere quanto segue nello script:

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"

* Ogni comando deve essere inserito su una nuova riga chiamando di nuovo cmd.exe.

Questo script può ora essere firmato ed eseguito da PowerShell inviando i comandi al prompt dei comandi / cmddirettamente.

È un modo molto più sicuro rispetto all'esecuzione di file batch!


Questo ha funzionato benissimo per me. Stavo cercando di eseguire: sc query serviceNameda PowerShell pensando che sarebbe stato eseguito, ma nessun output. Ho provato diverse iterazioni della tecnica &, senza dadi. Ma eseguirlo nel modo consigliato ha funzionato. Successivamente ho premuto cmd.exe /? per vedere quali altre meraviglie mi aspettavano. Mi piace solo eseguire cmd quando necessario.
Paul Masek

9

Una soluzione potrebbe essere quella di inviare il comando da PowerShell a CMD. L'esecuzione del seguente comando invierà il notepad.execomando a CMD, che aprirà quindi l'applicazione Blocco note.

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

Una volta che il comando è stato eseguito in CMD, verrai reindirizzato a un prompt di PowerShell e potrai continuare a eseguire lo script di PowerShell.


Modifiche

Viene visualizzato il messaggio di avvio di CMD

Come sottolinea mklement0 , questo metodo mostra il messaggio di avvio di CMD. Se dovessi copiare l'output usando il metodo sopra in un altro terminale, il messaggio di avvio verrà copiato insieme ad esso.


Può funzionare anche quando &non lo fa. Ad esempio, & "mklink"non ha funzionato per me mentre "mklink" | cmdlavoravo
moudrick

2

Per coloro che potrebbero aver bisogno di queste informazioni:

Ho capito che puoi praticamente eseguire un comando che è nel tuo PATHda uno script PS, e dovrebbe funzionare.

A volte potresti dover pre-lanciare questo comando con cmd.exe /c

Esempi

Chiamare git da uno script PS

Ho dovuto riconfezionare un gitclient avvolto in Chocolatey(per coloro che potrebbero non saperlo, è una specie di app store per Windows) che utilizza in modo massiccio gli script PS.

Ho scoperto che, una volta che gitè in PATH, comandi come

$ca_bundle = git config --get http.sslCAInfo

memorizzerà la posizione del git crtfile nella $ca_bundlevariabile.

Alla ricerca di un'app

Un altro esempio che è una combinazione del presente post SO e questo post SO è l'uso del wherecomando

$java_exe = cmd.exe /c where java

memorizzerà la posizione del java.exefile nella $java_exevariabile.


1
Hai solo bisogno cmd /cdi invocare i suoi comandi interni , come mklink. Al contrario, where.exeè un programma esterno, quindi puoi richiamarlo direttamente. Tuttavia, a causa di un conflitto di nomi con l' wherealias predefinito di PowerShell (per Where-Object), è necessario utilizzare where.exe; es where.exe java.
mklement0

O semplicemente usare PowerShell Get-Commandinvece di chiamare cmd? Come prima:$java_exe = $(Get-Command java.exe).Source
dtasev

-1

È necessario utilizzare il cmdlet Invoke-Command per avviare questo programma esterno. Normalmente funziona senza sforzo.

Se è necessario più di un comando, utilizzare il cmdlet Invoke-Expression con l' -scriptblockopzione.


1
Invoke-Command non è necessario in questo caso (vedi la risposta di Keith Hill).
Bill_Stewart

Sì, sono d'accordo con quello. Stavo pensando di più alla soluzione di scripting.
Tim Christin

4
Non importa se il comando viene eseguito da uno script o meno. Non è ancora necessario utilizzare Invoke-Command in questo caso.
Bill_Stewart


Si prega di non fornire "risposte" senza esempi
AX
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.