How do i invoke sc create from a powershell script

2019-02-21 10:55发布

问题:

I want to invoke sc create from a powershell script. Here is the 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

which gives the following error:

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

What is the problem? What are positional arguments?

回答1:

The issue here is not with the sc executable. As the error states, sc resolves to Set-Content. If you issue Get-Alias -Name sc, you'll see:

To bypass the alias, use the full name of the executable (including the file extension):

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

You might want to use the -f operator when constructing your command line arguments, to avoid those annoying quote-escaping back ticks all over the place:

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


回答2:

The exact command worked for me from a simple Command Prompt console while it fails on PowerShell and VS Code Integrated Terminal. In fact, all sc commands had to be run from Command Prompt as Administrator.

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