質問

私はいくつかのWindowsインストーラXML(WiXの)を操作するPowerShellスクリプトを書いています。私はそれよりもDOMで動作する簡単なAPIを見つけるように私は、これを行うには、.NET 3.5の新しいXML APIを使用しています。以下のスクリプトフラグメントきっぱりと動作するように拒否されます:

[System.Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq") | Out-Null

# Basic idea: Iterate through en.wxl's l10ns, get string for each l10n, search all wxs files for that value.

pushd "C:\temp\installer_l10n"
$wxlFileName = "${pwd}\en.wxl"
$wxl = [System.Xml.Linq.XDocument]::Load($wxlFileName)
$strings = $wxl.Descendants("String")
$strings
$strings | foreach {
    $_
}
popd

スクリプトべきの出力それぞれ別々の行に<ストリング>タグ。私はそれがこのバグが解決されていたら、もっと面白い何かを取得するつもりです; - )

XMLドキュメントは、標準のWiXローカライズファイルです

<?xml version="1.0" encoding="utf-8" ?>
<WixLocalization Culture="en-US" xmlns="http://schemas.microsoft.com/wix/2006/localization">
   <String Id="0">Advertising published resource</String>
   <String Id="1">Allocating registry space</String>
   ...
</WixLocalization>

$文字列は$ nullに(私は明示的にそれをテストしてみた)ではない、と私は$のWXL-ホストを記述する場合、私は、ドキュメントがロードされていることがわかります。 Get-Memberにパイピング$文字列は「いいえオブジェクトは、メンバーを取得するために指定されていません」というエラーを返し、書き込みホストを$文字列は何もしません。私も同じ結果に(「WixLocalization」)$ wxl.Descendantsを試してみました。予想通り$ wxl.Rootと$ wxl.Nodesのようなものが働いています。 PowerShellのISEを使用したデバッグ、私は$文字列が、むしろ期待のIEnumerable より、IEnumeratorをに設定されていることがわかります。単一のMoveNextでのIEnumeratorをテストし、現在はその「現在=」、おそらく$ヌルを示します。

奇妙なことは、同じ技術が前のスクリプトで働いていたということです。しかし、別の変数名と文字列リテラルとまったく同じコード。そして、ちょうど(動作を確認するために)あまりにもそのスクリプトをデバッグしようとしたした、今も同じ動作を表示していますようです。

役に立ちましたか?

解決

この問題は私に興味をそそられたので、私はいくつかの周りに検索でした。 PowerShellでいじりやウェブを検索する多くの後、私はあなたの解決策を見つけました。

クレジットは、実際のコードのためにジェイミートムソンに行きます。 http://dougfinke.com/blog/ index.phpを/ 2007/8月7日/-xmllinqインPowerShellを使用して/

不足している部分は、XMLファイル内の名前空間を処理することです。ここではあなたのために働く必要があるコードがあります:

[System.Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq") | Out-Null
# Basic idea: Iterate through en.wxl's l10ns, get string for each l10n, search all wxs files for that value.

$wxlFileName = "${pwd}\en.wxl"
$wxl = [System.Xml.Linq.XDocument]::Load($wxlFileName)
$ns = [System.Xml.Linq.XNamespace]”http://schemas.microsoft.com/wix/2006/localization”
$strings = $wxl.Descendants($ns + "String")
foreach ($string in $strings) {
    $string
}

他のヒント

私はあなたがDOMで動作しないことが好ま言っ知っているが、これはあなたのために動作しない理由は何らかの理由があるのでしょうか?

[xml]$test = gc .\test.wml                                                                                        
$test                                                                                                             
$test.WixLocalization                                                                                             
$test.WixLocalization.String

この出力ます:

PS> $ test.WixLocalization.String

IDの#text
- -----
0広告は、リソースを公開し
1レジストリ領域の割り当て

その上Foreach'ingすると、その時点では、あまりにも難しいことではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top