Прежде всего, вы не передаете данные XML в виде одной строки. Именно это и вызывает ошибку, которую вы наблюдали, потому что строка <DTS:Executable ...
сама по себе не является допустимым XML.
Либо читать файл в одну строку:
$x = Get-Content '.\ECW_SPECIALITY.dtsx' -Raw # PowerShell v3 or later
$x = Get-Content '.\ECW_SPECIALITY.dtsx' | Out-String # PowerShell v2 or earlier
или передать файл напрямую Select-Xml
:
Select-Xml -Path '.\ECW_SPECIALITY.dtsx' -XPath ...
Простое исправление, которое все равно не даст желаемого результата, поскольку ваше выражение XPath неверно.
- Для выбора узлов или атрибутов пространства имен необходимо использовать префикс, определенный в хеш-таблице пространства имен, в выражении XPath.
@
обозначает атрибут . Его нельзя использовать для узлов .
- Квадратные скобки определяют критерии, по которым фильтруются выбранные узлы / атрибуты, а не узлы / атрибуты, которые должны быть выбраны. Это необходимо для выбора узла, который имеет определенный атрибут, но не для выбора самого атрибута.
- Выходные данные
Select-Xml
дают выбранный узел или атрибут (свойство Node
) вместе с элементом ввода (свойство Path
) и выражением XPath (свойство Pattern
). Чтобы получить значение узла / атрибута, необходимо развернуть свойство Node
. Дважды.
Это должно делать то, что вы хотите:
$ns = @{DTS='www.microsoft.com/SqlServer/Dts'}
$path = '.\ECW_SPECIALITY.dtsx'
$xpath = '//DTS:ConnectionManagers/DTS:ConnectionManager/@DTS:ObjectName'
# ^node ^node ^attribute
Select-Xml -Path $path -XPath $xpath -Namespace $ns |
Select-Object -Expand Node |
Select-Object -Expand '#text'
Для получения более подробной информации, пожалуйста, проверьте XPath ссылка .