有什么方法可以在不丢失任何音符属性的情况下修改字符串?
$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
答案 0 :(得分:5)
NoteProperty
实例与您要传递给Add-Member
的特定对象(字符串)实例相关。
通过为变量$t
($t = 'else'
)分配一个不同字符串实例,原始实例将丢失,并且您拥有的NoteProperty
也将丢失添加。
还要注意,[string]
实例即使由NoteProperty成员修饰,也永远不会具有.value
属性。但是,诸如ConvertTo-Json
之类的cmdlet可能会赋予外观一个.value
属性,因为这是它们使用NoteProperty成员序列化字符串或.NET基本类型的方式。
通常,最好避免将NoteProperty成员添加到字符串和.NET value types 的实例中,这有两个原因:
您不能自行修改这些对象,只能将它们替换为修改后的副本(存储在同一变量中),并且这些副本总是会执行>没有具有原始的NoteProperty成员。
即使不进行任何修改,在以下情况下,将装饰有NoteProperty的字符串或值类型作为参数值传递也可能导致NoteProperty成员丢失:
[string[]
类型的参数收到修饰后的[string]
实例)如果将目标参数声明为输入类型,并且输入类型是 string 或.NET 原始类型,则包括以下值类型:[Bool], [Byte], [SByte], [Int16], [UInt16], [Int32], [UInt32], [Int64], [UInt64], [IntPtr], [UIntPtr], [Char], [Double], [Single]
。
但是,将此类实例传递给 untyped 或-实际上是相同的-[object]
类型的参数或[object[]
类型的参数做< / em>保存装饰。