这个现象不是“Select-Object 一用就会改原对象”。按 PowerShell 7.5 官方文档示例14,在该示例使用ExpandProperty 展开子对象,同时又选择其他属性或计算属性时,出现给被展开的原对象添加NoteProperty的情况;不能把该操作当成总会创建隔离副本。因此要先限定到具体命令组合和具体对象,不能把它推广到所有 Select-Object 用法。

观察时,先把命令拆成三件事:有没有 ExpandProperty;有没有同时配合 Property 或计算属性;被改的是展开出来的子对象,还是原始对象。再看操作前后对象的成员列表,确认新增的是不是 NoteProperty,以及新增发生在哪一层。官方示例14只说明该组合下的行为,不能据此推断其他参数组合也会这样。版本上,本文依据的是 Microsoft 官方 PowerShell 7.5 文档;本机版本与实际命令组合需另核,不把本示例扩大成全部Select-Object行为。
适用条件应写清楚:如果只是普通的属性选择,没有 ExpandProperty 与 Property 或计算属性同时出现,就不要套用这个结论;如果业务对象是多层子对象,也要看 ExpandProperty 展开的是哪一层。
风险主要在两点。其一,若直接拿生产配置对象做增删成员试验,可能把原配置的成员状态改掉,后续读取或序列化结果就不可靠。其二,看到“新建对象”也不要理解成自动隔离了所有层级;官方示例只针对该组合说明会改动原对象,并没有承诺通用复制效果。更稳妥的做法是保留原配置副本,在副本或隔离会话中复现,记录操作前后的成员差异,再决定是否修改脚本。
下一步,先核对本机 PowerShell 版本、命令中是否同时存在 ExpandProperty 与 Property 或计算属性,以及实际被改对象是哪一层。若业务要求不改变输入对象,就不要依赖 Select-Object 帮你隔离,而应按业务字段重新构造新对象,把需要的值取出来再组装。这样处理后,原配置副本仍可保留,排查也能停留在可回退范围内;具体命令和结果应以本机核对为准,不拿未验证的检测结论代替。
城关区台式电脑用户可拨400-877-9605,先整理ExpandProperty和Property组合、对象层级与去敏成员前后差异。电脑快修网提供信息展示与第三方维修对接,具体地址、电脑侧检查是否支持及安排需当次核实,启用范围不代表即时履约。