Команды, выполняемые в PowerShell с переменными, заключенными в кавычки, терпят неудачу. Зачем?

У меня неожиданно сложное время встраивание переменных с кавычками в внешнюю команду с помощью PoSH. Например, эта команда

 dfsradmin membership list /rgname:`"stuff I want`"

дает мне следующий ожидаемый результат:

 Failed:
 Replication group with name stuff I want cannot be found.

Эта команда, однако

 $group = "stuff I want"
 dfsradmin membership list /rgname:`"$group`"

не удается выполнить эту ошибку:

 Failed:
 The subobject "/rgname:"stuff is not a valid subobject.

Является ли это ошибкой с Powershell или я что-то не вижу/не понимаю?

Ответ 1

Итак, я смог обойти это, выполнив его в CMD.exe и выполнив строковые манипуляции, чтобы получить то, что мне нужно.

$str = &cmd /c 'dfsradmin membership list /rgname:"blah blah"'
$str = &cmd /c "dfsradmin membership list /rgname:$blah"       # with vars

Спасибо за помощь! Я надеюсь, что это было разрешено в Powershell 3.0.

Ответ 2

Да, в Powershell (включая v2.0) есть известные проблемы: http://connect.microsoft.com/PowerShell/feedback/details/376207/executing-commands-which-require-quotes-and-variables-is-practically-impossible

Посмотрите, работают ли альтернативы, описанные в ссылке выше. Я не могу попробовать, так как у меня нет этого исполняемого файла.

Также echoargs.exe - полезный инструмент, который вы можете использовать, чтобы увидеть, какие аргументы были получены от Powershell.

Ответ 3

Я обнаружил, что определение

$quote = '"'

а затем используя /command$quote"test"$quote, также работает

Ответ 4

Я нашел обходное решение, которое не вызывает cmd, но вместо этого использует Invoke-Expression. Сначала команда должна быть помещена в переменную:

$var = "строка с пробелами"

$command = "первая часть" + [ char] 96 + [char] 34 + $var + [char] 96 + [char] 34 + "вторая часть"

Invoke-Expression $command

Не так красиво, но это работает. Вы можете заменить [ char] 96 на `` и [char] 34 с помощью '' ', если хотите. Легко создать функцию, которая делает это, если вы ее много используете.

Ответ 5

Нет необходимости добавлять обратные тики перед кавычками. Это работает для вас?

 $group = "stuff I want"
 dfsradmin membership list /rgname:"$group"

Ответ 6

Все вышесказанное не работало для меня, но на основе идеи Карлоса, это решение, которое было опубликовано здесь

# 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