複製貼上這個範例腳本,並根據你的環境進行修改:
<# .劇情簡介 顯示安全啟動部署協調器的當前狀態。
.DESCRIPTION 提供即時的部署進度可視性: - 當前波數與目標裝置 - 裝置更新與待處理 - 需要處理的堵塞桶 - 近期活動記錄 - 儀表板連結 隨時跑這個測試看看推送進度。
.PARAMETER ReportBasePath 編排器使用的報告/狀態目錄路徑
.PARAMETER ShowLog 顯示最近 50 行 (日誌條目)
.PARAMETER ShowBlocked 顯示阻塞桶的詳細資料
.PARAMETER ShowWaves 裝置數量的秀波歷史
.PARAMETER Watch 每N秒持續刷新狀態
.PARAMETER OpenDashboard 在瀏覽器中開啟最新的 HTML 儀表板
.EXAMPLE .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath 「C:\SecureBootReports」
.EXAMPLE .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath 「C:\SecureBootReports」 -Watch 30
.EXAMPLE .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath “C:\SecureBootReports” -OpenDashboard #>
[CmdletBinding()] 參數 ( [參數 (強制 = $true) ] [string]$ReportBasePath, [參數 (強制 = $false) ] [切換]$ShowLog, [參數 (強制 = $false) ] [開關]$ShowBlocked, [參數 (強制 = $false) ] [開關]$ShowWaves, [參數 (強制 = $false) ] [int]$Watch = 0, [參數 (強制 = $false) ] [切換]$OpenDashboard )
$ErrorActionPreference = "Stop" $DownloadUrl = 「https://aka.ms/getsecureboot」 $DownloadSubPage = 「部署與監控樣本」
# Note: This script has no dependencies on other scripts. # 完整工具組請下載:$DownloadUrl -> $DownloadSubPage
# ============================================================================ # 輔助功能 # ============================================================================
function ConvertTo-Hashtable { 參數 ([參數 (ValueFromPipeline = $true) ]$InputObject) 過程 { 若 ($null -eq $InputObject) { 返回 @{} } 如果 ($InputObject -is [System.Collections.IDictionary]) { return $InputObject } 如果 ($InputObject -是 [PSCustomObject]) { $hash = @{} 在 $InputObject.PSObject.Properties) { 中每個 ($prop $hash[$prop。姓名] = ConvertTo-Hashtable $prop。價值 } 回歸$hash } 若 ($InputObject -是 [System.Collections.IEnumerable] -且 $InputObject -isnot [字串]) { 回覆 @ ($InputObject |ForEach-Object { ConvertTo-Hashtable $_ }) } $InputObject } }
function Show-Status { $stateDir = Join-Path $ReportBasePath「RolloutState」 $rolloutStatePath = Join-Path $stateDir「RolloutState.json」 $blockedBucketsPath = Join-Path $stateDir「BlockedBuckets.json」 清除宿主 Write-Host「」 Write-Host (“=” * 80) -前景色彩 青色 Write-Host「安全啟動狀態」-ForegroundColor 青色 Write-Host 「$ (Get-Date -格式 'yyyy-mm-dd HH:mm:ss') 」 -前景灰色 Write-Host (“=” * 80) -前景色 青色 Write-Host「」 # 檢查編排任務是否正在執行 $task = Get-ScheduledTask -TaskName “SecureBoot-Rollout-Orchestrator” -ErrorAction silentlyContinue 如果 ($task) { $taskState = $task。州 $color = 若 ($taskState -eq 「運行中」) { 「綠色」 } 否則 ($taskState -eq 「準備」) { 「黃色」 } 否則 { 「紅色」 } Write-Host「排程任務:」-NoNewline Write-Host $taskState -前景色彩$color } 否則 { Write-Host「排程任務:」-NoNewline Write-Host 「未安裝」-前景灰色 } # 載入啟動狀態 如果 (-not (測試路徑$rolloutStatePath) ) { Write-Host「」 Write-Host「找不到啟動狀態。 編曲者可能還沒開始。」——前景黃色 Write-Host「狀態路徑:$rolloutStatePath」-前景灰色 回歸 } $state = Get-Content $rolloutStatePath -原始 |ConvertFrom-Json |ConvertTo 雜湊表 Write-Host「」 Write-Host「推出進度」-前景色:黃色 Write-Host (“-” * 40) $status = $state。現況 $statusColor = 開關 ($status) { 「完成」 { 「綠色」 } 「進展中」 { 「青色」 } 「未開始」 { 「灰色」 } 預設 { 「白色」 } } Write-Host 「狀態:」-NoNewline Write-Host $status -前景色彩$statusColor Write-Host「當前浪: ($state 美元。CurrentWave) ” Write-Host「目標總額: ($state 美元。TotalDevices Targeted) 」 Write-Host「總更新:$ ($state。TotalDevices更新) 」 如果 ($state。開始) { Write-Host「開始:$ ($state。從) 開始」 } 如果 ($state。LastAggregation) { Write-Host「最後支票: ($state 美元。最後彙整) 」 } 如果 ($state。完成於) { Write-Host「完成:$ ($state。完成於) 」-前景綠色 } # 顯示進度條 如果 ($state。TotalDevicesTargeted -gt 0) { $pct = 如果 ($state。TotalDevicesUpdated -和$state。TotalDevicesTargeted) { [數學]:: ( ($state 回合。TotalDevicesUpdated / $state。TotalDevicesTargetd) * 100,1) } 否則 { 0 } Write-Host「」 Write-Host 「進展:」-NoNewline $barWidth = 40 $filled = [數學]::地板 ($barWidth * $pct / 100) Write-Host 「[“ -NoNewline Write-Host (“█” * $filled) -前景顏色 綠色 -noNewline Write-Host (「░」* ($barWidth - $filled) ) -前景色 深灰色 -無新行 Write-Host 「] $pct%」 } # 堵塞桶摘要 若 (測試路徑$blockedBucketsPath) { $blocked = Get-Content $blockedBucketsPath -原始 |ConvertFrom-Json |ConvertTo 雜湊表 如果 ($blocked。Count -gt 0) { Write-Host「」 Write-Host 「阻塞桶:」-無新行 -前景紅色 Write-Host「$ ($blocked。數) 桶需要注意」——前景紅色 如果 ($ShowBlocked) { Write-Host「」 每個 ($key 在$blocked。鑰匙) { $info = $blocked[$key] Write-Host 「► $key」-前景紅色 Write-Host 「理由: ($info 美元。」原因) “ -前景灰色 Write-Host 「裝置: ($info 美元。故障裝置) “ -前景灰色 Write-Host 「自:$ ($info。) 秒被封鎖 -前景灰色 } } 否則 { Write-Host 「用 -ShowBlocked 以獲取細節」-ForegroundColor Gray } } } # 浪潮歷史 如果 ($ShowWaves -和$state。WaveHistory 與 $state。WaveHistory.Count -gt 0) { Write-Host「」 Write-Host 「浪潮歷史」-前景色:黃色 Write-Host (“-” * 40) 每個 ($wave$state。波浪歷史) { Write-Host「揮手$ ($wave。波號) :「-無新行 -前景色青色 Write-Host「$ ($wave」。裝置計數) 裝置」-NoNewline Write-Host “ - ($wave 美元。開始於) 」-前景灰色 } } # 最新儀表板 $latestAggregation = Get-ChildItem -路徑 $ReportBasePath -Directory -過濾器「Aggregation_*」 -ErrorAction 靜默繼續 | Sort-Object 名稱 - 降序 | Select-Object -第一 如果 ($latestAggregation) { $dashboard = Get-ChildItem -路徑 $latestAggregation.FullName -Filter “*Dashboard*.html” -ErrorAction SilentlyContinue | Select-Object -第一 如果 ($dashboard) { Write-Host「」 Write-Host 「最新儀表板」-前景色 黃色 Write-Host $dashboard。全名 - 前景灰色 如果 ($OpenDashboard) { Start-Process $dashboard。全名 } } } # 近期紀錄 如果 ($ShowLog) { $logFile = Get-ChildItem -路徑 $stateDir -過濾器「Orchestrator_*.log」 -錯誤動作靜默繼續 | Sort-Object 名稱 - 下降 | Select-Object -第一 如果 ($logFile) { Write-Host「」 Write-Host 「近期日誌」-前景色:黃色 Write-Host (“-” * 40) Get-Content $logFile.全名 -尾巴20 |ForEach-Object { 如果 ($_ -匹配 '\[ERROR\]') { Write-Host $_ -前景紅色 } 否則 ($_ -match '\[Warrn\]') { Write-Host $_ -前景顏色 黃色 } elseif ($_ -match '\[OK\]') { Write-Host $_ -前景綠色 } 否則 ($_ -match '\[WAVE\]') { Write-Host $_ -前景色青色 } 否則 { Write-Host $_ -前景灰色 } } } } Write-Host「」 Write-Host (“-” * 80) -前景色彩 深灰色 如果 (-not $ShowLog -或 -not $ShowWaves -或 -not $ShowBlocked) { Write-Host 「選項:-ShowLog |-ShowWaves |-ShowBlocked |-OpenDashboard |-Watch 30“ -前景色彩 深灰色 } }
# ============================================================================ # 主線 # ============================================================================
if (-not (Test-Path $ReportBasePath)) { Write-Host 「報告路徑未找到:$ReportBasePath」-前景紅色 出口1 }
if ($Watch -gt 0) { Write-Host「每 $Watch 秒監控狀態。 按 Ctrl+C 停止。」-前景青色 雖然 ($true) { 節目狀態 Start-Sleep -幾秒$Watch } } 否則 { 節目狀態 }