记一个windows管理服务的powershell脚本
脚本部分
$servicePath = "C:\Users\Administrator\Desktop\service\detection.exe"
$workingDirectory = "C:\Users\Administrator\Desktop\service"
$logFile = "C:\Users\Administrator\Desktop\service\service.log"
$errorLogFile = "C:\Users\Administrator\Desktop\service\error.log"
$serviceName = "DetectionService"
$taskName = "DetectionService_AutoStart"
# 检查服务状态函数
function Get-ServiceStatus {
$process = Get-Process -Name "detection" -ErrorAction SilentlyContinue
if ($process) {
return "Running (PID: $($process.Id))"
}
return "Stopped"
}
# 启动服务函数
function Start-Service {
if (-not (Get-Process -Name "detection" -ErrorAction SilentlyContinue)) {
Write-Host "Starting service..."
try {
$processArgs = @{
FilePath = $servicePath
WorkingDirectory = $workingDirectory
RedirectStandardOutput = $logFile
RedirectStandardError = $errorLogFile
WindowStyle = 'Hidden'
PassThru = $true
ErrorAction = 'Stop'
}
$process = Start-Process @processArgs
Write-Host "Service started successfully (PID: $($process.Id))" -ForegroundColor Green
} catch {
Write-Host "Error starting service: $_" -ForegroundColor Red
}
} else {
$status = Get-ServiceStatus
Write-Host "Service is already $status. Cannot start again." -ForegroundColor Yellow
}
}
# 停止服务函数
function Stop-Service {
$process = Get-Process -Name "detection" -ErrorAction SilentlyContinue
if ($process) {
Write-Host "Stopping service (PID: $($process.Id))..."
try {
$process | Stop-Process -Force -ErrorAction Stop
Start-Sleep -Seconds 1 # 给进程一些时间退出
if (-not (Get-Process -Name "detection" -ErrorAction SilentlyContinue)) {
Write-Host "Service stopped successfully." -ForegroundColor Green
} else {
Write-Host "Failed to stop service. Please check manually." -ForegroundColor Red
}
} catch {
Write-Host "Error stopping service: $_" -ForegroundColor Red
}
} else {
Write-Host "Service is not currently running." -ForegroundColor Yellow
}
}
# 重启服务函数
function Restart-Service {
Stop-Service
if (-not (Get-Process -Name "detection" -ErrorAction SilentlyContinue)) {
Start-Sleep -Seconds 1
Start-Service
} else {
Write-Host "Failed to stop service, cannot restart." -ForegroundColor Red
}
}
# 使用任务计划程序设置开机自启
function Set-AutoStart {
Write-Host "Setting service to start on boot using Task Scheduler..."
try {
# 检查是否以管理员身份运行
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
throw "This operation requires administrator privileges. Please run the script as an administrator."
}
# 检查任务是否已存在
$taskExists = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
if ($taskExists) {
Write-Host "Auto-start task already exists. Updating configuration..." -ForegroundColor Yellow
Unregister-ScheduledTask -TaskName $taskName -Confirm:$false
}
# 创建新任务
$action = New-ScheduledTaskAction -Execute $servicePath -WorkingDirectory $workingDirectory
$trigger = New-ScheduledTaskTrigger -AtStartup
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
$principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings -Principal $principal
Register-ScheduledTask -TaskName $taskName -InputObject $task -ErrorAction Stop | Out-Null
Write-Host "Service set to auto start on boot (Task Name: $taskName)." -ForegroundColor Green
Write-Host "Task Scheduler configuration:"
Get-ScheduledTask -TaskName $taskName | Format-List
} catch {
Write-Host "Error setting auto-start: $_" -ForegroundColor Red
}
}
# 取消开机自启
function Remove-AutoStart {
Write-Host "Removing auto-start configuration..."
try {
# 检查是否以管理员身份运行
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
throw "This operation requires administrator privileges. Please run the script as an administrator."
}
$task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
if ($task) {
Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -ErrorAction Stop
Write-Host "Auto-start configuration removed successfully." -ForegroundColor Green
} else {
Write-Host "Auto-start task not found. Nothing to remove." -ForegroundColor Yellow
}
} catch {
Write-Host "Error removing auto-start: $_" -ForegroundColor Red
}
}
# 检查自启状态
function Check-AutoStartStatus {
Write-Host "Checking auto-start configuration..."
try {
$task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
if ($task) {
Write-Host "Auto-start is ENABLED (Task Name: $taskName)" -ForegroundColor Green
$task | Format-List State, Actions, Triggers, Settings
} else {
Write-Host "Auto-start is DISABLED" -ForegroundColor Yellow
}
} catch {
Write-Host "Error checking auto-start status: $_" -ForegroundColor Red
}
}
# 显示服务状态
function Show-Status {
$status = Get-ServiceStatus
Write-Host "Service status: $status" -ForegroundColor Cyan
}
# 脚本菜单
function Show-Menu {
Clear-Host
Write-Host "===================="
Write-Host "Service Management"
Write-Host "===================="
Write-Host "1. Start Service"
Write-Host "2. Stop Service"
Write-Host "3. Restart Service"
Write-Host "4. Set Auto Start (Admin required)"
Write-Host "5. Remove Auto Start (Admin required)"
Write-Host "6. Check Auto Start Status"
Write-Host "7. Check Service Status"
Write-Host "8. Exit"
Write-Host "===================="
Show-Status
}
# 主程序
do {
Show-Menu
$choice = Read-Host "Enter your choice"
switch ($choice) {
1 { Start-Service }
2 { Stop-Service }
3 { Restart-Service }
4 { Set-AutoStart }
5 { Remove-AutoStart }
6 { Check-AutoStartStatus }
7 { Show-Status }
8 { break }
default { Write-Host "Invalid choice. Please try again." -ForegroundColor Red }
}
if ($choice -ne 8) {
Read-Host "Press Enter to continue..."
}
} while ($choice -ne 8)
Write-Host "Exiting service manager..."
Write-Host "Exiting service manager..."
功能介绍
管理服务
- 启停
- 开关自启
- 查看状态
存放
脚本文件需要以 .ps1 结尾
只需要将脚本的路径加入到环境变量的PATH中就可以在powershell中自动补全了
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/19000115

浙公网安备 33010602011771号