Команды, выполняемые в 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