2010-11-21 33 views
1

Voici ce que je suis en train de faire:Escapaing problème entre guillemets dans le script de lots mixtes/powershell en cours d'exécution

@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 

Fondamentalement, je veux avoir un fichier de commandes que je peux double-clic, qui se déroulera un script PowerShell qui appelle un autre script PowerShell mais demande des privilèges d'administrateur et exécute cette commande en tant qu'administrateur.

Je vais avoir des problèmes si, avec les doubles guillemets, je pense ... J'ai essayé beaucoup de choses, mais ne peut pas sembler le fixer, voici le message d'erreur 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> 

Répondre

2

Je voudrais utiliser la commande intégrée de démarrage processus plutôt que de créer un objet shell .: par exemple

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

Pour quelque chose d'important la citation va être ennuyeux. Pouvez-vous mettre le script final dans un fichier et exécuter le fichier script en utilisant le paramètre -File sur PowerShell.exe?

+0

Quelle est la différence entre l'utilisation de Start-Process ou la création d'un objet shell? Je préfère avoir un seul fichier à exécuter ... –

+0

Moins de travail IMO pour utiliser une fonctionnalité intégrée que d'avoir à échapper à des objets COM et c'est moins de type je pense. :-) –

0

I a résolu le problème, voici long lot d'une doublure pour mon vrai problème, afin que les gens peuvent voir un exemple concret:

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: au cas où quelqu'un se demande ce qu'il est pour ... Je lance chaque fois que j'installer/mettre à jour VMware Workstation pour empêcher les cartes réseau virtuelles d'apparaître sur le Centre Réseau et partage de Wi Windows Vista/7.