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