gpt4 book ai didi

function - PowerShell更改返回对象的类型

转载 作者:行者123 更新时间:2023-12-03 13:52:39 29 4
gpt4 key购买 nike

我正在使用PowerShell v3和Windows PowerShell ISE。我有以下功能正常工作:

function Get-XmlNode([xml]$XmlDocument, [string]$NodePath, [string]$NamespaceURI = "", [string]$NodeSeparatorCharacter = '.')
{
# If a Namespace URI was not given, use the Xml document's default namespace.
if ([string]::IsNullOrEmpty($NamespaceURI)) { $NamespaceURI = $XmlDocument.DocumentElement.NamespaceURI }

# In order for SelectSingleNode() to actually work, we need to use the fully qualified node path along with an Xml Namespace Manager, so set them up.
[System.Xml.XmlNamespaceManager]$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($XmlDocument.NameTable)
$xmlNsManager.AddNamespace("ns", $NamespaceURI)

[string]$fullyQualifiedNodePath = Get-FullyQualifiedXmlNodePath -NodePath $NodePath -NodeSeparatorCharacter $NodeSeparatorCharacter

# Try and get the node, then return it. Returns $null if the node was not found.
$node = $XmlDocument.SelectSingleNode($fullyQualifiedNodePath, $xmlNsManager)
return $node
}

现在,我将创建一些类似的函数,因此我想将前三行分解为一个新函数,这样我就不必到处都复制粘贴它们了,所以我做到了:
function Get-XmlNamespaceManager([xml]$XmlDocument, [string]$NamespaceURI = "")
{
# If a Namespace URI was not given, use the Xml document's default namespace.
if ([string]::IsNullOrEmpty($NamespaceURI)) { $NamespaceURI = $XmlDocument.DocumentElement.NamespaceURI }

# In order for SelectSingleNode() to actually work, we need to use the fully qualified node path along with an Xml Namespace Manager, so set them up.
[System.Xml.XmlNamespaceManager]$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($XmlDocument.NameTable)
$xmlNsManager.AddNamespace("ns", $NamespaceURI)
return $xmlNsManager
}

function Get-XmlNode([xml]$XmlDocument, [string]$NodePath, [string]$NamespaceURI = "", [string]$NodeSeparatorCharacter = '.')
{
[System.Xml.XmlNamespaceManager]$xmlNsManager = Get-XmlNamespaceManager -XmlDocument $XmlDocument -NamespaceURI $NamespaceURI
[string]$fullyQualifiedNodePath = Get-FullyQualifiedXmlNodePath -NodePath $NodePath -NodeSeparatorCharacter $NodeSeparatorCharacter

# Try and get the node, then return it. Returns $null if the node was not found.
$node = $XmlDocument.SelectSingleNode($fullyQualifiedNodePath, $xmlNsManager)
return $node
}

问题是,当“return $ xmlNsManager”执行时,将引发以下错误:
Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Xml.XmlNamespaceManager".

因此,即使我已将$ xmlNsManager变量显式转换为System.Xml.XmlNamespaceManager类型,但是当它从Get-XmlNamespaceManager函数返回时,PowerShell仍将其转换为Object数组。

如果我没有将Get-XmlNamespaceManager函数返回的值显式转换为System.Xml.XmlNamespaceManager,则.SelectSingleNode()函数会引发以下错误,因为将错误的数据类型传递给该函数的第二个参数。
Cannot find an overload for "SelectSingleNode" and the argument count: "2".

因此,出于某些原因,PowerShell无法维护返回变量的数据类型。我真的很想从一个函数开始工作,这样我就不必到处复制粘贴这3行。任何建议表示赞赏。谢谢。

最佳答案

发生的事情是PowerShell将您的 namespace 管理器对象转换为字符串数组。

我认为这与PowerShell在管道中发送对象时“展开”集合的性质有关。我认为PowerShell将对实现IEnumerable的任何类型(具有GetEnumerator方法)执行此操作。

解决方法是,您可以使用逗号把戏来防止此行为,并将对象作为一个整体发送。

function Get-XmlNamespaceManager([xml]$XmlDocument, [string]$NamespaceURI = "")
{
...
$xmlNsManager.AddNamespace("ns", $NamespaceURI)
return ,$xmlNsManager
}

关于function - PowerShell更改返回对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17498320/

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