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
答案 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()
。