Ich kann meine Notwendigkeit mit dem folgenden Szenario ausdrücken: Schreiben Sie eine Funktion, die eine Zeichenfolge akzeptiert, die als nativer Befehl ausgeführt werden soll.
Eine Idee ist nicht allzu weit hergeholt: Wenn Sie mit anderen Befehlszeilenprogrammen von anderen Stellen im Unternehmen zusammenarbeiten, die Ihnen einen Befehl zum wörtlichen Ausführen liefern. Da Sie den Befehl nicht steuern, müssen Sie einen gültigen Befehl als Eingabe akzeptieren . Dies sind die Hauptprobleme, die ich nicht leicht überwinden konnte:
Der Befehl kann ein Programm ausführen, das in einem Pfad mit einem Leerzeichen darin lebt:
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';
Der Befehl kann Parameter mit Leerzeichen enthalten:
$command = 'echo "hello world!"';
Der Befehl kann sowohl einfache als auch doppelte Häkchen haben:
$command = "echo `"it`'s`"";
Gibt es einen sauberen Weg, dies zu erreichen? Ich war nur in der Lage, aufwändige und hässliche Problemumgehungen zu entwickeln, aber für eine Skriptsprache sollte dies meiner Meinung nach kinderleicht sein.
quelle
eval
Dinge sind halb im Scherz, weil es in so vielen anderen Skriptsprachen so heißt, und dies ist nicht die erste Frage, die ich gesehen habe, von der jemand keine Ahnung hatteinvoke-expression
. Und der Fall des OP klingt nur nach einem internen Skript.Invoke-Expression "& $command"
In diesem Microsoft Connect-Bericht erfahren Sie im Wesentlichen, wie schwierig es ist, PowerShell zum Ausführen von Shell-Befehlen zu verwenden (oh, die Ironie).
http://connect.microsoft.com/PowerShell/feedback/details/376207/
Sie schlagen vor,
--%
PowerShell zu zwingen, nicht mehr zu versuchen, den Text rechts zu interpretieren.Beispielsweise:
quelle
Die akzeptierte Antwort funktionierte bei mir nicht, als ich versuchte, die Registrierung auf Deinstallationszeichenfolgen zu analysieren und auszuführen. Es stellte sich heraus, dass ich den Anruf doch nicht brauchte
Invoke-Expression
.Endlich bin ich auf diese nette Vorlage gestoßen, um zu sehen, wie man Deinstallationszeichenfolgen ausführt:
Dies funktioniert für mich, weil
$app
es sich um eine interne Anwendung handelt, von der ich weiß, dass sie nur zwei Argumente hat. Für komplexere Deinstallationszeichenfolgen möchten Sie möglicherweise den Join-Operator verwenden . Außerdem habe ich gerade eine Hash-Map verwendet, aber eigentlich möchten Sie wahrscheinlich ein Array verwenden.Wenn Sie mehrere Versionen derselben Anwendung installiert haben, durchläuft dieses Deinstallationsprogramm alle auf einmal, was verwirrend
MsiExec.exe
ist.quelle
Wenn Sie den Aufrufoperator verwenden möchten, können die Argumente ein Array sein, das in einer Variablen gespeichert ist:
Der Aufrufoperator arbeitet auch mit ApplicationInfo-Objekten.
quelle