核心用法
本技能聚焦于 PowerShell 7+ (pwsh) 的核心陷阱与最佳实践,涵盖以下关键领域:
1. 输出行为控制
- 隐式输出:PowerShell 中任何未捕获的表达式都会输出,即使没有
return语句。return仅表示退出点,不会阻止之前的输出。 - 抑制输出:使用
$null = Function()或[void](Function())显式丢弃不需要的输出。 - 显示 vs 数据:
Write-Host直接写入控制台,绕过管道;数据传递应依赖隐式输出或Write-Output。
2. 数组陷阱
- 标量 vs 数组:单元素结果自动降级为标量,使用
@(expression)强制数组包装。 - 空结果处理:空查询返回
$null而非空数组,需用if ($result)而非if ($result.Count -eq 0)判断。 - 性能优化:
+=在循环中创建新数组,大数据量时应换用[System.Collections.ArrayList]。
3. 比较运算符
- 语法差异:使用
-eq、-ne、-gt、-lt,而非 C 风格的==、!=、>、<。 - 空值安全:始终将
$null放在左侧($null -eq $var),避免数组比较时的意外行为。 - 成员检测:
-contains用于数组成员检查,支持管道友好操作。
4. 跨平台兼容
- 版本识别:
pwsh指向 PowerShell 7+,powershell为 Windows 旧版 5.1。 - 路径处理:优先使用
Join-Path,避免硬编码分隔符。 - 别名风险:
ls、cat等平台别名不可靠,脚本中应使用完整 Cmdlet 名称。
显著优点
- 实战导向:直击 PowerShell 最频繁的踩坑点,节省调试时间。
- 跨平台覆盖:明确区分 Windows PowerShell 与 PowerShell Core 差异。
- 性能意识:包含数组操作、管道流式处理等性能关键建议。
潜在缺点与局限性
- 版本限定:内容针对 PowerShell 7+,部分语法在 Windows PowerShell 5.1 中不完全适用。
- 深度有限:属于速查手册风格,复杂场景(如 DSC、JEA 等高级功能)未涉及。
- Windows 偏向:虽然标注跨平台,但部分陷阱(如别名差异)仍以 Windows 用户视角为主。
适合人群
- 从 Bash/Python/C# 等语言迁移至 PowerShell 的开发者
- 需要编写可移植跨平台脚本的 DevOps/SRE 工程师
- 维护现有 PowerShell 代码库、希望减少技术债务的团队
常规风险
- 隐式输出泄漏敏感数据:未正确抑制输出的函数可能在管道中意外暴露信息。
- 数组/标量混淆导致逻辑错误:单元素自动降级可能破坏下游的类型敏感操作。
- 错误处理遗漏:非终止错误默认继续执行,
try/catch需配合-ErrorAction Stop才有效。 - 平台差异脚本失败:依赖 Windows 特有别名或路径格式的脚本在 Linux/macOS 上直接报错。