it-roy-ru.com

Как вызвать sc create из сценария powershell

Я хочу вызвать sc create из сценария 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

что дает следующую ошибку:

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

В чем проблема? Каковы позиционные аргументы?

11
gyozo kudor

Проблема здесь не в исполняемом файле sc. Как говорится в сообщении об ошибке, sc преобразуется в Set-Content. Если вы введете Get-Alias -Name sc, вы увидите:

 gal sc

Чтобы обойти псевдоним, используйте полное имя исполняемого файла (включая расширение файла):

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

Возможно, вы захотите использовать оператор -f при построении аргументов командной строки, чтобы избежать раздражающих повторяющихся кавычек обратных тиков повсюду:

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

Точная команда работала для меня с простой консоли командной строки, в то время как она не работает в PowerShell и VS Code Integrated Terminal. Фактически все команды sc должны были запускаться из командной строки от имени администратора.

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