Wie führen Sie den folgenden Befehl in PowerShell aus?
C: \ Programme \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql = "Datenquelle = mysource; Integrierte Sicherheit = false; Benutzer-ID = sa; Pwd = sapass !; Database = mydb;" -dest: dbfullsql = "Datenquelle =. \ mydestsource; Integrierte Sicherheit = false; Benutzer-ID = sa; Pwd = sapass !; Datenbank = mydb;", Computername = 10.10.10.10, Benutzername = Administrator, Kennwort = Administratorpass "
# Show any available updates to globally installed npm packages using the npm-check-updates tool [string] $cmd = 'ncu -g' Write-Verbose -Message $cmd Invoke-Command -ScriptBlock ([ScriptBlock]::Create($cmd))
Antworten:
Wenn PowerShell einen Befehl sieht, der mit einer Zeichenfolge beginnt, wertet es nur die Zeichenfolge aus, dh, es wird normalerweise auf dem Bildschirm angezeigt, z. B.:
Wenn PowerShell die Zeichenfolge als Befehlsnamen interpretieren soll, verwenden Sie den Aufrufoperator (&) wie folgt:
Danach müssen Sie wahrscheinlich nur noch Parameter / Argument-Paare in Anführungszeichen setzen, die Leerzeichen und / oder Anführungszeichen enthalten. Wenn Sie eine solche EXE-Datei mit komplexen Befehlszeilenargumenten aufrufen, ist es normalerweise sehr hilfreich, ein Tool zu haben, das Ihnen zeigt, wie PowerShell die Argumente an die EXE-Datei sendet. Die PowerShell Community Extensions verfügen über ein solches Tool. Es heißt Echoargs. Sie ersetzen einfach die EXE-Datei durch Echoargs, lassen alle Argumente an Ort und Stelle und zeigen Ihnen, wie die EXE-Datei die Argumente empfängt, zum Beispiel:
Mit Echoargs können Sie experimentieren, bis Sie es richtig verstanden haben, zum Beispiel:
Es stellte sich heraus, dass ich mich zuvor zu sehr bemüht hatte, die doppelten Anführungszeichen um die Verbindungszeichenfolge beizubehalten. Anscheinend ist das nicht notwendig, weil sogar cmd.exe diese entfernen wird.
Übrigens, Hut ab vor dem PowerShell-Team. Sie waren sehr hilfreich, um mir die spezifische Beschwörung von einfachen und doppelten Anführungszeichen zu zeigen, um das gewünschte Ergebnis zu erzielen - wenn Sie die internen doppelten Anführungszeichen beibehalten müssen. :-) Sie erkennen auch, dass dies ein Schmerzbereich ist, aber sie werden von der Anzahl der Menschen bestimmt, die von einem bestimmten Problem betroffen sind. Wenn dies ein Schmerzbereich für Sie ist, stimmen Sie diese PowerShell-Fehlerübermittlung ab .
Weitere Informationen zum Parsen von PowerShell finden Sie in meiner Effective PowerShell-Blogserie - insbesondere in Punkt 10 - "Grundlegendes zu PowerShell-Parsing-Modi".
UPDATE 04.04.2012: Diese Situation wird in PowerShell V3 viel einfacher zu handhaben. Weitere Informationen finden Sie in diesem Blogbeitrag .
quelle
echoargs
gibt die Verwendung einen Hinweis darauf, wie PowerShell die Argumente interpretiert, bevor sie an die EXE-Datei übergeben werden.& 'C:\Program Files\Sublime Text 3\sublime_text.exe'
direkt in der Konsole und es funktioniert, aber in einer Batch-Datei wird die Fehlermeldung "& war zu diesem Zeitpunkt unerwartet" angezeigt.START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Fügen Sie einfach den Operator & vor dem EXE-Namen hinzu. Hier ist ein Befehl zum Installieren von SQL Server Express im Stummschaltungsmodus:
quelle
Ich hatte Leerzeichen sowohl im Befehl als auch in den Parametern, und das hat bei mir funktioniert:
Es ist im Grunde dasselbe wie Akiras Antwort, aber dies funktioniert, wenn Sie Ihre Befehlsparameter dynamisch erstellen und in eine Variable einfügen.
quelle
EchoArgs
Das hat bei mir funktioniert:
Fügen Sie einfach Pfade oder Verbindungszeichenfolgen in ein Array-Element ein und teilen Sie die anderen Elemente in jeweils ein Array-Element auf.
Hier gibt es viele andere Optionen: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx
Microsoft sollte dies einfacher und kompatibler mit der Syntax der Eingabeaufforderung machen.
quelle
Es gibt einige Methoden, mit denen Sie dies tun können.
Methode 1
Ein einfaches Beispiel
In Ihrem Fall
Bei dieser Methode trennen Sie jeden Parameter in der ArgumentList durch Kommas.
Methode 2
Einfaches Beispiel
In Ihrem Fall
Diese Methode ist einfacher, da Sie Ihre Parameter auf einmal eingeben können.
Referenzen: Powershell / Scripting / Start-Prozess
quelle
Siehe diese Seite: https://slai.github.io/posts/powershell-and-external-commands-done-right/
Zusammenfassung mit vshadow als externe ausführbare Datei:
quelle
Falls sich jemand fragt, wie man einfach eine ausführbare Datei ausführt:
.....>. \ file.exe
oder
......> vollständiger \ Pfad \ zu \ file.exe
quelle
Ich konnte meinen ähnlichen Befehl mit dem folgenden Ansatz zum Laufen bringen:
Für Ihren Befehl (nicht, dass es jetzt viel hilft) würden die Dinge ungefähr so aussehen:
Die wichtigsten Punkte sind:
Ich habe nicht versucht, den Teil "Computername" am Ende der Befehlszeile hinzuzufügen, aber hoffentlich helfen diese Informationen anderen, die dies lesen, jetzt, ihrem gewünschten Ergebnis näher zu kommen.
quelle
Neue Escape-Zeichenfolge in PowerShell V3, zitiert aus den Funktionen der neuen V3-Sprache :
Das Web ist voll von Befehlszeilen, die für Cmd.exe geschrieben wurden. Diese Befehlszeilen funktionieren in PowerShell häufig genug. Wenn sie jedoch bestimmte Zeichen enthalten, z. B. ein Semikolon (;), ein Dollarzeichen ($) oder geschweifte Klammern, müssen Sie einige Änderungen vornehmen und möglicherweise einige Anführungszeichen hinzufügen. Dies schien die Ursache vieler kleinerer Kopfschmerzen zu sein.
Um dieses Szenario zu lösen, haben wir eine neue Methode hinzugefügt, um das Parsen von Befehlszeilen zu umgehen. Wenn Sie einen magischen Parameter -% verwenden, stoppen wir das normale Parsen Ihrer Befehlszeile und wechseln zu etwas viel Einfacherem. Wir stimmen nicht mit Anführungszeichen überein. Wir hören nicht beim Semikolon auf. Wir erweitern keine PowerShell-Variablen. Wir erweitern Umgebungsvariablen, wenn Sie die Cmd.exe-Syntax verwenden (z. B.% TEMP%). Davon abgesehen werden die Argumente bis zum Ende der Zeile (oder Pipe, wenn Sie Piping verwenden) unverändert übergeben. Hier ist ein Beispiel:
quelle
Sie können verwenden:
Das Wichtigste dabei ist, dass FilePath laut Hilfe auf Position 0 stehen muss. Geben Sie einfach ein, um die Hilfe für ein Commandlet aufzurufen
Get-Help <Commandlet-name> -Detailed
. In diesem Fall ist esGet-Help Start-Process -Detailed
.quelle
&
nichtIch habe alle Vorschläge ausprobiert, konnte aber immer noch nicht
msiexec.exe
mit Parametern ausgeführt werden, die Leerzeichen enthielten. Meine Lösung endete also mitSystem.Diagnostics.ProcessStartInfo
:quelle
Das hat bei mir funktioniert:
Der Schlüssel scheint zu sein, dass der gesamte Befehl in äußere Anführungszeichen eingeschlossen ist, das kaufmännische Und "&" verwendet wird, um anzugeben, dass eine andere untergeordnete Befehlsdatei ausgeführt wird, und dann schließlich (doppelte-doppelte-) Anführungszeichen um den Pfad / Dateinamen mit Leerzeichen maskiert werden in wollten Sie in erster Linie ausführen.
Dies ist auch der Abschluss der einzigen Problemumgehung für das MS Connect-Problem, bei der -File keine Nicht-Null-Rückkehrcodes zurückgibt und -Command die einzige Alternative ist. Bisher wurde jedoch angenommen, dass eine Einschränkung von -Command darin besteht, dass keine Leerzeichen unterstützt werden. Ich habe auch dieses Feedback-Element aktualisiert.
http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option
quelle
Eine alternative Antwort ist die Verwendung eines Base64- codierten Befehlsschalters:
Nach der Dekodierung sehen Sie, dass es sich um das Original-Snippet des OP handelt, bei dem alle Argumente und doppelten Anführungszeichen erhalten bleiben.
Der ursprüngliche Befehl:
Wenn es als Base64 codiert wird, wird daraus Folgendes:
und so replizieren Sie zu Hause:
quelle
Sie können exe-Dateien auf verschiedene Arten auf Powershell ausführen. Wenn Sie beispielsweise unrar.exe ausführen und eine .rar-Datei extrahieren möchten, können Sie dies einfach in Powershell schreiben:
Manchmal funktioniert dies jedoch nicht, sodass Sie den Parameter & wie oben gezeigt verwenden müssen: Mit vboxmanage.exe (einem Tool zum Verwalten von virtuellen Virtualbox-Maschinen) müssen Sie beispielsweise die Parameter außerhalb der Zeichenfolge wie folgt ohne Anführungszeichen aufrufen:
Wenn Sie einfach eine archivierte winrar-Datei als EXE-Datei aufrufen möchten, können Sie sie auch mit dem Cmdlet invoke-command und einem Silent-Parameter / S entpacken (es wird sich im selben Ordner extrahieren, in dem es komprimiert wurde).
Es gibt also verschiedene Möglichkeiten, EXE-Dateien mit Argumenten in Powershell auszuführen.
Manchmal muss man eine Problemumgehung finden, damit es richtig funktioniert, was einige weitere Anstrengungen und Schmerzen erfordern kann :) abhängig von der Art und Weise, wie die EXE-Datei kompiliert oder zu ihren Erstellern gemacht wurde.
quelle
Ich benutze diese einfache, saubere und effektive Methode.
Ich platziere Argumente in einem Array, 1 pro Zeile. Auf diese Weise ist es sehr einfach zu lesen und zu bearbeiten. Dann verwende ich einen einfachen Trick, bei dem alle Argumente in doppelten Anführungszeichen an eine Funktion mit einem einzelnen Parameter übergeben werden. Das macht sie, einschließlich Arrays, zu einer einzigen Zeichenfolge, die ich dann mit PS 'Invoke-Expression' ausführe. Diese Anweisung wurde speziell entwickelt, um eine Zeichenfolge in einen ausführbaren Befehl zu konvertieren. Funktioniert gut:
quelle
Ich hatte den folgenden Code, der perfekt auf meinem Laptop funktionierte:
Als ich dann versuchte, das direkt auf einem Server auszuführen, bekam ich diese Fehler
"Unrecognized argument ...etc.... All arguments must begin with "-". "
Nachdem ich alle möglichen Problemumgehungen ausprobiert hatte (kein Erfolg), stellte ich fest, dass Powershell auf dem Server (Windows 2008 R2) Version 3.0 war, während mein Laptop 5.0 hat. (Sie können "$ PSVersionTable" verwenden, um die Version anzuzeigen).
Nach dem Upgrade von Powershell auf die neueste Version funktionierte es wieder.
quelle
Cmd kann eine zitierte Exe ausführen, Powershell jedoch nicht. Ich werde mich nur darum kümmern, die Exe selbst zu betreiben, da ich sie nicht habe. Wenn Sie buchstäblich doppelte Anführungszeichen an ein Argument eines externen Befehls senden müssen, ist dies ein weiteres Problem, das an anderer Stelle behandelt wurde.
1) Fügen Sie den exe-Ordner Ihrem Pfad hinzu, möglicherweise in Ihrem $ -Profil
2) die Leerzeichen zurückzählen:
quelle
Also bin ich auf ein ähnliches Problem gestoßen und habe es stattdessen folgendermaßen gelöst:
invoke-expression
für die neue Zeichenfolge ausBeispiellösung:
quelle
Für den Namen der ausführbaren Datei kann das Cmdlet new-alias verwendet werden, um zu vermeiden, dass Leerzeichen behandelt werden oder die ausführbare Datei zur $ PATH-Umgebung hinzugefügt werden muss.
Informationen zum Auflisten oder Ändern von PS-Aliasnamen finden Sie auch unter
Von Jeffery Hicks Aarticle
Andere Antworten sprechen die Argumente an.
quelle