2

1. export-clixmlを介し てバックアップとしてエクスポートされたサードパーティのコマンドレットからのデータを含むこれらの XMLファイルがあります。    それらは次のようになります (より多くのオブジェクトがある場合のみ):


<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 でインポートし、これらのサードパーティ コマンドレットに再度パイプしてデータを再作成します。よく働く。

3 . これらを使用する前に、 *OldDomain* を *NewDomain*に置き換える必要があります。
だから私はデータをインポートしてから値を置き換えます:

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

これは理論的には機能し、交換後にオブジェクトを見ると、問題なく見えます。
 
4 . しかし、データをコマンドレットにパイプした後、「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()- Methodに静的な値があるのでしょうか? METHOD であるはずです。 何らかの理由で、コマンドレットは tostring() メソッド内でこの値を使用します。5.この理由とは別に、tostring() 内の値を置き換えてみました。しかし、それはメソッドなので、これをオーバーライドする唯一の方法は、同じ名前の新しいメソッドを追加することです:




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

これは、 tostring () の値を変数 $replValの内容( " NewDomain") ではなく、変数$replVal自体で置き換えたため、半分しか機能しませんでした。したがって、$subobj.tostring() は、固定値ではなく、メソッド tostring() を呼び出すときに $replval にあるものです。 だから私が必要とするのは、scriptmethod が noteproperty のように機能し、tostring () = $replvalueのように固定値を割り当てられるようにすることです。




A)なぜ tostring() が export-clixml - ファイルにあるのですか?

B)格納されたオブジェクト内にメソッド (tostring())の固定値があるのはなぜですか?

C)そして最も重要: tostring() 内の固定値を置き換えるにはどうすればよいですか?

 
よろしくお願いします、ffm


   

4

1 に答える 1