我在使用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的错误还是我遗漏/误解了什么?
答案 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