在混合批处理/ powershell脚本运行中转义双引号问题

时间:2010-11-21 20:22:05

标签: windows powershell batch-file escaping double-quotes

这是我正在尝试做的事情:

@ECHO OFF

CALL powershell -ExecutionPolicy RemoteSigned -Command "$sh = new-object -com 'Shell.Application'; $sh.ShellExecute('powershell', '-NoExit -Command "$path = """HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}""";echo $path"', '', 'runas')"

PAUSE

基本上,我想要一个可以双击的批处理文件,它将运行一个PowerShell脚本,该脚本调用另一个PowerShell脚本,但要求管理员权限并以管理员身份运行该命令。

我遇到了问题,我认为双引号...我尝试了很多东西但似乎无法修复它,这是powershell错误信息:

Bad numeric constant: 4D.
At line:1 char:57
+ $path = HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4D <<<< 36E972-E325-11C
E-BFC1-08002BE10318};echo $path
    + CategoryInfo          : ParserError: (4D:String) [], ParentContainsError
   RecordException
    + FullyQualifiedErrorId : BadNumericConstant

PS C:\Windows\system32>

2 个答案:

答案 0 :(得分:2)

我会使用内置命令Start-Process而不是创建一个shell对象,例如:

CALL powershell -ExecutionPolicy RemoteSigned -NoProfile -Command "& {Start-Process PowerShell -Verb runas -Arg '-NoExit -Command & {$path=''foo'';$path}'}"

对于任何重要的事情,报价都会令人讨厌。您可以将最终脚本放在文件中并使用PowerShell.exe上的-File参数执行脚本文件吗?

答案 1 :(得分:0)

我解决了它,这是我真正问题的长批量单行程,所以人们可以看到一个真实的例子:

CALL powershell -ExecutionPolicy RemoteSigned -Command "$sh = new-object -com 'Shell.Application'; $sh.ShellExecute('powershell', '-NoExit -Command ""$path = ''HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}''; Get-Childitem $path -ErrorAction SilentlyContinue | Where { (Get-ItemProperty $_.PSPath DriverDesc) -Match ''VMnet'' } | Foreach { New-ItemProperty -ErrorAction SilentlyContinue $_.PSPath -Name ''*NdisDeviceType'' -Value ''1'' -PropertyType DWord }; netsh interface set interface name=''VMware Network Adapter VMnet1'' admin=DISABLED; netsh interface set interface name=''VMware Network Adapter VMnet1'' admin=ENABLED; netsh interface set interface name=''VMware Network Adapter VMnet8'' admin=DISABLED; netsh interface set interface name=''VMware Network Adapter VMnet8'' admin=ENABLED""', '', 'runas')"
P.S:如果有人想知道它是什么......我每次安装/更新VMware Workstation时都会运行它来隐藏虚拟网络适配器,使其不会出现在Windows Vista / 7的网络和共享中心。