web-dev-qa-db-fra.com

Comment invoquer sc create à partir d'un script powershell

Je veux invoquer sc create à partir d'un script PowerShell. Voici le code.

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

ce qui donne l'erreur suivante:

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

Quel est le problème? Quels sont les arguments positionnels?

18
gyozo kudor

Le problème ici n'est pas avec l'exécutable sc. Comme l'indique l'erreur, sc se résout en Set-Content. Si vous émettez Get-Alias -Name sc, tu verras:

gal sc

Pour contourner l'alias, utilisez le nom complet de l'exécutable (y compris l'extension de fichier):

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

Vous voudrez peut-être utiliser le -f opérateur lors de la construction de vos arguments de ligne de commande, pour éviter ces tics gênants qui échappent aux guillemets:

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

La commande exacte a fonctionné pour moi à partir d'une simple console d'invite de commandes alors qu'elle échoue sur PowerShell et VS Code Integrated Terminal. En fait, toutes les commandes sc devaient être exécutées à partir de l'invite de commandes en tant qu'administrateur.

sc create MyService binPath= "C:\svc\sampleapp.exe"
sc start MyService
1
Si Zi