我想从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
有什么问题?什么是位置参数?
答案 0 :(得分:29)
这里的问题不在于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
答案 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`" "
这个问题每隔一段时间不断上升,使我烦恼,直到我记住这一点为止。