gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:01:31 25 4
gpt4 key购买 nike

1. 我有这些XML- 文件,它们包含来自 3rd 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()-方法中。但是,为什么在tostring()- 方法中有一个 静态值?它应该是一种方法。
出于某种原因,这些cmdlet在tostring()-Method中使用此值。

5. 除了这个原因, 我尝试替换tostring()内部的值。但这是一种方法,所以我唯一知道覆盖此方法的方法是 添加具有相同名称的新方法:
$subobj | Add-Member -MemberType scriptmethod -Name tostring {$replVal} -Force

仅工作了一半,因为它没有用变量 $ replVal 的内容替换tostring()的值,即
NewDomain”),但变量 $ replVal 本身。因此,当您调用方法tostring()时,$ subobj.tostring()就是$ replval中的值,而不是固定值。
因此,我需要的是脚本方法,就像noteproperty一样,让我分配一个固定值,例如 tostring()= $ replvalue
所以我不明白。 A)为什么在export-clixml-文件中仍然存在tostring()? B)为什么存储的对象内部的方法(tostring())有一个 固定的值? C),也是最重要的: 我如何替换tostring()中的固定值? 谢谢,问候,ffm

最佳答案

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()的值。

关于xml - 自定义Powershell对象和export-clixml的Tostring()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26705337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com