Команды, выполняемые в 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
Другие вопросы по тегам