PowerShell Get-Content эквивалент PowerShell Tail

С автоматизацией сценарий чтения данных из текстового файла является обычным. У большинства языков программирования есть хотя бы один способ чтения текстовых файлов, и PowerShell здесь не исключение. Команда PowerShell Get-Content, эквивалентная утилите tail в PowerShell, читает содержимое текстового файла и импортирует данные в сеанс PowerShell.

Команда PowerShell Get-Content является незаменимым инструментом, когда вам нужно использовать текстовые файлы в качестве входных данных для вашего сценария. Возможно, ваш сценарий PowerShell должен прочитать список компьютеров для мониторинга или импортировать шаблон электронной почты для отправки вашим пользователям. PowerShell Get-Content легко поддерживает эти сценарии!

Как насчет отслеживания файла журнала в реальном времени? Да, команда PowerShell Get-Content может справиться и с этим! Продолжайте чтение этой статьи, и вы узнаете, как использовать команду Get-Content для чтения текстовых файлов в PowerShell.

Предварительные требования

Если вы хотите следовать примерам в этом руководстве, вам понадобятся следующие условия.

  • Вам понадобится компьютер с установленной Windows 10. В этом руководстве используется версия Windows 10 20H2. Но не волнуйтесь, вы будете в порядке с версией Windows 10, которую у вас есть.
  • У вас должен быть установлен Windows PowerShell 5.1 или PowerShell 7.1 на вашем компьютере. Здесь используется PowerShell 7.1, но будет работать любая версия!
  • Вы будете писать и тестировать команды, поэтому вам понадобится редактор кода. Рекомендуемые редакторы – Windows PowerShell ISE, встроенный в Windows, и Visual Studio Code (VSCode). В этой статье используется VSCode.
  • Также будет полезно, если вы создадите рабочий каталог на своем компьютере. Рабочая папка может быть где угодно. Однако, вы заметите, что примеры в этом учебнике находятся в папке C:\demo.
  • Чтобы начать, вам нужно какое-то содержимое! Создайте файл в вашем рабочем каталоге с именем fruits.txt, который включает десять разных фруктов для простоты. Вы будете использовать этот текстовый файл во всех примерах.
cherry
 berry
 apricot
 papaya
 raspberry
 melon
 peach
 tangerine
 cantaloupe
 orange

Не знаете, какая у вас версия PowerShell? Посетите статью Как проверить вашу версию PowerShell (все способы!).

Чтение текстового файла и возвращение результата в виде массива строк

Команда Get-Content читает содержимое файла и по умолчанию возвращает каждую строку текстового файла как объект строки. В результате коллекция объектов PowerShell становится массивом объектов строк.

Ниже приведен код, который читает содержимое файла fruits.txt и отображает результат на консоли PowerShell, как показано на скриншоте ниже.

Get-Content .\fruits.txt
Retrieving the text file content using PowerShell Get-Content.

Get-Content читает и сохраняет содержимое как массив, но как вы можете быть уверены в этом? Сначала сохраните содержимое в объект PowerShell, который вы можете затем изучить, чтобы определить тип.

Save the content into to a object
 $fruits = Get-Content .\fruits.txt
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

Просматривая скриншот ниже, переменная $fruits является массивом, который содержит десять объектов. Каждый объект представляет собой одну строку текста.

Confirming that the text file content is stored as an array.

Возвращение определенной строки из текстового файла

В предыдущем примере вы узнали, что результатом по умолчанию для Get-Content является массив или коллекция объектов. Каждый элемент в коллекции соответствует номеру индекса, и индексы PowerShell обычно начинаются с нуля.

На скриншоте ниже показано, что в строковом массиве десять элементов. Массив проиндексировал десять элементов от нуля до девяти.

Showing that the indexed items in the string array start at zero index.

Чтобы отобразить только пятую строку содержимого, вам нужно будет указать номер индекса 4, заключенный в квадратные скобки (известные как массивная нотация).

(Get-Content .\fruits.txt)[4]

Вы можете заметить, что команда Get-Content заключена в скобки. Эта нотация указывает PowerShell выполнить команду, заключенную в скобки, первой перед другими операциями.

На скриншоте ниже вы увидите, что единственным возвращенным результатом является raspberry, который является элементом с индексом 4 и соответствует пятой строке в текстовом файле.

Returning a specific line from Get-Content results.

Что если вам нужно получить содержимое в последней строке? К счастью, вам не нужно знать общее количество строк. Вместо этого используйте [-1] в качестве индекса, и Get-Content отобразит только последнюю строку файла.

(Get-Content .\fruits.txt)[-1]

Ограничение количества верхних результатов, возвращаемых Get-Content

Используйте параметр TotalCount команды Get-Content, чтобы извлечь определенное количество строк из текстового файла. Параметр TotalCount принимает значение типа long, что означает максимальное значение 9 223 372 036 854 775 807.

Например, приведенная ниже команда читает содержимое и ограничивает результат тремя элементами.

Get-Content .\fruits.txt -TotalCount 3

Как и ожидалось, результат ниже отображает только первые три строки из начала текстового файла.

Reading the top three results using the Get-Content command and the TotalCount parameter.

Используйте параметр PowerShell Tail для возврата результатов из конца файла

В предыдущем примере вы использовали командлет Get-Content PowerShell для чтения текстового файла и ограничения результатов. Также можно добиться противоположного с помощью Get-Content PowerShell. Используйте параметр PowerShell Tail, чтобы прочитать определенное количество строк с конца файла.

Приведенный ниже пример кода читает текстовый файл и отображает содержимое четырех последних строк.

Get-Content .\fruits.txt -Tail 4

После выполнения команды PowerShell tail ожидаемым результатом будет ограничение последних четырех строк содержимого, как показано на изображении ниже.

Getting the results from the end of a file using the Get-Content Tail parameter.

Параметр Tail часто используется с параметром Wait. Использование параметра Wait поддерживает открытым файл и проверяет новое содержимое раз в секунду. Демонстрация ниже показывает параметры Tail и Wait в действии. Для выхода из Wait используйте комбинацию клавиш CTRL+C.

Get-Content -Path .\fruits.txt -Tail 1 -Wait
Using the wait and Tail parameters with Get-Content.

Возвращение результатов в виде одной строки

Возможно, вы заметили в предыдущих примерах, что имели дело с массивами строк как выводом командлета PowerShell Get-Content. И как вы узнали до этого, природа массивов позволяет вам оперировать содержимым по одному элементу за раз.

Массивы часто работают отлично, но могут затруднить замену строк. Параметр Raw командлета Get-Content считывает весь контент файла в единый объект строки. Хотя код ниже такой же, как использованный в первом примере, параметр Raw сохраняет содержимое файла как единую строку.

Save the content into to a object
 $fruits = Get-Content .\fruits.txt -Raw
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

На скриншоте ниже показано, что добавление параметра Raw к командлету Get-Content приводит к обработке содержимого как единой строки, а не как массива объектов.

Confirming that the Raw parameter of Get-Content reads the file content as a single string object.

После того как у вас есть содержимое файла в виде единой строки с использованием параметра Raw, что вы можете с ним сделать? Возможно, вам нужно найти и заменить строку внутри содержимого файла. В приведенном ниже примере Get-Content считывает содержимое файла как единую строку. Затем, используя оператор replace, заменяется определенное слово другим.

Связано: Поиск и замена строк

# Получить необработанное содержимое текстового файла
$fruits = Get-Content .\fruits.txt -Raw
# Отобразить содержимое
$fruits
# Найти и заменить слово 'апельсин' на 'манго'
$fruits -replace 'apricot','mango'
Reading the content of a text file as a single string and replacing a word using the replace operator.

Чтение содержимого только из файлов, соответствующих фильтру

У вас есть папка с файлами, но нужно прочитать содержимое только из некоторых из них? С помощью PowerShell Get-Content вам не нужно отдельно фильтровать файлы перед чтением их содержимого. Параметр Filter командлета Get-Content ограничивает выбор файлов для чтения.

Чтобы продемонстрировать чтение содержимого только из выбранных файлов, сначала создайте несколько файлов для чтения. Как показано ниже, создайте файлы в вашей рабочей папке, используя Add-Content.

# Add-Content создает файлы log1.log и log2.log, если они еще не существуют, и добавляет указанное значение
Add-Content -Value "This is the content in Log1.log" -Path C:\demo\Log1.log
Add-Content -Value "This is the content in Log2.log" -Path C:\demo\Log2.log
# Убедитесь, что файлы были созданы
Get-ChildItem C:\demo
Creating test .log files using Add-Content.

После создания тестовых файлов используйте параметры Filter и Path, чтобы прочитать только файлы .log в корневом каталоге. Звездочка, использованная в определении фильтра, указывает Get-Content прочитать любой файл, оканчивающийся на .log. Звездочка в конце параметра пути ограничивает чтение файлов только корневым каталогом.

Get-Content -Path C:\demo* -Filter *.log

Как показано на примере вывода ниже, отображается только содержимое файлов .log.

Using the Filter parameter with PowerShell Get-Content to limit the read files.

Связано: Get-ChildItem: Перечисление файлов, реестра, сертификатов и другого в виде одного списка

Чтение альтернативного потока данных файла

До сих пор вы работали исключительно с текстовыми файлами, но Get-Content может читать данные из альтернативного потока данных (ADS) файла. Не стесняйтесь читать больше о потоках, но вы можете представить поток как еще один атрибут данных, хранящийся наряду с типичным содержимым файла.

Альтернативные потоки данных – это функция файловой системы Windows NTFS, поэтому это не применимо к Get-Content, когда используется с не-Windows операционными системами.

Вы можете увидеть альтернативные потоки данных, запустив Get-Item с параметром Stream. При ссылке на файл с использованием параметра Stream Get-Item возвращает свойство, называемое Stream, как показано ниже. Этот поток содержания файла по умолчанию представлен как :$DATA.

Для демонстрации потока по умолчанию :$DATA используйте cmdlet Get-Item, чтобы отобразить все доступные потоки в файле fruits.txt. Как показано ниже, Get-Item отображает один поток.

Get-Item -Path .\fruits.txt -Stream *
Listing all available streams in a file using Get-Item.

Параметр Stream Get-Content явно читает содержимое потока по умолчанию :$DATA, как показано ниже. Возвращенное содержимое такое же, как и вывод по умолчанию Get-Content, так как поток :$DATA читается по умолчанию.

Get-Content -Path .\fruits.txt -Stream ':$DATA'
Explicitly reading the :$DATA stream using Get-Content.

Для демонстрации получения альтернативного потока данных с помощью Get-Content измените файл с помощью Add-Content, чтобы добавить новый поток. Используйте Get-Item, чтобы показать новый поток наряду с ​​по умолчанию :$DATA потоком, как показано в примере ниже.

# Добавить новый ADS с именем Secret в файл fruits.txt
Add-Content -Path .\fruits.txt -Stream Secret -Value 'This is a secret. No one should find this.'
Get-Item -Path .\fruits.txt -Stream *
Adding the Secret alternate data stream using Add-Content and displaying the new stream with Get-Item.

Поскольку по умолчанию считывается только поток :$DATA, используйте параметр Stream команды Get-Content, чтобы получить содержимое нового потока Secret. Как показано ниже, содержимое потока Secret отображается вместо содержимого файла по умолчанию.

Get-Content -Path .\fruits.txt -Stream secret
Using Get-Content to read the Secret alternate data stream content.

Следующие шаги с PowerShell Get-Content

В этой статье вы узнали много способов использования Get-Content для чтения и манипулирования содержимым. Вы даже узнали, что Get-Content достаточно гибок, чтобы читать содержимое из альтернативных потоков данных!

С учетом того, что вы узнали в этой статье, какие еще способы использования Get-Content вы можете применить в своей работе? Возможно, вы можете использовать Get-Content, чтобы определить, устарел ли файл резервной копии, и запустить автоматический вызов для выполнения резервного копирования?

Source:
https://adamtheautomator.com/powershell-get-content/