自定义PowerShell对象和export-clixml的Tostring()方法

时间:2014-11-02 22:44:56

标签: xml object powershell object-to-string psobject

1。我有这些XML- 文件,其中包含来自第三方cmdlet 的数据 export-clixml 作为备份。
它们看起来像这样(只有更多的对象):

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>Deserialized.System.Object</T>
    </TN>
    <ToString>OldDomain\UserName</ToString>
    <Props>
      <S N="AdministratorName">OldDomain\UserName</S>
      <Obj N="AdministratorType" RefId="1">
        <TN RefId="1">
          <T>Deserialized.System.Enum</T>
          <T>Deserialized.System.ValueType</T>
          <T>Deserialized.System.Object</T>
        </TN>
        <ToString>Full</ToString>
        <I32>1</I32>
      </Obj>
    </Props>
  </Obj>
</Objs>

2 即可。我通常将导入这些与import-clixml和管道再次发送到这些第三方cmdlet以重新创建数据。效果很好。

   3 即可。现在我需要在使用之前将* OldDomain *替换为* NewDomain * 所以我导入数据然后替换值:

foreach ($prop in $subobj.psobject.properties) {         
    If ($prop.Value -match $oldval) {
        $prop.Value = ($prop.Value) -replace ($oldval,$newval) 
    }    
}

这在理论上是有效的,如果我在更换后查看对象,它们看起来很好。

4 即可。但在将数据传输到cmdlet之后,我一直收到有关“ OldDomain”的错误 无法使用。 “OldDomain”甚至不应该再出现在对象中......了我花了一段时间,但后来我发现了“OldDomain”来自的地方。 当我在更换值后再次导出对象时,这一点很清楚:

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>Deserialized.System.Object</T>
    </TN>
    <ToString>OldDomain\UserName</ToString>                 <<<<<<<<<<<<
    <Props>
      <S N="AdministratorName">NewDomain\UserName</S>       <<<<<<<<<<<<
      <Obj N="AdministratorType" RefId="1">
        <TN RefId="1">
          <T>Deserialized.System.Enum</T>
          <T>Deserialized.System.ValueType</T>
          <T>Deserialized.System.Object</T>
        </TN>
        <ToString>Full</ToString>
        <I32>1</I32>
      </Obj>
    </Props>
  </Obj>
</Objs>


该值位于tostring() - Method 中。但是为什么在tostring() - 方法中有静态值?它应该是一种方法 由于某种原因,cmdlet在tostring() - Method中使用此值
5. 除了原因之外,我尝试替换tostring()中的值。但它是一种方法,所以我知道覆盖它的唯一方法是添加一个具有相同名称的新方法

$subobj | Add-Member -MemberType scriptmethod -Name tostring {$replVal} -Force

只工作了一半因为它没有用变量 $ replVal 的内容替换tostring()的值,是 NewDomain”),但变量 $ replVal 本身。
所以$ subobj.tostring()是你在$ replval中调用时的所有内容方法tostring(),而不是固定值 所以我需要的是脚本方法的工作就像一个noteproperty,让我分配一个固定的值,比如 tostring()= $ replvalue


所以我不明白。

A)为什么export-clixml文件中的tostring()仍然存在?

B)为什么会有存储对象内的方法(tostring())的固定值?

C)最重要的是:如何更换固定值在tostring()里面?


谢谢和最好的问候,ffm



1 个答案:

答案 0 :(得分:1)

A)我不确定,但是对象在导出中的方法定义确实有意义。

B)如果我的A)的原因是真的(并且它可能不是),那么这是静态的将是在文件中编写方法定义的实现中的错误。基本上,我认为你是对的而且不应该这样。

C)

$subobj | Add-Member -MemberType ScriptMethod -Name ToString -Value {$this.AdministatorName} -Force

不确定我是否正确使用该属性名称(AdministatorName)。但是脚本方法定义中的$this引用了对象,因此您可以通过编程方式获取它。

讨论后编辑:

$replVal = 'A value'
$block = [ScriptBlock]::Create("'{0}'" -f ($replVal -replace "'","``'"))
$subobj | Add-Member -MemberType ScriptMethod -Name ToString -Value $block -Force

这样您就可以在不更改$replVal的值的情况下更改ToString()