在PowerShell中执行的带引号的变量的命令失败。为什么?

在PowerShell中执行的带引号的变量的命令失败。为什么?,powershell,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`"

我在用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的一个bug还是我遗漏了什么/误解了什么?

没有必要在引号前添加反勾号。这对你有用吗

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

是的,Powershell(包括v2.0)中存在以下已知问题:

看看上面链接中讨论的备选方案是否适合您。我不能尝试它,因为我没有那个可执行文件


另外,
echoargs.exe
是一个有用的工具,您可以使用它查看从Powershell接收到的参数。

因此,我可以通过在CMD.exe中执行它并执行字符串操作来解决这个问题,以获得所需的参数

$str = &cmd /c 'dfsradmin membership list /rgname:"blah blah"'
$str = &cmd /c "dfsradmin membership list /rgname:$blah"       # with vars
谢谢你的帮助!我希望这在Powershell 3.0中得到解决。

我发现

$quote = '"'

然后使用
/command$quote“test”$quote
也能工作

我找到了一种解决方法,它不调用cmd,而是使用Invoke表达式。必须首先将命令放入变量中:

$var=“带空格的字符串”

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

调用表达式$command


不是很漂亮,但很管用。如果您愿意,您可以将[char]96替换为“`”,将[char]34替换为“`”。如果您经常使用[char]96,则可以轻松创建一个函数。

以上所有操作对我都不起作用,但基于Carlos的想法,这是一个行之有效的解决方案


嗨,Shay。没有。我得到了相同的错误。我添加了反勾号以尝试转义引号。@Shay-我不知道这将如何工作!使用
$group
而不是
“$group有什么区别“
在这种情况下。我无法测试它,但是如果$group包含空格,并且底层实用程序需要它们,则需要引号。是的,但这是当你说
“我想要的东西”
时,而不是当你使用
$group
时,对吗?@Carlos你能提供一个在cmd.exe中工作的示例命令吗?似乎有了这个特定的命令,除了使用cmd写入文件并从中读取之外,没有其他方法可以做到这一点,即老式的方式。谢谢不,它还没有在PowerShell 3.0中修复,而且在伤口上撒盐,本机DFS-R PowerShell命令没有进入Windows 2012,但即将进入R20。考虑到MS在过去几年中一直在大力推动DFSR,我对此感到非常惊讶。事实上,PowerShell执行自动报价的方式适用于99%以上的命令行工具。似乎
dfsradmin.exe
可执行文件使用了自己的解析器,该解析器无法与PowerShell的自动引用一起正常工作。
# 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