PowerShell, хранящий Get-Content в переменной, не возвращает данных - PullRequest
0 голосов
/ 24 мая 2018

У меня есть очень простой сценарий, который извлекает содержимое из файла XML и возвращает его, но не работает:

$DataFile = Get-ChildItem \\$Server\C$\ *.data -Name
[xml]$DataFileContent = Get-Content Microsoft.PowerShell.Core\FileSystem::\\$Server\C$\$DataFile
Write-Host $DataFileContent

Этот сценарий не возвращает никаких данных на Write-Host, но следующеевозвращает правильные данные:

$DataFile = Get-ChildItem \\$Server\C$\ *.data -Name
Get-Content Microsoft.PowerShell.Core\FileSystem::\\$Server\C$\$DataFile

Да, файл является XML-файлом, и файл существует.Я уверен, что что-то упустил, но не уверен, что это такое.Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Перво-наперво: Write-Host вообще имеет мало законных применений - делать не использовать его для вывода данных : вывод Write-Host идетпрямо к консоли и поэтому не может быть ни отправлено по конвейеру, ни захвачено, ни перенаправлено (грубо говоря; для полной истории, смотрите последний раздел этого ответа моего).

Если вы хотите напечатать дружественное представление объекта для отображения только , используйте Out-Host вместо Write-Host, потому что последний делает не применять обычное дружественное форматирование вывода PowerShell.

$DataFileContent | Out-Host # print object *for display only*

Если вы намереваетесь выводить данные , вы можете положиться на PowerShell неявное поведение вывода , которое отправляет любой вывод, который не был явно захвачен или перенаправлен в поток вывода успеха, который по умолчанию выводится на консоль с использованием удобного форматирования:

$DataFileContent # same as: Write-Output $DataFileContent

Явное использованиеиз Write-Output редко требуется. Заметным исключением является то, что если вы хотите вывести коллекцию как отдельный объект , используя -NoEnumerate.

Примечание: экземпляры [xml] оказываются только полу-дружественнымиформатирование вывода по умолчанию, которое не дает представления о структуре документа;чтобы увидеть последнее, перейдите к свойству .OuterXml, хотя вам может потребоваться применить симпатичную печать, которая требует больше работы.


Write-Host вывод отличается от Out-Host инеявный вывод / Write-Output, который выводится на консоль следующим образом:

  • Вместо применения стандартного форматирования вывода PowerShell Write-Host по существу вызывает метод .ToString() для своего ввода, что приводит кв разных, часто почти бесполезных представлениях - с заметным исключением string input.

  • Кроме того, Write-Host перечисляет входные объектыесли применимо, так что элементы данного входного объекта индивидуально stringified.
    Входной объект считается перечисляемым, если он реализует интерфейс [System.Collections.IEnumerable].
    Это перечислениепроисходит рекурсивно , что в случае [xml] приводит к выводу, который не только бесполезен , но также сбивает с толку - см. ниже.

[xml] экземпляров, представляющих XML-документы, являются перечисляемыми, а и их перечисляемые элементы (узлы XML) рекурсивно .

Write-Host рекурсивно перечисляет узлы верхнего уровня документа - который является либо только корневым элементом, либо, дополнительно, если присутствует, декларацией XML - и неизменно достигает одного или нескольких leaf узлы, чье перечисление неизменно пусто и дает пустую строку.Учитывая, что Write-Host разделяет строковые значения его (перечисляемых) входных объектов с пробелом каждый, вы либо получаете пустую строку, либо один или несколько пробелов в качестве общего результата.

0 голосов
/ 24 мая 2018

Вы не можете использовать Write-Host здесь, так как вы пытаетесь отобразить объект [xml].Вместо этого попробуйте write-output.

Если вам требуется Write-Host, вам необходимо заранее представить объект в виде строки или использовать свойство, которое выводит строку.Например:

[xml]$x = Get-Content y.xml
Write-Host $x.InnerXml

Это также может быть хорошей идеей для использования с записью-выводом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...