在PowerShell中执行的带引号的变量的命令失败。为什么?
我在用PoSH将带引号的变量嵌入到外部命令时遇到了惊人的困难。例如,此命令在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`"
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