使用引号括起的变量在PowerShell中执行的命令失败。为什么?

时间:2011-09-16 20:03:07

标签: 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的错误还是我遗漏/误解了什么?

6 个答案:

答案 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接收的参数。

答案 1 :(得分: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 :(得分:1)

我找到了定义

$quote = '"'

然后使用/command$quote"test"$quote也适用

答案 3 :(得分:1)

我找到了一种不会调用cmd但使用Invoke-Expression的解决方法。该命令必须首先放在变量中:

$ var ="带空格的字符串"

$ command ="第一部分" + [char] 96 + [char] 34 + $ var + [char] 96 + [char] 34 +"第二部分"

Invoke-Expression $ command

不是很漂亮,但它有效。您可以将[char] 96替换为'`'和[char] 34'"'如果你更喜欢。如果你经常使用它,很容易创建一个功能。

答案 4 :(得分:0)

没有必要在引号前添加回标记。这对你有用吗?

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

答案 5 :(得分:0)

以上所有内容对我都不起作用,但根据Carlos的想法,这是有效的解决方案here

# 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