Обновление : Полезный ответ Palle Due предлагает лучшее решение.
Этот ответ все еще может представлять интерес для противопоставления перечисления членов использованию конвейера, обсуждения форматирования вывода,и контрастирование Out-File
с Set-Content
.
В PSv3 + вы можете просто использовать перечисление члена для извлечения значений .InputObject
:
PS> (Compare-Object (Get-Content old.txt) (Get-Content new.txt)).InputObject
server05
server06
Примечание:
Перечисление членов удобно и быстро, но за счет потребления памяти, что может быть проблемой для очень больших коллекций (не здесь).Выходные данные Compare-Object
должны быть собраны в памяти в целом в массиве ([object[]]
), и аналогичным образом значения свойств .InputObject
возвращаются в виде массива.
Для более медленной, но дружественной памяти (потоковой обработки) используйте конвейер с Select-Object -ExpandProperty
, как в эффективном решении TobyU .
Re сохранение в файл : трубопровод в Out-File $location
(или, более кратко, с использованием перенаправления вывода: > $location
) достаточно - не нужно Format-List
.
В общем, обратите внимание, что целью командлетов Format-*
является создание выходных данных для display , а не для программной обработки и сохранения.
Тем не менее, Out-File
/ >
(эффективно) с помощью командлетов Format-*
за кадром создает строковое представление входных объектов, так же как и вывод консоли по умолчанию, поэтому неправильная команда для сохранения произвольных входных объектов.
Использование Out-File
/ >
с строками безопасен, однако , потому что они выводятся как есть.Напротив, четные числа проблематичны, если они имеют десятичные разряды, потому что они строковые с десятичным разделителем текущей культуры (например, ,
вместо .
в некоторых культурах).
Если вашвходными объектами являются строки , вы также можете использовать Set-Content
, что быстрее, чем Out-File
/ >
, но предостережение заключается в том, что в Windows PowerShell кодировка символов, используемая по умолчанию, отличается:Out-File
/ >
создает файлы UTF-16LE по умолчанию, тогда как Set-Content
использует кодовую страницу "ANSI" устаревшей языковой системы (как правило, однобайтовую 8-битную кодировку, например Windows-1252).
Напротив, в PowerShell Core оба командлета выдают UTF-8 без спецификации.
Обратите внимание, что Set-Content
, в отличие от Out-File
, структурирует нестроковые объекты, просто вызывая .ToString()
метод на них.