2009-05-07 16 views
4
$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() 

1:PowerShell functions return behaviorPowershellの "return"キーワードがタイプエラーを引き起こすのはなぜですか?

+0

私にとっては少なくとも動作します。ここでエラーメッセージは表示されず、VistaのPowershell 1.0でもWindows 7 RCのPowershell 2.0でも表示されません。 – Joey

+0

私のためにも動作します。 XPのPowershell 1&2 – zdan

+0

私はこの回避策に入れたスクリプトを見つけ、エラーの原因を突き止める機会を得ました。それは「リターン」ステートメントです。 –

答えて

6

この1上のPowerShellチームからいくつかの確認を得たです。これはXMLアダプタのバグのようです。デバッガでfoo2によって吐き出されたオブジェクトを見ると、それはPSObjectです。 returnキーワードを使用せず、単に文字列 "foo2"を出力すると、関数は文字列オブジェクトを返します。

XMLアダプタのバグは、ベースオブジェクトを取得するためにPSObjectのラップを解除していないことです。その結果、PSObjectを$ xml.nodeに割り当てようとすると失敗します。現時点では、回避策として、psobjectを手作業で(つまり[文字列]にキャストして)手動でアンラップすることができます:

$xml = [xml] '<node>foo</node>' 
function foo2 { return "foo2" } 
$xml.node = (foo2).psobject.baseobject 
$xml 

node 
---- 
foo2 
+0

MVP接続を動作させる方法、Keith :)残念ながら、私は指定された答えを変更できませんが、ここには+1があります。 –

+0

問題ありません。投票ありがとう! –

+0

私の回答を削除すると、あなたは再割り当てできますか? – ShuggyCoUk

2

は、文脈に応じて、機能は、あなたの期待される結果は、配列のインデックス0である(長さ1の)配列を返すことができます。このことができます

$xml.node = $(myfunc) 

希望、

-Oisin

P.S.:単一の要素が配列に包ま返された場合、あなたは常にスカラを得られるようにするには、次の構文を使用します私は他の人がこれを再版することはできないと私は知っているが、私はあなたのデモコードが他のより大きいスクリプトから切り取られていると思う。

+0

この関数は文字列を返さないが、PowerShellの出力形式を使って簡単に表示できるものもあります。 – JasonMArcher

0

this articleに基づいて、私はコンパイラがfoo2の出力タイプをよく理解していないと判断しますが、それは常に明白ですが、それは常に文字列になります。の...

アップデートを行使されることはありません出力にもっと何かを追加:キース・ヒルの答えが正しいものではない、この1

+0

PowerShell(およびスクリプト言語全般)から見た他のことに基づいて、関数を実行し、その戻り値を動的に調べると仮定しました。しかし、私が他の点ではっきりと聞くまで、あなたの答えはもっともらしい理由のように聞こえます。 –

+0

あなたは10K tahまで私をプッシュしました:) – ShuggyCoUk

関連する問題