我如何从powershell脚本调用sc创建

时间:2015-11-18 14:16:02

标签: powershell alias sc.exe

我想从powershell脚本调用sc create。这是代码。

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

有什么问题?什么是位置参数?

3 个答案:

答案 0 :(得分:29)

这里的问题不在于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

答案 1 :(得分:0)

确切的命令从简单的命令提示符控制台为我工作,但在PowerShell和VS Code Integrated Terminal上失败。实际上,所有sc命令都必须以管理员身份从命令提示符处运行。

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

答案 2 :(得分:0)

我知道Mathias的脚本可以正常工作,但是有一个理由可以起作用,而Gyozo发布的脚本却不能起作用。这与sc.exe中的陷阱有关。

binPath和displayName中的等号后的空格不是可选的。

对我来说,此代码段无效:

$cmd="sc create `"$ServiceName`" binpath=`"$TargetPath`" displayname=`"$DisplayName`" "

但是这个会:

$cmd="sc create `"$ServiceName`" binpath= `"$TargetPath`" displayname= `"$DisplayName`" "

这个问题每隔一段时间不断上升,使我烦恼,直到我记住这一点为止。