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.