Les commandes exécutées en PowerShell avec des variables entourées de guillemets échouent. Pourquoi?
j'ai un temps étonnamment difficile à intégrer des variables avec des citations à une commande externe avec PoSH. Par exemple, cette commande
dfsradmin membership list /rgname:`"stuff I want`"
me donne le résultat attendu suivant:
Failed:
Replication group with name stuff I want cannot be found.
Cette commande, cependant
$group = "stuff I want"
dfsradmin membership list /rgname:`"$group`"
échoue avec cette erreur:
Failed:
The subobject "/rgname:"stuff is not a valid subobject.
est-ce un bug avec Powershell ou est-ce que je manque/malentendu quelque chose?
6 réponses
Oui il y a des problèmes connus dans Powershell ( y compris v2.0) autour de cela: http://connect.microsoft.com/PowerShell/feedback/details/376207/executing-commands-which-require-quotes-and-variables-is-practically-impossible
voyez si les alternatives discutées dans le lien ci-dessus fonctionnent pour vous. Je ne peux pas l'essayer car je n'ai pas le fichier exécutable.
Aussi echoargs.exe
est un outil utile que vous pouvez utiliser pour voir ce que des arguments ont été reçus de Powershell.
donc j'ai pu contourner ça en l'exécutant dans CMD.exe et faire des manipulations de cordes pour obtenir ce dont j'ai besoin.
$str = &cmd /c 'dfsradmin membership list /rgname:"blah blah"'
$str = &cmd /c "dfsradmin membership list /rgname:$blah" # with vars
Merci pour l'aide! J'espère que cela a été résolu dans Powershell 3.0.
j'ai trouvé que la définition de
$quote = '"'
et ensuite en utilisant /command$quote"test"$quote
fonctionne aussi bien
j'ai trouvé une solution qui n'appelle pas cmd mais utilise Invoke-Expression à la place. La commande doit d'abord être mise dans une variable:
$var = "chaîne de caractères avec des espaces"
$commande = "première partie" + [char]96 + [char]34 + $var + [char]96 + [char]34 + "seconde partie"
Invoke-Expression $command
pas si jolie que ça, mais ça marche. Vous pouvez remplacer [char] 96 par "' et [char]34 par '"' si vous préférez. Facile de créer une fonction qui ne le si vous l'utilisez beaucoup.
il n'est pas nécessaire d'ajouter des tiques arrière devant les guillemets. Cela fonctionne pour vous?
$group = "stuff I want"
dfsradmin membership list /rgname:"$group"
Tout ce qui précède n'a pas fonctionné pour moi, mais basé sur L'idée de Carlos, c'est la solution qui a fonctionné posté ici
# get msdeploy exe
$MSDeploy = ${env:ProgramFiles}, ${env:ProgramFiles(x86)} |
ForEach-Object {Get-ChildItem -Path $_ -Filter 'MSDeploy.exe' -Recurse} |
Sort-Object -Property @{Expression={[version]$_.VersionInfo.FileVersion}} -Descending |
Select-Object -First 1 -ExpandProperty FullName
#build deploy command
$deplyCmd = """""$MSDeploy"" -verb:sync -dest:iisApp=""Default Web Site"" -enableRule:DoNotDeleteRule -source:iisApp=""$ExtraWebFilesFolder"""
#execute
&cmd /c $deplyCmd