windows - Escapaing double quotes problem i blandet batch/powershell script kører

Indlæg af Hanne Mølgaard Plasc

Problem



Her er hvad jeg forsøger at gøre:


@ECHO OFF

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

PAUSE


I grund og grund vil jeg have en batch-fil, som jeg kan dobbeltklikke på, som vil køre et powershell script, der kalder et andet powershell script, men spørger om admin privilegier og kører den kommando som admin.


Jeg har dog problemer med de dobbelte citater, jeg tror ... Jeg har prøvet mange ting, men det kan ikke synes at rette op på det her er fejlmeddelelsen:


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

PS C:Windowssystem32>

Bedste reference


Jeg ville bruge den indbyggede kommando Start-proces i stedet for at oprette et skalobjekt f.eks .:


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


For noget af betydning vil citatet blive irriterende. Kan du sætte det endelige script i en fil og udføre scriptfilen ved hjælp af -fil-parameteren på PowerShell.exe?

Andre referencer 1


Jeg har løst det, her er den lange batch en-liner til mit virkelige problem, så folk kan se et reelt eksempel:


CALL powershell -ExecutionPolicy RemoteSigned -Command "$sh = new-object -com 'Shell.Application'; $sh.ShellExecute('powershell', '-NoExit -Command ""$path = ''HKLM:SYSTEMCurrentControlSetControlClass{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: Hvis nogen undrer hvad det er for ..., kører jeg det hver gang jeg installerer/opdaterer VMware Workstation for at skjule de virtuelle netværksadaptere fra at vises på Netværk og delingscenter i Windows Vista/7.