2015-11-18 4 views
5

Voglio invocare sc create da uno script PowerShell. Ecco il codice.Come faccio a richiamare sc create da uno script PowerShell

function Execute-Command 
{ 
    param([string]$Command, [switch]$ShowOutput=$True) 
    echo $Command 
    if ($ShowOutput) { 
     Invoke-Expression $Command 
    } else { 
     $out = Invoke-Expression $Command 
    } 
} 

$cmd="sc create `"$ServiceName`" binpath= `"$TargetPath`" displayname= `"$DisplayName`" " 
Execute-Command -Command:$cmd 

che dà il seguente errore:

Set-Content : A positional parameter cannot be found that accepts argument 'binpath='. 
At line:1 char:1 

Qual è il problema? Quali sono gli argomenti posizionali?

+0

Non ci dovrebbero essere spazi dopo i segni = nel comando – AutomatedOrder

+6

Come l'errore dice, 'sc' è un alias per' Set-Content'. Usa il nome completo del file 'sc.exe' –

+1

Da PS4 in poi, puoi usare il cmdlet' New-Service' https://technet.microsoft.com/en-us/library/hh849830(v=wps.630).aspx – sodawillow

risposta

7

Il problema qui non è con l'eseguibile sc. Come indica l'errore, sc si risolve in Set-Content. Se si emette Get-Alias -Name sc, vedrete:

gal sc

Per bypassare l'alias, utilizzare il nome completo del file eseguibile (tra cui l'estensione del file):

PS C:\> sc.exe query wuauserv 

SERVICE_NAME: wuauserv 
     TYPE    : 20 WIN32_SHARE_PROCESS 
     STATE    : 4 RUNNING 
           (STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN) 
     WIN32_EXIT_CODE : 0 (0x0) 
     SERVICE_EXIT_CODE : 0 (0x0) 
     CHECKPOINT   : 0x0 
     WAIT_HINT   : 0x0 

Potrebbero desidera utilizzare l'operatore -f durante la costruzione degli argomenti della riga di comando, per evitare quei fastidiosi contrattempi che sfuggono dappertutto:

$CmdLine = 'sc.exe create "{0}" binpath= "{1}" displayname= "{2}" ' -f $ServiceName,$TargetPath,$DisplayName 
Execute-Command -Command $CmdLine