PowerShell使用Add-Member赋值时[int]类型转换被当作值的问题咨询
问题解答
这是操作错误导致的正常现象,并非PowerShell的Bug,核心原因是PowerShell的双解析模式机制。
原因说明
PowerShell存在两种解析模式:表达式模式、参数模式:
- 调用命令时给参数传值的场景下,默认进入参数模式,该模式下纯字面量形式的类型转换语法不会被识别为运算逻辑,会被直接当作字符串处理。
- 你给
Add-Member的-Value参数传入[int]$name1时,参数解析器没有把[int]识别为类型转换运算符,直接将其与$name1的取值拼接为字符串[int]4,因此出现了不符合预期的赋值结果。该逻辑和直接执行Write-Host [int]4会输出字符串[int]4是同一个机制。 - 你使用
$()子表达式运算符包裹的写法是正确的:子表达式内部会进入表达式解析模式,会先完成类型转换运算得到整型值4再传给参数,因此name2、name3的赋值结果符合预期。
正确写法参考
如果要给-Value参数传入类型转换后的结果,有两种常用的正确写法:
- 用子表达式包裹转换逻辑:
$myObject | Add-Member -type NoteProperty -name name1 -Value $([int]$name1)
- 提前完成转换后再传参:
$name1_int = [int]$name1 $myObject | Add-Member -type NoteProperty -name name1 -Value $name1_int
内容的提问来源于stack exchange,提问作者badbob001
相关产品推荐
相关产品推荐

