最后活跃于 1757166567

在关闭电脑前进行一些安全检查

修订 e69d2bbaf0493fe51e4be3fdb451a7305638f3d1

safe-shutdown.ps1 原始文件
1# 安全关机脚本
2# 需要管理员权限运行
3
4# 检查是否以管理员身份运行
5if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
6 Write-Host "请以管理员身份运行此脚本!" -ForegroundColor Red
7
8 Pause
9 # 退出当前非管理员进程
10 exit 1
11}
12
13Write-Host "开始执行安全关机流程..." -ForegroundColor Green
14
15# 配置参数
16$virtualBoxVMs = @("CentOS", "fnOS") # 替换为您的虚拟机名称
17$podmanContainers = @("filecodebox") # 替换为您的容器名称
18$vboxManagePath = "C:\Users\NAS\Programs\VirtualBox\VBoxManage.exe"
19
20# 1. 关闭VirtualBox虚拟机
21Write-Host "`n1. 检查并关闭VirtualBox虚拟机..." -ForegroundColor Yellow
22
23if (Test-Path $vboxManagePath) {
24 foreach ($vm in $virtualBoxVMs) {
25 Write-Host "检查虚拟机: $vm" -ForegroundColor Cyan
26
27 # 检查虚拟机状态
28 $vmStatus = & $vboxManagePath showvminfo $vm --machinereadable 2>$null | Select-String "VMState="
29
30 if ($vmStatus) {
31 $state = $vmStatus -replace 'VMState="|"', ''
32 Write-Host "虚拟机 $vm 状态: $state"
33
34 if ($state -eq "running") {
35 Write-Host "正在关闭虚拟机: $vm" -ForegroundColor Yellow
36 & $vboxManagePath controlvm $vm acpipowerbutton
37
38 # 等待虚拟机优雅关闭(最多30秒)
39 $timeout = 30
40 $counter = 0
41 while (($state -eq "running") -and ($counter -lt $timeout)) {
42 Start-Sleep -Seconds 1
43 $counter++
44 $vmStatus = & $vboxManagePath showvminfo $vm --machinereadable 2>$null | Select-String "VMState="
45 if ($vmStatus) {
46 $state = $vmStatus -replace 'VMState="|"', ''
47 }
48 }
49
50 if ($state -eq "running") {
51 Write-Host "强制关闭虚拟机: $vm" -ForegroundColor Red
52 & $vboxManagePath controlvm $vm poweroff
53 } else {
54 Write-Host "虚拟机 $vm 已成功关闭" -ForegroundColor Green
55 }
56 } else {
57 Write-Host "虚拟机 $vm 未运行,跳过关闭" -ForegroundColor Gray
58 }
59 } else {
60 Write-Host "未找到虚拟机: $vm" -ForegroundColor Gray
61 }
62 }
63} else {
64 Write-Host "未找到VirtualBox (路径: $vboxManagePath),跳过虚拟机关闭步骤" -ForegroundColor Gray
65}
66
67# 2. 关闭Podman容器和服务
68Write-Host "`n2. 检查并关闭Podman容器和服务..." -ForegroundColor Yellow
69
70# 关闭Podman容器
71if (Get-Command "podman" -ErrorAction SilentlyContinue) {
72 foreach ($container in $podmanContainers) {
73 Write-Host "检查容器: $container" -ForegroundColor Cyan
74
75 # 检查容器是否存在且运行中
76 $containerInfo = podman ps -a --filter "name=$container" --format "{{.Names}}:{{.State}}"
77
78 if ($containerInfo) {
79 $containerState = $containerInfo.Split(':')[1]
80 Write-Host "容器 $container 状态: $containerState"
81
82 if ($containerState -eq "running") {
83 Write-Host "正在停止容器: $container" -ForegroundColor Yellow
84 podman stop $container
85
86 # 检查停止是否成功
87 Start-Sleep -Seconds 2
88 $newState = (podman ps -a --filter "name=$container" --format "{{.State}}")
89 if ($newState -eq "exited") {
90 Write-Host "容器 $container 已成功停止" -ForegroundColor Green
91 } else {
92 Write-Host "容器 $container 停止失败" -ForegroundColor Red
93 }
94 } else {
95 Write-Host "容器 $container 未运行,跳过停止" -ForegroundColor Gray
96 }
97 } else {
98 Write-Host "未找到容器: $container" -ForegroundColor Gray
99 }
100 }
101
102 # 停止所有正在运行的容器(额外安全措施)
103 Write-Host "检查是否有其他运行中的容器..." -ForegroundColor Cyan
104 $runningContainers = podman ps -q --filter "status=running"
105 if ($runningContainers) {
106 Write-Host "停止所有运行中的容器..." -ForegroundColor Yellow
107 podman stop $runningContainers
108 }
109
110 # 关闭Podman服务(如果使用Podman Machine)
111 Write-Host "检查Podman服务状态..." -ForegroundColor Cyan
112 $podmanService = Get-Service -Name "Podman Machine" -ErrorAction SilentlyContinue
113 if ($podmanService) {
114 if ($podmanService.Status -eq "Running") {
115 Write-Host "正在停止Podman服务..." -ForegroundColor Yellow
116 Stop-Service -Name "Podman Machine" -Force
117 Write-Host "Podman服务已停止" -ForegroundColor Green
118 } else {
119 Write-Host "Podman服务未运行" -ForegroundColor Gray
120 }
121 }
122} else {
123 Write-Host "未找到Podman,跳过容器关闭步骤" -ForegroundColor Gray
124}
125
126# 3. 执行netsh winsock reset
127Write-Host "`n3. 执行netsh winsock reset..." -ForegroundColor Yellow
128try {
129 netsh winsock reset
130 Write-Host "netsh winsock reset 执行成功" -ForegroundColor Green
131} catch {
132 Write-Host "执行netsh winsock reset时出错: $_" -ForegroundColor Red
133}
134
135Write-Host "`n安全关机流程完成!" -ForegroundColor Green
136Write-Host "您现在可以安全地关闭计算机。" -ForegroundColor Green
137
138# 可选:自动关机(取消注释以下行以启用自动关机)
139# Write-Host "系统将在10秒后自动关机..." -ForegroundColor Yellow
140# Start-Sleep -Seconds 10
141# Stop-Computer -Force
142
143# 暂停以便查看输出结果
144Write-Host "`n按任意键退出..." -ForegroundColor Gray
145$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")