464 votes

Comment exécuter exe dans Powershell avec des paramètres avec des espaces et des guillemets

Comment exécutez-vous cette commande dans powershell:

C: \ Program Files \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql = "Source de données = mysource; Sécurité intégrée = false; ID utilisateur = sa; Pwd = sapass!; Database = mydb;" -dest: dbfullsql = "Source de données =. \ mydestsource; Sécurité intégrée = false; ID utilisateur = sa; Pwd = sapass!; Database = mydb;", nomordinateur = 10.10.10.10, nom d'utilisateur = administrateur, password = adminpass "

452voto

Keith Hill Points 73162

Lorsque PowerShell voit une commande commençant par une chaîne, il n'évalue que la chaîne ie généralement des échos à l'écran, par ex.:

PS> "Hello World"
Hello World

Si vous voulez PowerShell pour interpréter la chaîne comme un nom de commande, puis utiliser l'opérateur d'appel (&) comme suit:

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

Après que vous aurez probablement besoin de citer le paramètre/arg paires qui contiennent des espaces et/ou de la citation caractères. Lorsque vous appelez un exe comme ce complexe, avec des arguments de ligne de commande, il est généralement très utile pour avoir l'outil qui va vous montrer comment PowerShell envoie les arguments de l'exe. La PowerShell de la Communauté des Extensions dispose d'un tel outil. Il est appelé echoargs. Vous venez de remplacer le fichier exe avec echoargs - en laissant tous les arguments en place et il va vous montrer comment l'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>

À l'aide de echoargs vous pouvez expérimenter jusqu'à ce que vous obteniez la bonne 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;>

En fait, j'ai essayé trop dur à l'avant pour maintenir les guillemets autour de la chaîne de connexion. Apparemment, ce n'est pas nécessaire, car même cmd.exe bande de personnes.

BTW chapeaux à la PowerShell de l'équipe. Ils ont été très utiles en me montrant spécifiques incantation de simple et double quotes pour obtenir le résultat souhaité - si vous avez besoin de garder l'intérieur de guillemets doubles. :-) Ils réalisent également que c'est un domaine de la douleur, mais ils sont entraînés par le nombre de gens sont affectés par un problème particulier. Si c'est une zone de douleur pour vous, alors s'il vous plaît voter cette PowerShell soumission de bug.

Pour plus d'informations sur la façon PowerShell analyse, consultez mon Efficace PowerShell série de blog - plus précisément à la rubrique 10, "Comprendre le PowerShell Analyse des Modes"

Mise à JOUR 4/4/2012: Cette situation devient beaucoup plus facile à manipuler en PowerShell V3. Voir ce billet de blog pour plus de détails.

86voto

Microb Points 11

J’ai eu des espaces dans la commande et les paramètres, et c’est ce qui a fonctionné pour moi :

C’est fondamentalement la même que la réponse de Akira, mais cela fonctionne si vous dynamiquement construire vos paramètres de commande et les mettez dans une variable.

82voto

nonolde1er Points 191

Ajoutez simplement l'opérateur & avant le nom .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
 

23voto

Baodad Points 175

Consultez la page suivante : http://edgylogic.com/blog/powershell-and-external-commands-done-right/

Résumé à l’aide de vshadow comme l’exécutable externe :

9voto

G-Mac Points 366

J'ai pu obtenir ma commande similaire de travail à l'aide de 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 (pas que ça aide beaucoup maintenant), les choses devraient ressembler à 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 les suivants:

  • Utiliser des guillemets autour de la source de l'argument, et de supprimer l'embarqué des guillemets autour de la chaîne de connexion
  • La solution de noms de clé dans la construction de la chaîne de connexion SQL qui n'ont pas les espaces. Par exemple, utilisez "UID" au lieu de "nom d'Utilisateur", "Serveur" au lieu de "Source de Données", "Trusted_Connection" au lieu de "Sécurité Intégrée", 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 essayer d'ajouter le "computername" à la fin de la ligne de commande, mais nous espérons que cette info va aider les autres à la lecture de ce désormais à se rapprocher de leur résultat souhaité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X