我如何从 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`" "
这个问题每隔一段时间就会不断出现,让我很烦恼,直到我记起来了。
我想从 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`" "
这个问题每隔一段时间就会不断出现,让我很烦恼,直到我记起来了。