Exécution de la commande CMD dans PowerShell


87

J'ai de nombreux problèmes pour exécuter une commande PowerShell. Tout ce qu'il fait, c'est exécuter une commande qui serait exécutée dans une fenêtre d'invite CMD.

Voici la commande:

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

J'ai essayé ce qui suit sans succès (j'ai essayé de nombreuses itérations pour essayer d'en obtenir une qui fonctionne. La syntaxe est probablement foutue):

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

La commande ouvrira simplement la fenêtre de connexion à distance SCCM à l'ordinateur spécifié par l'utilisateur dans la zone de texte.


Je ne sais pas quelle version de SCCM vous utilisez, mais 07 nécessite un "-1", mais 2012 ne le fait pas lors du lancement de CmRcViewer. Juste un FYI.
Kevin_

Réponses:


101

Essaye ça:

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

Pour PowerShell, une chaîne "..." est simplement une chaîne et PowerShell l'évalue en la renvoyant à l'écran. Pour que PowerShell exécute la commande dont le nom est dans une chaîne, vous utilisez l'opérateur d'appel &.


Génial, cela a fonctionné. Cela devrait-il fonctionner pour la plupart des commandes cmd?
user3585839

4
Oui, mais ce n'est pas nécessaire pour les ex qui n'ont pas d'espace dans leur nom ou leur chemin. Par exemple, vous pouvez exécuter ipconfig.exesans avoir à utiliser &. Le seul moment où vous devez utiliser &est d'appeler un nom de commande sous forme de chaîne. Et vous devez utiliser «forme de chaîne» lorsqu'il y a un espace dans le chemin ou le nom de fichier.
Keith Hill

17
J'ajouterais que cela ne fonctionnera pas de construire une chaîne de ligne de commande et d'essayer de l'exécuter avec &, car PowerShell pensera que la chaîne entière est le nom de l'exécutable. Au lieu de cela, ne citez que le nom de l'exécutable et mettez ensuite les paramètres de l'exécutable.
Bill_Stewart

Quelle est la différence entre &et cmd?
Timo

1
&est l'opérateur d'appel PowerShell (aka invocation). Il vous permet d'exécuter une commande lorsque vous disposez d'une chaîne contenant soit le nom de la commande, soit le chemin vers l'exe. Vous pouvez également spécifier un scriptblock par exemple &{$foo=42}ou un objet CommandIno par exemple $cmd = Get-Command Get-Date; &$cmd. cmdest une coquille différente. Notez que &s'exécute dans une portée enfant, vous noterez donc qu'après la fin du scriptblock défini $fooci-dessus, il $foon'est plus défini.
Keith Hill

55

Pour exécuter ou convertir des fichiers batch en externe à partir de PowerShell (en particulier si vous souhaitez signer tous vos scripts de tâches planifiées avec un certificat), je crée simplement un script PowerShell, par exemple deletefolders.ps1.

Saisissez les éléments suivants dans le 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"

* Chaque commande doit être placée sur une nouvelle ligne en appelant à nouveau cmd.exe.

Ce script peut maintenant être signé et exécuté à partir de PowerShell en envoyant les commandes à l'invite de commande / cmddirectement.

C'est un moyen beaucoup plus sûr que d'exécuter des fichiers batch!


Cela a très bien fonctionné pour moi. J'essayais de courir: à sc query serviceNamepartir de PowerShell en pensant qu'il s'exécuterait, mais pas de sortie. J'ai essayé plusieurs itérations de la technique &, pas de dés. Mais l'exécuter comme vous l'avez recommandé a fonctionné. Ensuite, j'ai frappé cmd.exe /? pour voir quelles autres merveilles m'attendaient. Je n'aime exécuter cmd qu'en cas de besoin.
Paul Masek le

9

Une solution serait de diriger votre commande de PowerShell vers CMD. L'exécution de la commande suivante dirigera la notepad.execommande vers CMD, qui ouvrira ensuite l'application Bloc-notes.

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

Une fois la commande exécutée dans CMD, vous serez renvoyé à une invite PowerShell et pourrez continuer à exécuter votre script PowerShell.


Modifications

Le message de démarrage de CMD est affiché

Comme le souligne mklement0 , cette méthode affiche le message de démarrage de CMD. Si vous copiez la sortie en utilisant la méthode ci-dessus dans un autre terminal, le message de démarrage sera copié avec lui.


Cela peut fonctionner même si ce &n'est pas le cas. Par exemple, & "mklink"je n'ai pas travaillé pour moi pendant que je "mklink" | cmdtravaillais
moudrick

2

Pour ceux qui peuvent avoir besoin de ces informations:

J'ai compris que vous pouvez à peu près exécuter une commande qui se trouve dans votre PATHscript PS, et cela devrait fonctionner.

Parfois, vous devrez peut-être pré-lancer cette commande avec cmd.exe /c

Exemples

Appeler git depuis un script PS

J'ai dû reconditionner un gitclient enveloppé Chocolatey(pour ceux qui ne le savent peut-être pas, c'est une sorte d'app-store pour Windows) qui utilise massivement des scripts PS.

J'ai découvert que, une fois gitdans le PATH, des commandes comme

$ca_bundle = git config --get http.sslCAInfo

stockera l'emplacement du git crtfichier dans la $ca_bundlevariable.

Recherche d'une application

Un autre exemple qui est une combinaison du poste SO actuel et de ce poste SO est l'utilisation de la wherecommande

$java_exe = cmd.exe /c where java

stockera l'emplacement du java.exefichier dans la $java_exevariable.


1
Il vous suffit cmd /cd'appeler ses commandes internes , telles que mklink. En revanche, where.exeest un programme externe, vous pouvez donc l'invoquer directement. Cependant, en raison d'un conflit de nom avec l' wherealias intégré de PowerShell (pour Where-Object), vous devez utiliser where.exe; par exemple where.exe java.
mklement0

Ou simplement utiliser PowerShell au Get-Commandlieu d'appeler cmd? Idem avant:$java_exe = $(Get-Command java.exe).Source
dtasev

-1

Vous devez utiliser l'applet de commande Invoke-Command pour lancer ce programme externe. Normalement, cela fonctionne sans effort.

Si vous avez besoin de plusieurs commandes, vous devez utiliser la cmdlet Invoke-Expression avec l' -scriptblockoption.


1
Invoke-Command n'est pas nécessaire dans ce cas (voir la réponse de Keith Hill).
Bill_Stewart

Oui, je suis d'accord avec ça. Je pensais plus à une solution de script.
Tim Christin

4
Peu importe que la commande soit exécutée à partir d'un script ou non. Il n'est toujours pas nécessaire d'utiliser Invoke-Command dans ce cas.
Bill_Stewart


Veuillez ne pas fournir de "réponses" sans exemple
AX
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.