Команды, выполняемые в 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 или я что-то упускаю / неправильно понимаю?
7 ответов
Так что я смог обойти это, выполнив его в CMD.exe и выполнив манипуляции со строками, чтобы получить то, что мне нужно.
$str = &cmd /c 'dfsradmin membership list /rgname:"blah blah"'
$str = &cmd /c "dfsradmin membership list /rgname:$blah" # with vars
Спасибо за помощь! Я надеюсь, что это было решено в Powershell 3.0.
Да, в Powershell (включая v2.0) есть известные проблемы, связанные с этим: http://connect.microsoft.com/PowerShell/feedback/details/376207/executing-commands-which-require-quotes-and-variables-is-practically-impossible
Посмотрите, работают ли альтернативы, рассмотренные в ссылке выше, для вас. Я не могу попробовать это, поскольку у меня нет этого исполняемого файла.
Также echoargs.exe
это полезный инструмент, который вы можете использовать, чтобы увидеть, какие аргументы были получены от Powershell.
Я нашел обходной путь, который не вызывает cmd, но вместо этого использует Invoke-Expression. Команда должна быть сначала помещена в переменную:
$ var = "строка с пробелами"
$ command = "первая часть" + [символ]96 + [символ]34 + $var + [символ]96 + [символ]34 + "вторая часть"
Команда Invoke-Expression $
Не очень красиво, но это работает. Вы можете заменить [char]96 на "` "и [char]34 на" ", если хотите. Легко создать функцию, которая делает это, если вы часто ее используете.
Я обнаружил, что определяющий
$quote = '"'
а затем с помощью /command$quote"test"$quote
работает также
Там нет необходимости добавлять обратно галочки перед кавычками. Это работает для вас?
$group = "stuff I want"
dfsradmin membership list /rgname:"$group"
Я знаю, что это старая ветка, но просто публикую здесь на случай, если мое решение сработает для кого-то, как оно сработало для меня. Эта конкретная команда (dfsradmin) ожидает изначально видимые кавычки, поэтому я просто заключил значение с кавычками в одинарные кавычки , таким образом, также передавая кавычки:
dfsradmin membership list /rgname:'"stuff I want"'
или при использовании сквозной переменной:
$group = '"stuff I want"'
dfsradmin membership list /rgname:$group
Все вышеперечисленное не работает для меня, но на основе идеи Карлоса, это решение, которое сработало, размещено здесь
# 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