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