有没有办法在不丢失任何音符属性的情况下修改字符串?
$t = 'something'|Add-Member noteproperty one 1 -PassThru
$t.one
1
$t = 'else'
$t.one
<nothing here>
$t.value = 'else' # The property 'value' cannot be found on this object
Run Code Online (Sandbox Code Playgroud)
简而言之:不,您不能在[string]不丢失任何NoteProperty附加到先前值的实例级成员的情况下修改变量的值。
该NoteProperty实例与您通过管道传输到的特定对象(字符串)实例相关联Add-Member。[1]
通过将不同的字符串实例分配给变量$t( $t = 'else'),原始实例将丢失,并且NoteProperty您已添加的实例随之丢失。
另请注意[string],即使使用 NoteProperty 成员修饰实例,也永远不会拥有.value属性。然而,小命令如ConvertTo-Json可以给外观,有一个.value属性,因为这是他们如何序列化一个字符串或.NET与NoteProperty成员基本类型。
通常,最好避免将 NoteProperty 成员添加到.NET值类型的字符串和实例,原因有两个:
你不能自己修改这样的实例,你只能用修改后的副本(存储在同一个变量中)替换它们,并且这些副本总是没有原始的 NoteProperty 成员。
即使没有修改,在以下情况下,将 NoteProperty 修饰的字符串或值类型作为参数值传递会导致实例级 NoteProperty 成员丢失:
如果目标参数被声明为特定输入类型和输入类型是任一字符串([string])或.NET基本类型,其包括以下值类型:[Bool], [Byte], [SByte], [Int16], [UInt16], [Int32], [UInt32], [Int64], [UInt64], [IntPtr], [UIntPtr], [Char], [Double], [Single]。
此外 - 这适用于所有值类型实例以及[string]- 如果目标参数被声明为特定输入类型的数组(例如,如果[datetime[]]-typed 参数接收装饰[datetime]实例)
但是,将此类实例传递给无类型或 - 实际上是相同的 - [object]- 或 -[object[]]类型参数确实保留了装饰。
[1] 从技术上讲,[string]仅就实例而言,它是一个[psobject]与实例级别NoteProperty相关联的不可见包装器- 如果使用[string]实例本身,则可能会由于 .NET CLR 字符串实习而出现问题,其中看似单独的字符串具有相同的content 可以指向与优化完全相同的实例 - 并且特定于实例的内容NoteProperty不应意外地出现在用户期望的不同字符串上。