it-swarm.com.de

Ausführen einer EXE-Datei in PowerShell mit Parametern mit Leerzeichen und Anführungszeichen

Wie führen Sie den folgenden Befehl in PowerShell aus?

C:\Programme\IIS\Microsoft Web Deploy\msdeploy.exe -verb: sync -source: dbfullsql = "Datenquelle = mysource; Integrated Security = false; Benutzer-ID = sa; Pwd = sapass!; Database = mydb;" -dest: dbfullsql = "Datenquelle =.\mydestsource; Integrated Security = false; Benutzer-ID = sa; Pwd = sapass!; Database = mydb;", computername = 10.10.10.10, Benutzername = Administrator, Kennwort = adminpass "

255
Vans

Wenn PowerShell einen Befehl sieht, der mit einer Zeichenfolge beginnt, wertet sie die Zeichenfolge einfach aus, d. H. Normalerweise wird sie auf dem Bildschirm angezeigt, z. B .:

PS> "Hello World"
Hello World

Wenn Sie möchten, dass PowerShell die Zeichenfolge als Befehlsnamen interpretiert, verwenden Sie den Aufrufoperator (&) wie folgt:

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

Danach müssen Sie wahrscheinlich nur Parameter/Argumente angeben, 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ügt über ein solches Tool. Es heißt Echoargs. Sie müssen nur die EXE-Datei durch echoargs ersetzen. Dabei werden alle Argumente beibehalten, und es wird Ihnen angezeigt, wie die EXE-Datei die Argumente erhält. Beispiel:

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

Mit echoargs können Sie experimentieren, bis Sie alles richtig gemacht haben, zum Beispiel:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

Es stellte sich heraus, dass ich mich zu sehr bemühte, die Anführungszeichen um die Verbindungszeichenfolge einzuhalten. Anscheinend ist das nicht notwendig, da selbst cmd.exe diese ausreißen wird.

Übrigens, hat das 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 - falls Sie die internen doppelten Anführungszeichen beibehalten mussten. :-) 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 für Sie ein schmerzhafter Bereich ist, stimmen Sie bitte diese PowerShell-Fehlerübergabe ab.

Weitere Informationen zur Analyse von PowerShell finden Sie in meiner Effective PowerShell-Blogserie - speziell Punkt 10 - "Grundlegendes zu PowerShell-Analysemodi"

UPDATE 04.04.2012: Diese Situation wird in PowerShell V3 viel einfacher gehandhabt. In diesem Blogeintrag finden Sie Details .

280
Keith Hill

Fügen Sie einfach den Operator & vor dem Namen der EXE-Datei hinzu. Hier ist ein Befehl zum Installieren von SQL Server Express im stillen Modus:

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE
48
nonolde1er

Ich hatte Leerzeichen in Befehl und Parametern, und das hat bei mir funktioniert:

$Command = "E:\X64\Xendesktop Setup\XenDesktopServerSetup.exe"
$Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL"

$Prms = $Parms.Split(" ")
& "$Command" $Prms

Es ist im Grunde dasselbe wie die Antwort von Akira, aber dies funktioniert, wenn Sie Ihre Befehlsparameter dynamisch erstellen und in eine Variable einfügen.

36
Microb

Das hat bei mir funktioniert:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'Java', '-jar', 'app.jar')

Fügen Sie einfach Pfade oder Verbindungszeichenfolgen in ein Array-Element ein und teilen Sie die anderen Elemente in jeweils ein Array-Element.

Hier gibt es viele andere Optionen: https://social.technet.Microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

Microsoft sollte diese Methode einfacher und mit der Eingabeaufforderungssyntax kompatibel machen.

18
Akira Yamamoto

Siehe diese Seite: https://slai.github.io/posts/powershell-and-external-commands-done-right/

Zusammenfassung mit vshadow als externer ausführbarer Datei:

$exe = "H:\backup\scripts\vshadow.exe"
&$exe -p -script=H:\backup\scripts\vss.cmd E: M: P:
12
Baodad

Falls sich jemand fragt, wie man eine ausführbare Datei ausführt:

.....>.\file.exe

oder 

......> vollständiger\Pfad\zu\file.exe

9
darkgaze

Ich konnte meinen ähnlichen Befehl auf folgende Weise zum Laufen bringen:

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

Für Ihr Kommando (nicht dass es jetzt viel hilft) würden die Dinge ungefähr so ​​aussehen: 

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Die wichtigsten Punkte sind:

  • Verwenden Sie Anführungszeichen um das Quellargument und entfernen Sie die eingebetteten Anführungszeichen um die Verbindungszeichenfolge 
  • Verwenden Sie beim Erstellen der SQL-Verbindungszeichenfolge die alternativen Schlüsselnamen, die keine Leerzeichen enthalten. Verwenden Sie beispielsweise "UID" anstelle von "Benutzer-ID", "Server" anstelle von "Datenquelle", "Trusted_Connection" anstelle von "Integrierte Sicherheit" und so weiter. Ich konnte es erst zum Laufen bringen, nachdem ich alle Leerzeichen aus der Verbindungszeichenfolge entfernt hatte.

Ich habe nicht versucht, den Teil "computername" am Ende der Befehlszeile hinzuzufügen, aber hoffentlich helfen diese Informationen anderen Lesern dabei, dem gewünschten Ergebnis näher zu kommen.

8
G-Mac

Neuer Escape-String in PowerShell V3, zitiert aus Neue V3-Sprachfunktionen:

Einfachere Wiederverwendung von Befehlszeilen aus Cmd.exe

Das Web ist voll von Befehlszeilen, die für Cmd.exe geschrieben wurden. Diese Befehlszeilen funktionieren in PowerShell oft genug, aber wenn sie bestimmte Zeichen enthalten, z. B. ein Semikolon (;), ein Dollarzeichen ($) oder geschweifte Klammern, müssen Sie einige Änderungen vornehmen und möglicherweise Anführungszeichen hinzufügen. Dies schien die Quelle vieler kleiner Kopfschmerzen zu sein.

Um dieses Szenario zu bewältigen, haben wir eine neue Methode hinzugefügt, um das Parsen von Befehlszeilen zu „entkommen“. Wenn Sie einen magischen Parameter -% verwenden, unterbrechen wir die normale Analyse Ihrer Befehlszeile und wechseln zu etwas viel einfacherem. Wir stimmen nicht mit Zitaten überein. Wir halten nicht bei Semikolon an. Wir erweitern keine PowerShell-Variablen. Wir erweitern die Umgebungsvariablen, wenn Sie die Cmd.exe-Syntax verwenden (z. B.% TEMP%). Ansonsten werden die Argumente bis zum Ende der Leitung (oder der Pipe, wenn Sie verlegen) so übergeben, wie sie sind. Hier ist ein Beispiel:

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>
6
Loïc MICHEL

Es gibt einige Methoden, die Sie dazu verwenden können.

Es gibt andere Methoden wie die Verwendung des Aufrufoperators (&), Invoke-Expression-Cmdlet usw. Sie werden jedoch als unsicher betrachtet. Microsoft empfiehlt die Verwendung von Start-Process.

Methode 1

Ein einfaches Beispiel

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root","-proot","-h localhost"

In Ihrem Fall

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync","-source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","-dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","computername=10.10.10.10","username=administrator","password=adminpass"

In dieser Methode trennen Sie jeden Parameter in der ArgumentList durch Kommas.

Methode 2

Einfaches Beispiel

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root -proot -h localhost"

In Ihrem Fall

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`" -dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`",computername=10.10.10.10,username=administrator,password=adminpass"

Diese Methode ist einfacher, da Sie Ihre Parameter auf einmal eingeben können.

Beachten Sie, dass in Powershell zur Darstellung von Anführungszeichen (") in einer Zeichenfolge der Akzent (`)} eingefügt werden muss (Dies ist die Taste oberhalb der Tabulatortaste der US-Tastatur). .

-NoNewWindow Über diesen Parameter wird der neue Prozess im aktuellen Konsolenfenster angezeigt. Standardmäßig öffnet Windows PowerShell ein neues Fenster.

Referenzen: Powershell/Scripting/Start-Prozess

4

Ich habe alle Vorschläge ausprobiert, konnte jedoch msiexec.exe nicht mit Parametern ausführen, die Leerzeichen enthalten. So endete meine Lösung mit System.Diagnostics.ProcessStartInfo:

# can have spaces here, no problems
$settings = @{
  CONNECTION_STRING = "... ..."
  ENTITY_CONTEXT = "... ..."
  URL = "..."
}

$settingsJoined = ($settings.Keys | % { "$_=""$($settings[$_])""" }) -join " "
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.WorkingDirectory = $ScriptDirectory
$pinfo.FileName = "msiexec.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "/l* install.log /i installer.msi $settingsJoined"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()
4

Eine alternative Antwort ist die Verwendung eines Befehlsschalters Base64 encoded:

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

Bei der Dekodierung werden Sie sehen, dass es das ursprüngliche Snippet des OP ist, bei dem alle Argumente und Anführungszeichen erhalten bleiben.

powershell.exe -EncodedCommand

Accepts a base-64-encoded string version of a command. Use this parameter
to submit commands to Windows PowerShell that require complex quotation
marks or curly braces.

Der ursprüngliche Befehl:

 C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

Wenn es als Base64 codiert wird, wird dies zu:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

und so können Sie zu Hause replizieren:

$command = 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand

#  The clip below copies the base64 string to your clipboard for right click and paste.
$encodedCommand | Clip
3
Knuckle-Dragger

Das hat für mich funktioniert:

PowerShell.exe -Command "& ""C:\Some Script\Path With Spaces.ps1"""

Der Schlüssel scheint zu sein, dass der gesamte Befehl in Anführungszeichen eingeschlossen ist. Mit dem kaufmännischen Und-Zeichen wird angegeben, dass eine andere untergeordnete Befehlsdatei ausgeführt wird. Anschließend werden um den Pfad-/Dateinamen Fluchtzeichen mit Leerzeichen eingeschlossen in wollten Sie in erster Linie ausführen.

Dies ist auch der Abschluss der einzigen Problemumgehung für das MS-Verbindungsproblem, bei der -File Rückgabecodes nicht ungleich Null zurückgibt und -Kommando die einzige Alternative ist. Bisher wurde jedoch davon ausgegangen, dass eine Einschränkung von -Command darin bestand, dass keine Leerzeichen unterstützt wurden. Ich habe auch dieses Feedback-Element aktualisiert.

http://connect.Microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-wenn-verwendet-die-Dateioption

3
Tony Wall

Sie können exe-Dateien auf verschiedene Arten in 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:

$extract_path = "C:\Program Files\Containing folder";
$rar_to_extract = "C:\Path_to_Arch\file.rar"; #(or.exe if its a big file)  
C:\Path_here\Unrar.exe x -o+ -c- $rar_to_extract $extract_path;

Manchmal funktioniert dies jedoch nicht, daher müssen Sie den Parameter & verwenden, wie oben gezeigt: Mit vboxmanage.exe (einem Tool zum Verwalten von virtuellen Virtualbox-Maschinen) müssen Sie die Parameter außerhalb der Zeichenfolge wie folgt aufrufen: ohne Zitate:

> $vmname = "misae_unrtes_1234123"; #(name too long, we want to change this)
> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm $vmname --name UBUNTU;

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.

> Invoke-Command -ScriptBlock { C:\Your-path\archivefile.exe /S };

Es gibt also mehrere Möglichkeiten, EXE-Dateien mit Argumenten in Powershell auszuführen.

Manchmal muss man eine Problemumgehung finden, damit es richtig funktioniert, was einige Anstrengungen und Schmerzen erfordern kann :) abhängig von der Art und Weise, wie die EXE-Datei kompiliert oder von ihren Erstellern gemacht wurde.

2
Andy McRae

Ich hatte den folgenden Code perfekt auf meinem Laptop:

& $msdeploy `
-source:package="$publishFile" `
-dest:auto,computerName="$server",includeAcls="False",UserName="$username",Password="$password",AuthType="$auth" `
-allowUntrusted  `
-verb:sync  `
-enableRule:DoNotDeleteRule `
-disableLink:AppPoolExtension  `
-disableLink:ContentExtension  `
-disableLink:CertificateExtension  `
-skip:objectName=filePath,absolutePath="^(.*Web\.config|.*Environment\.config)$" `
-setParam:name=`"IIS Web Application Name`",value="$appName"

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 Workarounds 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 hat es wieder funktioniert.

1
drizin

Also stieß ich auf ein ähnliches Problem und entschied mich, es stattdessen auf folgende Weise zu lösen:

  1. Entkommen Sie Ihren Anführungszeichen (") mit einem Backtick (`)
  2. Umschließen Sie Ihren neuen Ausdruck mit Anführungszeichen (").
  3. Geben Sie mit dem Aufrufoperator (&) den Befehl invoke-expression für die neue Zeichenfolge ein

Beispiellösung:

& {invoke-expression "C:\Programme\IIS\Microsoft Web Deploy\msdeploy.exe -verb: sync -source: dbfullsql =` "Datenquelle = mysource; Integrated Security = false; Benutzer-ID = sa; Pwd = sapass !; Database = mydb; `" -dest: dbfullsql = `" Datenquelle =.\Mydestsource; Integrated Security = false; Benutzer-ID = sa; Pwd = sapass!; Database = mydb; `", Computername = 10.10.10.10. Benutzername = Administrator, Passwort = Adminpass` ""}

0
Randall Borck

Für den Namen der ausführbaren Datei kann das Cmdlet new-alias verwendet werden, um zu vermeiden, dass Leerzeichen verwendet werden oder die ausführbare Datei der $ PATH-Umgebung hinzugefügt werden muss.

PS> new-alias msdeploy "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
PS> msdeploy ...

Um PS-Aliase aufzulisten oder zu ändern, siehe auch

PS> get-alias
PS> set-alias

Von Jeffery Hicks Aarticle

Andere Antworten behandeln die Argumente.

0
crokusek

Sie können verwenden:

Start-Process -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

Das Wichtigste dabei ist, dass sich FilePath laut Hilfe auf Position 0 befinden muss. Um die Hilfe für ein Commandlet aufzurufen, geben Sie einfach Get-Help <Commandlet-name> -Detailed ein. In diesem Fall ist es Get-Help Start-Process -Detailed.

0
CyrilDex

Ich benutze diese einfache, saubere und effektive Methode.

Ich setze Argumente in ein Array, 1 pro Zeile. Auf diese Weise ist es sehr einfach zu lesen und zu bearbeiten. Dann benutze ich einen einfachen Trick, um alle Argumente in doppelten Anführungszeichen an eine Funktion mit einem einzelnen Parameter zu übergeben. Dadurch werden sie, einschließlich der Arrays, zu einer einzelnen Zeichenfolge zusammengefasst, die ich dann mit PS 'Invoke-Expression' ausführe. Diese Direktive wurde speziell entwickelt, um einen String in einen ausführbaren Befehl umzuwandeln. Funktioniert gut:

                    # function with one argument will flatten 
                    # all passed-in entries into 1 single string line
Function Execute($command) {
                    # execute:
    Invoke-Expression $command;
                    # if you have trouble try:
  # Invoke-Expression "& $command";
                    # or if you need also output to a variable
  # Invoke-Expression $command | Tee-Object -Variable cmdOutput;

}

#  ... your main code here ...

               # The name of your executable app
$app = 'my_app.exe';
               # List of arguments:
               #    Notice the type of quotes - important !
               #    Those in single quotes are normal strings, like 'Peter'
$args = 'arg1',
        'arg2',
        $some_variable,
        'arg4',
        "arg5='with quotes'",
        'arg6',
        "arg7 \ with \ $other_variable",
        'etc...';

               # pass all arguments inside double quotes
Execute "$app $args";
0
Felix