装机时遇到条件语句报错?手把手教你稳住异常

装机不是只插线、拧螺丝那么简单。尤其当你在写启动脚本、批处理自动部署,或者用 PowerShell 配置系统环境时,一个没兜住的条件判断,可能直接卡死整个安装流程——比如判断硬盘是否存在却忘了磁盘没初始化,结果脚本崩了,装到一半停住,重来又耗时间。

别让 if 语句成“定时炸弹”

常见情况:你写了这样的批处理片段:

if exist C:\Drivers\nvidia.inf (\n    echo 正在安装显卡驱动\n    dism /online /add-driver /driver:C:\Drivers\nvidia.inf\n) else (\n    echo 驱动文件缺失,跳过安装\n)

看着没问题?但万一 C:\Drivers 这个目录本身权限被锁死,或者路径里混进了中文/空格没加引号,if exist 就会静默失败,后续命令照常执行,结果驱动压根没装上,你还以为跳过了。

PowerShell 里更得“多长一只眼”

PowerShell 条件更灵活,但也更容易翻车。比如检查注册表项是否存在:

if (Test-Path "HKLM:\SOFTWARE\MyApp") {\n    $ver = Get-ItemProperty -Path "HKLM:\SOFTWARE\MyApp" -Name Version -ErrorAction SilentlyContinue\n    if ($ver.Version -ge "2.1") {\n        Write-Host "版本达标,继续配置"\n    }\n}

这里漏了两处关键防护:Test-Path 能测路径,但不保证你有读权限;Get-ItemProperty 一旦拿不到值,$ver.Version 就是 null,直接比较会报错。正确做法是加一层判断或用 -ErrorAction Stoptry/catch

try {\n    if (Test-Path "HKLM:\SOFTWARE\MyApp") {\n        $ver = Get-ItemProperty -Path "HKLM:\SOFTWARE\MyApp" -Name Version -ErrorAction Stop\n        if ($ver.Version -and [version]$ver.Version -ge [version]"2.1") {\n            Write-Host "版本达标,继续配置"\n        }\n    }\n} catch {\n    Write-Warning "读取注册表失败:$($_.Exception.Message)"\n    # 可选:写日志、弹提示、或走默认配置\n}

实用小技巧,装机脚本少踩坑

• 判断文件存在前,先确认盘符已挂载(Get-PSDrive Cfsutil volume diskfree C:);
• 所有路径统一加双引号,含变量也别省:"$env:SYSTEMROOT\System32\drivers\etc\hosts"
• 批处理中用 if errorlevel 1 比单纯看返回码更可靠;
• 关键步骤后加 echo %errorlevel%Write-Host $? -ForegroundColor Yellow,一眼看清上一步是否真成功。

装机脚本不是越短越好,而是越稳越省事。把异常当常态来防,比出问题再查 Event Viewer 快得多。