Lorsque PowerShell voit une commande commençant par une chaîne, il évalue simplement la chaîne, c'est-à-dire qu'il la renvoie généralement à l'écran, par exemple:
PS> "Hello World"
Hello World
Si vous souhaitez que PowerShell interprète la chaîne comme un nom de commande, 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 qu'à citer des paires paramètre / argument contenant des espaces et / ou des caractères de citation. Lorsque vous appelez un fichier EXE comme celui-ci avec des arguments de ligne de commande complexes, il est généralement très utile d'avoir un outil qui vous montrera comment PowerShell envoie les arguments au fichier EXE. Les extensions de communauté PowerShell disposent d'un tel outil. Cela s'appelle des échoargs. Vous remplacez simplement le fichier EXE par echoargs - en laissant tous les arguments en place, et cela 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 des échos, vous pouvez expérimenter jusqu'à ce que vous obteniez les bons résultats, 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'essayais trop avant de conserver les guillemets doubles autour de la chaîne de connexion. Apparemment, cela n'est pas nécessaire car même cmd.exe les supprimera.
BTW, chapeau à l'équipe PowerShell. Ils m'ont été très utiles en me montrant l'incantation spécifique des guillemets simples et doubles pour obtenir le résultat souhaité - si vous aviez besoin de garder les guillemets internes en place. :-) Ils réalisent également que c'est un domaine douloureux, mais ils sont motivés par le nombre de personnes affectées par un problème particulier. Si cela vous inquiète, veuillez voter pour cette soumission de bogue PowerShell .
Pour plus d'informations sur la façon dont PowerShell analyse, consultez ma série de blogs PowerShell efficace - en particulier le point 10 - «Comprendre les modes d'analyse PowerShell»
MISE À JOUR 4/4/2012: Cette situation devient beaucoup plus facile à gérer dans PowerShell V3. Voir cet article de blog pour plus de détails .