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?
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:
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
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