2

1.我有这些 XML-文件,其中包含来自通过 export-clixml导出的3rd-Party cmdlet的数据作为备份。    它们看起来像这样(只有更多的对象):


<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 导入它们,然后将它们再次通过管道传输到这些 3rd-party cmdlet 以重新创建数据。效果很好。

3 . 现在我需要用 *NewDomain* 替换 *OldDomain*,然后再使用它们。
所以我导入数据然后替换值:

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() 方法中使用了这个值。5.除了这个原因,我尝试替换 tostring() 中的值。但它是一种方法,所以我知道覆盖它的唯一方法是添加一个同名的新方法:




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

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


所以我不明白。

A)为什么 tostring() 在 export-clixml - 文件中?

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

C)最重要的是:如何替换 tostring() 中的固定值?

 
谢谢和最好的问候, ffm


   

4

1 回答 1

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()

于 2014-11-02T22:54:59.937 回答