문제

일부 Windows Installer XML (WIX)을 조작하기 위해 PowerShell 스크립트를 작성하고 있습니다. .NET 3.5의 새로운 XML API를 사용하여 DOM보다 작업하기가 더 쉽기 때문입니다. 다음 스크립트 조각은 작업을 거부하고 있습니다.

[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

대본 ~해야 한다 각각 출력u003CString> 별도의 라인에 태그. 이 버그가 해결되면 더 흥미로운 일을하게 할 것입니다 ;-)

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>

$ strings는 $ null이 아닙니다 (명시 적으로 테스트했습니다). Host $ WXL을 쓰면 문서가로드되었음을 알 수 있습니다. Get-Member에 $ 문자열을 파이핑하는 것은 "get 멤버에게는 객체가 지정되지 않았다"는 오류를 반환하고 Write-Host $ 문자열은 아무것도하지 않습니다. 또한 동일한 결과로 $ wxl.descendants ( "wixlocalization")를 시도했습니다. $ wxl.root 및 $ wxl.nodes와 같은 것들이 예상대로 작동합니다. PowerShell ISE로 디버깅을하면 $ 문자열이 예상되는 ienumerable이 아닌 ienumerator로 설정되었음을 알 수 있습니다.u003CXElement> . 단일 movenext로 ienumerator를 테스트 한 다음 전류는 "current =", 아마도 $ null임을 나타냅니다.

이상한 점은 동일한 기술이 이전 스크립트에서 작동한다는 것입니다. 정확히 동일한 코드이지만 변수 이름과 문자열 리터럴이 있습니다. 그리고 방금 스크립트를 디버깅하려고 시도한 결과 (동작을 확인하기 위해) 이제 동일한 동작을 표시하는 것 같습니다.

도움이 되었습니까?

해결책

이 문제는 저를 흥미롭게 해주었습니다. 그래서 나는 약간의 검색을했습니다. PowerShell에서 많은 혼란을 일으켜 웹을 검색 한 후 솔루션을 찾았습니다.

크레딧은 실제 코드를 위해 Jamie Thomson에게갑니다.http://dougfinke.com/blog/index.php/2007/08/07/us-xmllinq-in-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 레지스트리 공간 할당

그 시점에서 그 위에있는 것은 너무 어렵지 않아야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top