Skip to content

PowerShell:基础对象与机制 ​

对象管道、参数与结果输出 ​

PowerShell 使用对象管道。先区分成功输出、诊断信息和错误,再处理文件、CSV 与系统对象;PowerShell 错误和原生程序退出码应分别检查,不能把控制台没有红字当成任务成功。

语言、宿主与平台模块 ​

PowerShell 平台边界分为语言引擎、.NET 运行时和系统模块。PowerShell7 可跨平台,但 Get-Service、注册表提供程序与 Windows 模块不因此都跨平台。准备阶段使用已有7.4宿主,读取脚本与依赖说明,不下载模块;powershell.exe 常指Windows5.1,pwsh 通常指7系列,名称不能代替版本确认。

命令发现与参数绑定 ​

PowerShell 命令发现可以使用 Get-Command、Get-Help 和 Get-Member,分别回答“谁提供命令、如何调用、对象有什么成员”。别名在不同配置里可能变化,脚本写完整 cmdlet 名称。参数绑定按 cmdlet 声明转换数据,-LiteralPath 按字面解释路径,而 -Path 通常支持通配符。

字符串、变量与调用 ​

PowerShell 引用规则中单引号通常是字面字符串,双引号会展开变量;成员表达式放在字符串时使用子表达式。调用带空格的程序路径需要调用运算符 &,它不等于把字符串重新当完整脚本解析。不要为了传参数使用 Invoke-Expression;数组和命名参数更明确。

作用域与输出 ​

PowerShell 作用域决定变量查找与修改位置,点调用会把脚本放入当前作用域。函数内未捕获的表达式也会成为成功流输出,调试文字不应混进结果对象。示例作为独立脚本运行,成功只输出一组指定字段对象,不点调用、不改用户 profile。

练习与参考解答 ​

题目:脚本把两条调试文字用Write-Output发出,再返回一个Category/Total对象。调用者看到三项成功流数据,能否把三项都当作汇总记录?怎样保留诊断而保持结果契约?

参考解答:不能,Write-Output文字也是成功流对象,但不具备Category/Total业务字段,调用者的Count=3不代表三条汇总。应让成功流只输出声明的汇总对象,调试信息通过Verbose等诊断通道或独立日志交付,并保留原错误退出码。点调用还可能污染当前作用域,本例应作为独立脚本调用。

核对资料 ​

作用域、错误流与原生命令状态 ​

先明确PowerShell 7.4、UTF-8 category/count 输入与对象管道,再对照配套示例理解字段校验、错误流、退出码和 Category/Total 对象。

教学版本族:PowerShell 7.4 与 .NET 8 语义;Windows PowerShell 5.1 不获得编码、原生命令传参与模块兼容保证。核对日期2026-10-17,不称为2026最新版。示例未执行,配置与命令需按目标环境验收。

对象管道与格式化边界 ​

PowerShell 对象管道传递带属性的对象,Where-Object 筛选属性,Select-Object 选择字段;Format-Table 输出格式指令,适合显示末端,不适合再 Export-Csv。应在导出之后或独立显示分支格式化。原生命令通常输出文本,不能把 ipconfig 文本当成有 Address 属性的对象。

属性绑定与类型转换 ​

PowerShell 参数绑定可按值或按属性名进行,取决于目标声明,不是对象有同名字段就一定可用。CSV 导入后各列通常是字符串,需要显式校验和转换。将负数、溢出或本地小数格式交给隐式转换可能误判,因此示例只允许有限 ASCII 整数字符串,再转成 long 聚合。

成功流、错误流与退出码 ​

PowerShell 错误流与成功流是不同通道;非终止错误默认可能继续运行,-ErrorAction Stop 可让支持该公共参数的 cmdlet 进入 catch。外部程序的非零退出码另看 LASTEXITCODE,不应假设自动抛异常。本例仅用 cmdlet 和.NET方法,失败退出1或2,成功流不给部分结果。

集合、空值与稳定输出 ​

PowerShell 集合在零项、一项、多项时容易有不同形状,使用 @(...) 固定数组收集结果。空字符串和 null 也不是同义。排序与分组应声明比较语义;示例限制分类为小写 ASCII 标识符,再以 Category 排序,不对任意语言文字排序做跨平台保证。

练习与参考解答 ​

题目:有两个汇总对象alpha/5与beta/4,先Format-Table再Export-Csv后得到格式相关字段,而非Category/Total。另一个采集cmdlet报非终止错误但脚本继续输出汇总。分别指出处理位置与错误边界。

参考解答:Format-Table已把业务对象变成显示格式指令,必须在业务对象阶段直接Export-Csv,显示时再单独Format-Table。支持公共参数的采集cmdlet应在关键步骤使用-ErrorAction Stop,使该错误进入catch并阻止完整成功报告;仅写try/catch不能自动捕获所有非终止错误。原生程序非零码还需另按LASTEXITCODE契约处理。

核对资料 ​

本节沿用本页资料与示例入口。

继续阅读