Я пишу скрипт PowerShell для манипулирования некоторыми XML-файлами установщика Windows (WiX). Для этого я использую новые API-интерфейсы XML в .NET 3.5, так как считаю, что с ним проще работать, чем с 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
Сценарий должен выводить каждый тег в отдельной строке. Я собираюсь заставить его сделать что-то более интересное, как только эта ошибка будет решена; -)
Документ 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, я вижу, что документ загружен. Передача $ strings в Get-Member возвращает ошибку, утверждающую, что «для get-member не был указан объект», а запись «host-host $ strings» ничего не делает. Я также пробовал $ wxl.Descendants ("WixLocalization") с теми же результатами. Такие вещи, как $ wxl.Root и $ wxl.Node работают как положено. Отлаживая с помощью PowerShell ISE, я вижу, что для $ strings установлено IEnumerator, а не ожидаемый IEnumerable . Тестирование IEnumerator с одним MoveNext, а затем с Current указывает, что «Current =», предположительно $ null.
Странная вещь в том, что та же самая техника работала в предыдущем сценарии. Точно такой же код, но с разными именами переменных и строковыми литералами. И только что попробовав отладку этого скрипта (чтобы проверить поведение), кажется, что теперь он также показывает то же самое поведение.