Устранение проблемы с двойными кавычками при запуске сценария смешанной партии/powershell

Вот что я пытаюсь сделать:

@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>

person rfgamaral    schedule 21.11.2010    source источник


Ответы (2)


Я бы использовал встроенную команду Start-Process вместо создания объекта оболочки, например:

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

Для чего-либо значимого цитирование будет раздражать. Можете ли вы поместить окончательный сценарий в файл и выполнить файл сценария, используя параметр -File в PowerShell.exe?

person Keith Hill    schedule 22.11.2010
comment
В чем разница между использованием Start-Process и созданием объекта оболочки? Я предпочитаю иметь один файл для выполнения... - person rfgamaral; 22.11.2010
comment
Меньше работы IMO для использования встроенной функции, чем для перехода к COM-объектам, и я думаю, что меньше печатать. :-) - person Keith Hill; 22.11.2010

Я решил это, вот длинная однострочник для моей реальной проблемы, чтобы люди могли увидеть реальный пример:

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')"

PS: Если кому-то интересно, для чего это... Я запускаю это каждый раз, когда устанавливаю/обновляю VMware Workstation, чтобы скрыть виртуальные сетевые адаптеры от появления в Центре управления сетями и общим доступом в Windows Vista/7.

person rfgamaral    schedule 21.11.2010