新增 steps/ 拆解版本(每段獨立 .bat 雙擊跑)+ Run-Setup.bat;端對端驗證後修 11 處 bug
steps/ 把 Setup.ps1 拆成 18 個獨立步驟(00-17),每段:
- _common.ps1 提供 Log/Section/Set-RegValue/Wait-Network helper
- 各段一個 .ps1 + 同名 .bat(自動 UAC 提權)
- _admin-shell.bat 開一個已提權 cmd,從那裡跑各 .bat 不再被 UAC 問
- RUN-ALL.bat 依序跑 00..17
- _template.bat 全部 .bat 共用樣板
- README.txt 用法說明
從 macOS WinRM 端對端跑過所有 18 段、發現並修:
- 02-rdp-enable-3389:'Remote Desktop' display group 在某些 Win11 SKU 不存在,
改顯式 New-NetFirewallRule + Restart-Service TermService
- 04-winrm-enable:開頭加 Set-NetConnectionProfile -NetworkCategory Private fallback,
避免 winrm quickconfig 在 Public profile 拒絕啟用
- 11-kms-activate:原本 'successful|成功' 正則在 Big5 codepage 下 mojibake 出 '{x,y}',
改用 SoftwareLicensingProduct.LicenseStatus -eq 1 WMI 判斷
- 12-winget-install-chrome:加 --source winget,避開 msstore 憑證錯誤造成的歧義
- 13-remove-windows-ai:拿掉 -AllOptions,顯式 10 個 option 排除 UpdateCleanupCheck
(DISM Cleanup-Image + sfc + MessageBox 在 Session-0 default Yes 觸發 Restart-Computer)
- 14-win11debloat:加 -Sysprep(寫到 Default profile 不撞 HKCU 鎖),
從 config 移除 DisableSearchHistory/DisableSearchHighlights/HideSearchTb
(它們的 reg.exe import 會被「存取被拒」擋住)
- 07-apply-ui-ime-default-profile:補上 IsDeviceSearchHistoryEnabled / IsDynamicSearchBoxEnabled
替代上面從 Win11Debloat 拔掉的兩項
- 新增 00-network-private 步驟把所有 NetConnectionProfile 改 Private
- 全部 19 個 .ps1 加 UTF-8 BOM,避免 CHT Windows PS5.1 fallback ANSI 讀中文 mojibake
- 全部 .bat REM 註解改 ASCII,根除「'券蠶setup.log' 不是內部命令」那種亂碼
Run-Setup.bat:當 unattend.xml FirstLogonCommands 沒成功跑起 Setup.ps1 時,
把這支從 USB 雙擊執行,會 UAC 提權 + 從 USB 重拷 + 跑 + console 即時印 + 收 log
This commit is contained in:
47
steps/_common.ps1
Normal file
47
steps/_common.ps1
Normal file
@@ -0,0 +1,47 @@
|
||||
# _common.ps1 — 給 steps/*.ps1 dot-source 用的共用 helper
|
||||
# 每個 step.ps1 開頭會:. "$PSScriptRoot\_common.ps1"
|
||||
|
||||
$ErrorActionPreference = 'Continue'
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
|
||||
$global:LogFile = 'C:\Windows\Temp\setup.log'
|
||||
|
||||
if (-not (Test-Path 'C:\Windows\Temp')) {
|
||||
New-Item -ItemType Directory -Path 'C:\Windows\Temp' -Force | Out-Null
|
||||
}
|
||||
|
||||
function Log {
|
||||
param([string]$msg)
|
||||
$line = '[{0}] {1}' -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'), $msg
|
||||
Add-Content -Path $LogFile -Value $line -Encoding UTF8
|
||||
Write-Host $line
|
||||
}
|
||||
|
||||
function Section {
|
||||
param([string]$name, [scriptblock]$block)
|
||||
Log "=== $name START ==="
|
||||
try {
|
||||
& $block
|
||||
Log "=== $name DONE ==="
|
||||
} catch {
|
||||
Log "=== $name ERR: $($_.Exception.Message) ==="
|
||||
}
|
||||
}
|
||||
|
||||
function Set-RegValue {
|
||||
param([string]$Path, [string]$Name, $Value, [string]$Type = 'DWord')
|
||||
if (-not (Test-Path $Path)) { New-Item -Path $Path -Force | Out-Null }
|
||||
New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $Type -Force | Out-Null
|
||||
}
|
||||
|
||||
function Wait-Network {
|
||||
param([int]$timeoutSec = 60)
|
||||
$i = 0
|
||||
$max = [int]($timeoutSec / 2)
|
||||
while ($i -lt $max -and -not (Test-Connection 8.8.8.8 -Count 1 -Quiet -ErrorAction SilentlyContinue)) {
|
||||
Start-Sleep 2
|
||||
$i++
|
||||
}
|
||||
Log "Network wait: $($i*2)s"
|
||||
}
|
||||
Reference in New Issue
Block a user