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?

2条回答
Ridiculous、
2楼-- · 2019-02-21 11:10

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
查看更多
3楼-- · 2019-02-21 11:14

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:

gal sc

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
查看更多
登录 后发表回答