是否可以修改带有音符属性的字符串

时间:2019-12-12 21:18:09

标签: powershell

有什么方法可以在不丢失任何音符属性的情况下修改字符串?

$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

1 个答案:

答案 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成员丢失:

    • 如果目标参数被声明为输入类型的 array (例如,如果[string[]类型的参数收到修饰后的[string]实例)
    • 如果将目标参数声明为输入类型,并且输入类型是 string 或.NET 原始类型,则包括以下值类型:[Bool], [Byte], [SByte], [Int16], [UInt16], [Int32], [UInt32], [Int64], [UInt64], [IntPtr], [UIntPtr], [Char], [Double], [Single]

    • 但是,将此类实例传递给 untyped 或-实际上是相同的-[object]类型的参数或[object[]类型的参数做< / em>保存装饰。