$xml = [xml] '<node>foo</node>'
function foo2 { return "foo2" }
# all of these fail with the message:
# **Cannot set "foo" because only strings can be used as values to set XmlNode properties.**
$xml.node = foo2
$xml.node = foo2 -as [string] # because of this issue[1]
$xml.node = (foo2)
# these work
$xml.node = (foo2).tostring()
$xml.node = (foo2) -as [string]
$xml.node = [string] (foo2)
# yet, these two statements return the same value
(foo2).gettype()
(foo2).tostring().gettype()
答案 0 :(得分:6)
在PowerShell团队中得到了一些确认。这似乎是XML适配器中的错误。如果你在调试器中查看由foo2吐出的对象,它就是一个PSObject。如果不使用return关键字而只输出字符串“foo2”,则函数返回一个字符串对象。
XML适配器中的错误是它不会解包PSObject以获取基础对象。因此,当它尝试将PSObject分配给$ xml.node时,它将失败。现在,作为一种解决方法,您可以像这样手动解包psobject(或者只是转换为[string]):
$xml = [xml] '<node>foo</node>'
function foo2 { return "foo2" }
$xml.node = (foo2).psobject.baseobject
$xml
node
----
foo2
答案 1 :(得分:2)
根据上下文,函数可能返回一个数组(长度为1),其中您的预期结果位于数组中的索引0处。要确保在数组中返回包含单个元素时始终获得标量,请使用以下语法:
$xml.node = $( myfunc )
希望这有帮助,
-Oisin
P.S。我知道其他人不能重复这一点,我也不能,但我怀疑你的演示代码是从其他更大的脚本中删除的。
答案 2 :(得分:0)
基于this article我会假设编译器决定它不知道foo2的输出类型是否足以接受它,尽管它“显而易见”它总是一个字符串我假设有一些代码路由能够向从未运用的输出中添加更多内容...
更新:Keith Hill的回答是正确的,不是这个