Comment exécuter un fichier EXE dans PowerShell avec des paramètres avec des espaces et des guillemets

comment exécuter la commande suivante dans PowerShell?

C:Program fichiersIISMicrosoft Web déployermsdeploy.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, username=administrator, password=adminpass "

243
demandé sur Peter Mortensen 2009-11-04 17:10:04

14 réponses

Quand PowerShell voit une commande commençant par une chaîne, il n'évalue que la chaîne, qui est, généralement, les échos à l'écran, par exemple:

PS> "Hello World"
Hello World

si vous voulez que PowerShell interprète la chaîne comme un nom de commande, alors utilisez l'opérateur d'appel ( & ) comme suit:

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

après cela, vous n'aurez probablement besoin que des paires paramètre/argument qui contiennent des espaces et/ou des guillemets. Quand vous invoquez un fichier EXE comme celui-ci avec des arguments complexes en ligne de commande, il est généralement très utile d'avoir un outil qui vous montrera comment PowerShell envoie les arguments au fichier EXE. Le PowerShell Communauté Extensions dispose d'un tel outil. Il s'appelle echoargs. Vous n'avez qu'à remplacer le fichier EXE par echoargs - en laissant tous les arguments en place, et il vous montrera comment le fichier EXE recevra les arguments, par exemple:

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>

en utilisant echoargs vous pouvez expérimenter jusqu'à ce que vous faites-le bien, par exemple:

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;>

il s'avère que j'ai essayé trop fort avant de maintenir les doubles citations autour de la chaîne de connexion. Apparemment, ce n'est pas nécessaire car même le cmd.exe bande de personnes.

BTW, chapeau à L'équipe de PowerShell. Ils m'ont été très utiles pour me montrer l'incantation spécifique de prix simples et doubles pour obtenir le résultat désiré - si vous aviez besoin de garder les doubles prix internes en place. :-) Ils aussi réaliser que c'est un domaine de la douleur, mais ils sont conduits par le nombre de gens sont touchés par un problème particulier. S'il s'agit d'un domaine de la douleur pour vous, alors s'il vous plaît votez vers le haut de ce soumission de bogue de PowerShell .

pour plus d'informations sur la façon dont PowerShell fonctionne, consultez mon Effective PowerShell blog series - spécifiquement item 10 - "Understanding PowerShell Parsing Modes"

mise à jour 4/4/2012: cette situation devient beaucoup plus facile à gérer dans PowerShell V3. Voir ce blog pour plus de détails .

263
répondu Keith Hill 2015-07-11 23:22:30

il suffit d'ajouter l'opérateur & avant le .nom de fichier exe. Voici une commande pour installer SQL Server Express en mode silence:

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

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE
47
répondu nonolde1er 2013-09-19 04:13:42

j'avais des espaces dans les commandes et les paramètres, et c'est ce qui a fonctionné pour moi:

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

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

c'est essentiellement la même réponse que celle D'Akira, mais cela fonctionne si vous construisez dynamiquement vos paramètres de commande et les mettez dans une variable.

33
répondu Microb 2014-03-07 11:10:48

cela a fonctionné pour moi:

& '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')

il suffit de mettre des chemins ou des chaînes de connexion dans un élément de tableau et de diviser les autres choses dans un élément de tableau chacun.

il y a beaucoup d'autres options ici: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

Microsoft devrait rendre cette façon plus simple et compatible avec la syntaxe d'invite de commande.

13
répondu Akira Yamamoto 2013-11-28 17:43:07

voir cette page: http://edgylogic.com/blog/powershell-and-external-commands-done-right /

résumé utilisant vshadow comme exécutable externe:

$exe = "H:\backup\scripts\vshadow.exe"
&$exe -p -script=H:\backup\scripts\vss.cmd E: M: P:
10
répondu Baodad 2012-09-10 18:44:18

j'ai pu obtenir ma commande similaire en utilisant l'approche suivante:

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

pour votre commande (non que cela aide beaucoup maintenant), les choses ressembleraient à quelque chose comme ceci:

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

les points clés sont:

  • utilisez des guillemets autour de l'argument source, et supprimez les guillemets inclus autour de la chaîne de connexion
  • utilisez les autres noms de clés pour construire le SQL chaîne de connexion qui n'ont pas les espaces. Par exemple, utilisez "UID" au lieu de "User Id", "Server" au lieu de "Data Source", "Trusted_Connection" au lieu de "Integrated Security", et ainsi de suite. Je n'ai pu le faire fonctionner une fois que j'ai enlevé tous les espaces de la chaîne de connexion.

Je n'ai pas essayé d'ajouter la partie" computername " à la fin de la ligne de commande, mais j'espère que cette information aidera d'autres à lire ce maintenant se rapprocher de leur désirée résultat.

8
répondu G-Mac 2011-01-11 17:07:50

dans le cas où quelqu'un se demande comment exécuter un fichier exécutable:

..... > .\fichier.exe

ou

......> \chemin\vers\fichier.exe

6
répondu darkgaze 2018-02-20 11:00:23

Nouvelle chaîne d'échappement en PowerShell V3, cité de V3 Fonctionnalités de Langage :

faciliter la réutilisation des lignes de commande du Cmd.exe

le web est rempli de lignes de commande écrites pour Cmd.EXE. Ces lignes de commandes fonctionnent assez souvent dans PowerShell, mais quand elles incluent certains caractères, par exemple, un point-virgule (;), un signe de dollar ( $ ), ou des accolades bouclées, vous devez faites quelques changements, probablement en ajoutant quelques citations. Cela semble être la source de nombreux maux de tête mineurs.

pour aider à résoudre ce scénario, nous avons ajouté une nouvelle façon d '"échapper" à l'analyse des lignes de commande. Si vous utilisez un paramètre magique --%, nous arrêtons notre analyse normale de votre ligne de commande et passons à quelque chose de beaucoup plus simple. On ne correspond pas aux citations. Nous ne nous arrêtons pas au point-virgule. Nous n'élargissons pas les variables de PowerShell. Nous développons les variables d'environnement si vous utilisez Cmd.exe syntaxe (par ex. %TEMP%). En dehors de cela, les arguments jusqu'à la fin de la ligne (ou la pipe, si vous êtes la tuyauterie) sont passés comme tel. Voici un exemple:

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>
5
répondu Loïc MICHEL 2015-07-11 23:25:00

cela a fonctionné pour moi:

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

la clé semble être que toute la commande est enfermée dans des guillemets externes, l'ampli " & " est utilisé pour spécifier qu'un autre fichier de commande enfant est exécuté, puis finalement échappé (double -) guillemets autour du chemin/nom de fichier avec des espaces dans vous vouliez exécuter en premier lieu.

C'est aussi l'achèvement de la seule solution au problème MS connect que-File ne passe pas-back non-zero les codes de retour et-commande sont la seule alternative. Mais jusqu'à présent, on pensait qu'une des limites du commandement était qu'il ne soutenait pas les espaces. J'ai mis à jour ce feedback.

http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option

3
répondu Tony Wall 2015-07-13 15:14:22

j'ai essayé toutes les suggestions mais j'ai été incapable de lancer msiexec.exe avec des paramètres qui contenaient des espaces. Donc ma solution a fini par utiliser 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()
3
répondu Daniel Lidström 2016-02-16 14:30:10

une réponse alternative est d'utiliser un Base64 commutateur de commande encodé:

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

une fois décodé, vous verrez que c'est l'extrait original de L'OP avec tous les arguments et les doubles citations préservées.

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.

La commande d'origine:

 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"

il se transforme en ceci quand codé comme Base64:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

et voici comment répliquer à la maison:

$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
répondu Knuckle-Dragger 2016-05-03 03:51:44

Il ya quelques méthodes que vous pouvez utiliser pour le faire.

il existe d'autres méthodes comme l'utilisation de L'opérateur D'appel( & ), Invoke-Expression cmdlet etc. Mais ils sont considérés comme dangereux. Microsoft recommande d'utiliser Start-Process .

Méthode 1

un exemple simple

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

dans votre cas

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"

dans cette méthode, vous séparez chaque paramètre de la liste D'arguments en utilisant des virgules.

Méthode 2

Exemple Simple

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

dans votre cas

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"

cette méthode est plus facile car elle permet de taper vos paramètres en une seule fois.

noter que dans powershell à représenter la guillemet ( "" ) dans une chaîne de caractères vous devez insérer le accent grave ( ` ) (C'est la touche au-dessus de la touche de Tabulation du clavier AMÉRICAIN).

- NoNewWindow le paramètre est utilisé pour afficher le nouveau processus dans la fenêtre de la console actuelle. Par défaut, Windows PowerShell ouvre une nouvelle fenêtre.

, Les Références : Powershell/Scripts/Start-Processus

1
répondu Missaka Iddamalgoda 2018-03-07 06:05:28

Merci d'avoir posté cette question.

vous pouvez exécuter des fichiers exe dans powershell de différentes façons. Par exemple, si vous voulez lancer unrar.exe et d'en extraire une .vous pouvez simplement écrire dans powershell ceci:

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

, Mais parfois, cela ne fonctionne pas, vous devez donc utiliser le paramètre comme indiqué ci-dessus: Par exemple, avec vboxmanage.exe (un outil pour gérer les machines VirtualBox virtuelles) vous devez appeler les paramétreurs en dehors de la chaîne comme ceci, sans guillemets:

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

si vous voulez simplement appeler un fichier winrar archivé sous .exe File, vous pouvez également le décompresser avec le cmdlet invoke-command et un paramètre silencieux /s (il va s'extraire dans le même dossier que celui où il a été compressé).

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

il y a donc plusieurs façons de courir .fichiers exe avec arguments dans powershell.

parfois, il faut trouver une solution pour la faire fonctionner correctement, ce qui peut nécessiter quelques efforts et de douleur :) en fonction de la façon dont l' .exe a été compilé ou fait par ses créateurs.

1
répondu Andy McRae 2018-05-25 14:40:02

donc, j'ai rencontré un problème similaire et j'ai choisi de le résoudre de cette façon plutôt:

  1. Échapper à votre guillemets ( "" ) avec un backtick (`)
  2. entourez votre nouvelle expression de citations (")
  3. en utilisant l'opérateur d'appel ( & ), émettre la commande invoke-expression sur la nouvelle chaîne

exemple de solution:

& { invoquer l'expression "C:\Program Fichiers\IIS\Microsoft Web déployer\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, username = administrator,password=adminpass`""}

0
répondu Randall Borck 2017-08-08 18:35:52