Ausführen des CMD-Befehls in PowerShell

85

Ich habe einige Probleme damit, einen PowerShell-Befehl auszuführen. Es wird lediglich ein Befehl ausgeführt, der in einem CMD-Eingabeaufforderungsfenster ausgeführt wird.

Hier ist der Befehl:

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

Ich habe Folgendes ohne Erfolg versucht (ich habe viele Iterationen davon versucht, um eine zu erhalten, die funktioniert. Die Syntax ist wahrscheinlich völlig durcheinander):

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

Der Befehl öffnet nur das SCCM-Remoteverbindungsfenster für den Computer, den der Benutzer im Textfeld angibt.

user3585839
quelle
Ich bin nicht sicher, welche Version von SCCM Sie verwenden, aber 07 erfordert ein "-1", 2012 jedoch nicht, wenn CmRcViewer gestartet wird. Nur zu Ihrer Information.
Kevin_

Antworten:

100

Versuche dies:

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

Für PowerShell ist eine Zeichenfolge "..." nur eine Zeichenfolge, und PowerShell wertet sie aus, indem sie sie auf dem Bildschirm wiedergibt. Um PowerShell zu veranlassen, den Befehl auszuführen, dessen Name in einer Zeichenfolge enthalten ist, verwenden Sie den Aufrufoperator &.

Keith Hill
quelle
Super, das hat funktioniert. Sollte das für die meisten cmd-Befehle funktionieren?
user3585839
4
Ja, aber es ist nicht erforderlich für Exes, deren Name oder Pfad kein Leerzeichen enthält. Zum Beispiel können Sie ausführen, ipconfig.exeohne verwenden zu müssen &. Sie müssen nur &einen Befehlsnamen in Zeichenfolgenform aufrufen. Und Sie müssen "Zeichenfolgenform" verwenden, wenn der Pfad oder Dateiname ein Leerzeichen enthält.
Keith Hill
17
Ich würde hinzufügen, dass es nicht funktioniert, eine Befehlszeilenzeichenfolge zu erstellen und zu versuchen, sie auszuführen &, da PowerShell glaubt, dass die gesamte Zeichenfolge der Name der ausführbaren Datei ist. Zitieren Sie stattdessen nur den Namen der ausführbaren Datei und geben Sie anschließend die Parameter der ausführbaren Datei ein.
Bill_Stewart
Was ist der Unterschied zwischen &und cmd?
Timo
1
&ist der PowerShell-Aufrufoperator (auch als Aufrufoperator bezeichnet). Sie können einen Befehl ausführen, wenn Sie eine Zeichenfolge haben, die entweder den Namen des Befehls oder den Pfad zur Exe enthält. Sie können auch einen Skriptblock &{$foo=42}oder ein CommandIno-Objekt angeben, z $cmd = Get-Command Get-Date; &$cmd. cmdist eine andere Schale. Beachten &Sie, dass die Ausführung in einem untergeordneten Bereich ausgeführt wird. Sie werden also feststellen, dass der oben festgelegte Skriptblock nach $fooAbschluss $foonicht mehr festgelegt wird.
Keith Hill
55

Um Batchdateien extern von PowerShell auszuführen oder zu konvertieren (insbesondere, wenn Sie alle geplanten Aufgabenskripte mit einem Zertifikat signieren möchten), erstelle ich einfach ein PowerShell-Skript, z. B. deletefolders.ps1.

Geben Sie Folgendes in das Skript ein:

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"

* Jeder Befehl muss erneut in eine neue Zeile mit dem Aufruf cmd.exe eingefügt werden.

Dieses Skript kann jetzt signiert und von PowerShell ausgeführt werden, wobei die Befehle an die Eingabeaufforderung / cmddirekt ausgegeben werden.

Es ist viel sicherer als das Ausführen von Batch-Dateien!

Armand G.
quelle
Das hat bei mir super funktioniert. Ich habe versucht zu laufen: sc query serviceNamevon PowerShell dachte, es würde ausgeführt, aber keine Ausgabe. Ich habe mehrere Iterationen der & Technik ausprobiert, keine Würfel. Aber es so zu betreiben, wie Sie es empfohlen haben, hat funktioniert. Als nächstes drücke ich cmd.exe /? um zu sehen, welche anderen Wunder mich erwarteten. Ich mag es, cmd nur bei Bedarf auszuführen.
Paul Masek
9

Eine Lösung wäre, Rohr Ihr Befehl von Powershell CMD. Durch Ausführen des folgenden Befehls wird der notepad.exeBefehl an CMD weitergeleitet, wodurch die Notepad-Anwendung geöffnet wird.

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

Sobald der Befehl in CMD ausgeführt wurde, kehren Sie zu einer PowerShell-Eingabeaufforderung zurück und können Ihr PowerShell-Skript weiter ausführen.


Bearbeitungen

Die Startmeldung von CMD wird angezeigt

Wie mklement0 hervorhebt , zeigt diese Methode die Startnachricht von CMD an. Wenn Sie die Ausgabe mit der oben beschriebenen Methode in ein anderes Terminal kopieren, wird die Startnachricht zusammen mit dieser kopiert.

reelyard
quelle
Es kann auch dann funktionieren, wenn &dies nicht der Fall ist. ZB & "mklink"hat bei mir nicht gearbeitet während der "mklink" | cmdArbeit
Moudrick
2

Für diejenigen, die diese Informationen benötigen:

Ich habe herausgefunden, dass Sie einen Befehl, der in Ihrem PATHPS-Skript enthalten ist , so ziemlich ausführen können , und er sollte funktionieren.

Manchmal müssen Sie diesen Befehl mit vorab starten cmd.exe /c

Beispiele

Aufruf von git aus einem PS-Skript

Ich musste einen giteingepackten Client neu verpacken Chocolatey(für diejenigen, die es vielleicht nicht wissen, ist es eine Art App-Store für Windows), der massiv PS-Skripte verwendet.

Ich fand heraus, dass, sobald gitin der PATH, Befehle wie

$ca_bundle = git config --get http.sslCAInfo

speichert den Speicherort der git crtDatei in einer $ca_bundleVariablen.

Auf der Suche nach einer App

Ein weiteres Beispiel, das eine Kombination aus dem vorliegenden SO-Beitrag und diesem SO-Beitrag darstellt, ist die Verwendung eines whereBefehls

$java_exe = cmd.exe /c where java

speichert den Speicherort der java.exeDatei in einer $java_exeVariablen.

avi.elkharrat
quelle
1
Sie müssen nur die internen Befehle cmd /caufrufen , z . Im Gegensatz dazu handelt es sich um ein externes Programm, sodass Sie es direkt aufrufen können. Aufgrund eines Namenskonflikts mit dem in PowerShell integrierten Alias ​​(für ) müssen Sie jedoch Folgendes verwenden : zB , . mklinkwhere.exewhereWhere-Objectwhere.exewhere.exe java
mklement0
Oder verwenden Sie einfach PowerShell's, Get-Commandanstatt anzurufen cmd? Gleich wie zuvor:$java_exe = $(Get-Command java.exe).Source
dtasev
-1

Sie müssen das Cmdlet Invoke-Command verwenden, um dieses externe Programm zu starten. Normalerweise funktioniert es ohne Anstrengung.

Wenn Sie mehr als einen Befehl benötigen, sollten Sie das Cmdlet Invoke-Expression mit der -scriptblockOption verwenden.

Tim Christin
quelle
1
Invoke-Command wird in diesem Fall nicht benötigt (siehe Keith Hills Antwort).
Bill_Stewart
Ja, dem stimme ich zu. Ich habe mehr über Skriptlösungen nachgedacht.
Tim Christin
4
Es spielt keine Rolle, ob der Befehl über ein Skript ausgeführt wird oder nicht. In diesem Fall ist es immer noch nicht erforderlich, Invoke-Command zu verwenden.
Bill_Stewart
Zusätzlich sollte Invoke-Expression vermieden werden
mklement0
Bitte geben Sie keine "Antworten" ohne Beispiel an
AX