Команды, выполняемые в PowerShell с переменными, заключенными в кавычки, не выполняются.Зачем? - PullRequest
3 голосов
/ 17 сентября 2011

У меня удивительно трудное время для вставки переменных с кавычками во внешнюю команду с помощью 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 или я что-то упускаю / неправильно понимаю?

Ответы [ 6 ]

2 голосов
/ 17 сентября 2011

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

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

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

1 голос
/ 17 мая 2014

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

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

$ command = "first part" + [char] 96 + [char] 34 + $var + [char] 96 + [char] 34 + «вторая часть»

Invoke-Expression $ command

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

1 голос
/ 19 марта 2013

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

$quote = '"'

и последующее использование /command$quote"test"$quote также работает

1 голос
/ 17 октября 2011

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

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

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

0 голосов
/ 29 сентября 2017

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

# 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 голосов
/ 17 сентября 2011

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

 $group = "stuff I want"
 dfsradmin membership list /rgname:"$group"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...