我如何从 powershell 脚本调用 sc create

How do i invoke sc create from a powershell script

我想从 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

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

此处的问题与 sc 可执行文件无关。正如错误所述,sc 解析为 Set-Content。如果您发出 Get-Alias -Name 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

确切的命令从一个简单的命令提示符控制台为我工作,但它在 PowerShell 和 VS 代码集成终端上失败。事实上,所有 sc 命令都必须 运行 来自命令提示符作为管理员。

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

我知道 Mathias 的脚本可以正常工作,但它可以工作是有原因的,而 Gyozo 发布的脚本却没有。它与 sc.exe.

中的陷阱有关

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

对我来说,这段代码行不通:

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

但是这个会:

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

这个问题每隔一段时间就会不断出现,让我很烦恼,直到我记起来了。