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?

3
demandé sur Carlos Nunez 2011-09-17 00:03:06

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.

2
répondu manojlds 2011-09-16 20:25:22

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.

1
répondu Carlos Nunez 2011-10-17 13:55:53

j'ai trouvé que la définition de

$quote = '"'

et ensuite en utilisant /command$quote"test"$quote fonctionne aussi bien

1
répondu Erik Thue 2013-03-19 12:00:56

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.

1
répondu Laurent Stoeckli 2014-05-17 00:28:25

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"
0
répondu Shay Levy 2011-09-16 20:33:25

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
0
répondu Alobidat 2017-09-29 11:39:55