Проблем с избягване на двойни кавички при изпълнение на смесен партиден/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 или създаването на shell обект? Предпочитам да имам един файл за изпълнение... - 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')"

P.S: В случай, че някой се чуди за какво служи... Пускам това всеки път, когато инсталирам/актуализирам VMware Workstation, за да скрия виртуалните мрежови адаптери от показване в Центъра за мрежи и споделяне в Windows Vista/7.

person rfgamaral    schedule 21.11.2010