Powershell прочитать файл построчно

Обновлено: 07.07.2024

Всё о PowerShell в Windows и на Linux. Системное администрирование Windows

Как в PowerShell передать содержимое файла в командлет

В Bash на Linux когда нужно передать данные из файла команды или работают со стандартным вводом или путь до файла указывается с помощью опции. В PowerShell командлеты также могут принимать данные из стандартного ввода, например:

Как вы уже могли понять из приведённой выше команды, аналогом cat в PowerShell является командлет Get-Content. Если нужно в опцию передать содержимое файла, то используется конструкция пример которой показан в следующей команде:

Аналог cat, tail и head в PowerShell

В Linux имеется несколько команд для чтения файла:

  • cat — считывает весь файл
  • tail — считывает указанное количество строк (по умолчанию 10) от конца файла
  • head — считывает указанное количество строк (по умолчанию 10) от начала файла

Для всего этого в PowerShell используется командлет Get-Content.

Пример считывания содержимого файла C:\PS\InstalledRoles.csv (при этом содержимое будет передано по конвейеру или если это последний командлет, то будет выведено в стандартный вывод, на экран):


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

Начиная с PowerShell 3.0, Get-Content может также получать указанное количество строк от начала или до конца элемента.

Для последующих примеров создадим текстовый файл, в который запишем перечень папок и файлов текущей директории:

Как прочитать файл и сохранить его в переменной

В следующей команде будет прочитан файл current_dir.txt и его содержимое будет сохранено в переменную $dir:

Опция -Path и использование подстановочных знаков с Get-Content

Для указания файла можно использовать опцию -Path, но её можно и опускать:

Можно использовать подстановочные знаки:

Путь должен указать до элементов, но не до контейнеров. Например, можно указать путь до одного или более файлов, но не до директории.

Как прочитать определённое количество строк от начала файла

С помощью опции -TotalCount (её псевдонимы -First и -Head) вы моете указать количество строк, которое должно быть прочитано от начала файла.

Следующая команда прочитает 13 первых строк файла current_dir.txt:


Как прочитать определённое количество строк от конца файла

С помощью опции -Tail вы можете прочитать последние строки файла, например:

Как узнать, сколько строк было прочитано

Командлет Get-Content возвращает массив строк, поэтому вы можете использовать методы для массивов, например, следующие команды покажут количество строк в файле current_dir.txt:

Для подсчёта количества строк вы также можете использовать командлет Measure-Object:


Обратите внимание, что эти команды вернули разное количество строк. Первая команда вернула общее количество строк вместе с пустыми, а вторая посчитала только непустые строки.

Получение содержимого файла в Powershell с Get-Content на примерах

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

Навигация по посту

Получение данных

Открытие файла в Powershell и чтение содержимого с Get-Content

Если у вас множество файлов или вы не уверены в назывании, то вы можете использовать подстановку. Символы подстановок бывают следующих типов:

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

В этом примере я открою сразу два файла: lmhosts и hosts:

Открытие файла с неточным именем в Powershell Get-Content

Следующие примеры вернут аналогичный результат:

Получение содержимого файла по маске Powershell Get-Content

Для похожей фильтрации есть следующие параметры, которые так же позволяют использовать символы подстановок:

  • Include - в этом параметре мы добавляем шаблон, по которому будем включать файл;
  • Exclude - с помощью этого параметра исключает файлы;
  • Filter - исключает результаты.

Получение содержимого файлов по формату в Powershell с Get-Content

Пример работы в Powershell Get-Content с исключением файлов

Полное и построчное чтение с поиском

По умолчанию, если мы будем передавать результат команды через конвейер Powershell вывод будет построчный. Это может составить проблему, так как при дополнительных условиях у нас будет возвращаться одна строка, а не весь текст:

Построчное чтение и поиск в Powershell Get-Content

Что бы текст передавался полностью, а не построчно - используйте параметр Raw:

Построчный вывод в Powershell Get-Content и поиск

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

Вывод более одной строки в Powershell Get-Content

Разделение файла

Чтение и разделение файла с Powershell Get-Content

То есть результат выше - это массив. В массивах Powershell мы можем получать содержимое по индексам. В следующем примере я просто уберу точку с запятой:

Открытие файла с разделением в Powershell Get-Content

Подсчет количества строк

Построчный вывод с командой Powershell позволяет посчитать количество строк во всем файле. Для подсчета используется команда Measure-Object:

Подсчет количества строк в файле с Powershell Get-Content

Если нужна только цифра, а не объект, можно сделать так:

Выбор свойства при подсчете строк в файле с Powershell

Кодировки

В параметре -Encoding можно указать следующие кодировки:

  • ASCII
  • BigEndianUnicode
  • BigEndianUTF32
  • Byte
  • Default
  • OEM
  • Unicode
  • UTF7
  • UTF8
  • UTF32
Как искать файлы используя Powershell Get-ChildItem

Чтения файла под другим пользователем

В этом командлете не предусмотрена возможность открытия файла под другим пользователем. При любых попытках вы будете получать ошибки:

  • Access to the path is denied
  • The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again without specifying credentials.

Для обхода этих ошибок, если у вас нет другого выхода, нужно использовать Invoke-Command (команда удаленного подключения). Для ее настройки могут потребоваться дополнительные настройки описанные в другой статье.

Сам процесс открытия файла под другим пользователем будет выглядеть так:

Непрерывное чтение

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

Непрерывное чтение файла в Powershell

Ограничение вывода строк

Можно ограничить вывод содержимого файла указав количество нужных строк в начале или конце:

  • Head - выведет указанное количество строк с начала;
  • Tail - выведет указанное количество строк с конца.

Так будут выведены только первые 5 строк:

Ограничение вывода файла в Powershell с Head и Tail

Создание и изменение в Powershell NTFS разрешений ACL

Поиск файлов по содержимому

Get-Content не позволяет искать и открывать фалы находящиеся внутри других каталогов. Такой поиск называется рекурсивным и он доступен в Get-ChildItem.

В следующем примере мы вернем файлы из всех каталогов и подкаталогов:

Рекурсивный поиск файлов по содержимому в Powershell Get-Content

File - возвращает только файлы. Каталоги нам не нужны.

С Get-ChildItem вы так же можете использовать Include,Exclude и Filter, которые были рассмотрены раннее. Использовать эти ключи лучше всего в первой команде т.к. это будет работать быстрее.

Рекурсивный поиск файлов по содержимому в Powershell Get-Content

Если убрать параметр Raw, то у нас выведется только та строка, которую мы искали:

Построчный поиск строк в отрытом файле с Powershell Get-Content

Изменение файла с последующей записью

Замена строки в Powershell replace

Или с помощью регулярного выражения (не точный шаблон):

Замена строки в Powershell replace c regex

Замена совпадающей строки в открытом файле Powershell с записью

Второй вариант - использовать команду Set-Content:

Поиск в строке с последующей заменой и записью в Powershell

Функции по работе со строками в Powershell

Подсчет четных чисел в файле

Для выделения таких чисел из строк нужно использовать Select-String:

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

Нам нужно отформатировать вывод убрав пустые строки и получить значения свойства Value:

Получение чисел в открытом файле Powershell

Мы можем вернуть остаток от деления использовав %. Если число делится на 2 с остатком 0, то оно будет четным:

Текстовые файлы есть повсюду, и вам придется их прочитать, независимо от вашей роли или должностных обязанностей. Фактически, если вы ИТ-специалист, вам придется чаще создавать, читать или работать с текстовыми файлами, поскольку они бывают разных форматов. Эта гибкость также сделала текстовые файлы наиболее удобным способом идентификации сценариев, хранения сведений о конфигурации и т. Д.

PowerShell понимает важность текстовых файлов и упрощает доступ к ним и их чтение. В этой статье TipsMake может показать вам, как читать текстовые файлы в PowerShell.

Способы чтения текстовых файлов в Powershell

  1. Прочитать полное содержание
  2. Прочтите отрывок из содержания
  3. Читать построчно
    1. Используйте Get-Content
    2. Используйте класс StreamReader
    1. Подсчитайте количество строк в файле
    2. Выберите конкретные номера строк в начале и в конце
    3. Файл постоянно обновляется

    Прочитать полное содержание

    Изображение 1: Как быстро и легко читать текстовые файлы в Powershell

    Get-Content C: logslog01012020.txt

    Изображение 2: Как быстро и легко читать текстовые файлы в Powershell

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

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

    $ file_data = Get-Content C: logslog01012020.txt

    Теперь вы можете использовать эту переменную $ file_data для анализа или дальнейшей обработки.

    Прочтите отрывок из содержания

    Изображение 3: Как быстро и легко читать текстовые файлы в Powershell

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

    $ file_data = Get-Content C: logslog01012020.txt $ file_data | Select-Object -First 10

    Как показывает код, первые 10 строк будут храниться в переменных, а не весь контент. Вы можете отобразить содержимое этой переменной или использовать ее для дальнейшей обработки.

    Точно так же мы можем прочитать несколько последних строк:

    $ file_data = Get-Content C: logslog01012020.txt $ file_data | Выбрать объект -Последние 10

    Читать построчно

    Если вы хотите прочитать файл, чтобы понять его содержимое, вы должны делать это построчно, и хорошая новость в том, что это возможно с помощью PowerShell. На самом деле, есть 2 способа сделать это.

    Используйте Get-Content

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

    $ file_data = Get-Content C: logslog01012020.txt

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

    И эта команда покажет вам первую строку.

    Эта команда отобразит вторую строку (как и следующую строку).

    Используйте класс StreamReader

    $ stream_reader = новый объект System.IO.StreamReader

    Теперь у вас есть содержимое файла журнала в этой переменной $ stream_reader, и, поскольку он принадлежит классу StreamReader, вы можете использовать множество встроенных методов для получения нужного текста.

    Команда выведет весь контент на ваш экран, аналогично Get-Content.

    Чтобы прочитать текущую строку, вы можете использовать следующий метод:

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

    $ stream_reader = New-Object System.IO.StreamReader $ line_number = 1 while (($ current_line = $ stream_reader.ReadLine ()) -ne $ null)

    Приведенный выше код начинается с первой строки и выводит каждую строку с количеством строк, прикрепленных для удобства чтения. Вы даже можете использовать любой из доступных строковых методов в переменной $ current_line для дальнейшего анализа.

    Этот метод идеально подходит для чтения больших файлов, поскольку при сохранении содержимого в переменной он может занимать слишком много памяти и влиять на производительность. Так что это более эффективный способ получить нужный контент.

    Найдите конкретный текст

    Во многих случаях требуется найти определенный текст в файле, и для фильтрации содержимого лучше всего использовать командлет Where-Object.

    $ file_data = Get-Content C: logslog01012020.txt | Where-Object

    Помимо Where-Object, вы также можете использовать операторы match и regex, чтобы найти нужный текст.

    Дополнительные возможности с Get-Content

    Подсчитайте количество строк в файле

    Возможно, вы захотите узнать количество строк, доступных в файле. Код для этого:

    $ file_data = Get-Content C: logslog01012020.txt | Мера-объект

    Выберите конкретные номера строк в начале и в конце

    Ранее вы узнали, как выбрать первые несколько строк или последние несколько строк с помощью командлета Select-Object. Вы также можете получить аналогичные результаты, используя некоторые методы, интегрированные с Get-Content.

    Чтобы получить первые несколько строк, используйте следующий метод:

    $ file_data = Get-Content C: logslog01012020.txt -TotalCount 3

    Эта команда вернет первые 3 строки из файла.

    $ file_data = Get-Content C: logslog01012020.txt -Tail 3

    Эта команда вернет последние 3 строки из файла.

    Файл постоянно обновляется

    Предположим, ваш файл журнала постоянно обновляется, и вы хотите посмотреть в конец этого файла журнала, чтобы прочитать последние обновленные значения. Вы можете добавить параметр ожидания, например:

    $ file_data = Get-Content C: logslog01012020.txt -Tail 3 -Wait

    Эта команда будет постоянно отслеживать файл журнала, чтобы найти новые добавленные и отображаемые для вас строки.

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

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

    $a = Get-Content C:\files\file.txt

    Как видите, переменная имеет тип данных Object[], т.е. массив.

    формат данных по умолчанию

    Обычно это не имеет значения, но иногда требуется считать файл одной строкой, для чего существует несколько способов.

    Проще всего воспользоваться командлетом Get-Content с параметром Raw. Он игнорирует все символы новой строки и выводит содержимое файла в одну строку. Например:

    $b = Get-Content C:\files\file.txt -Raw

    Get-Content с ключом -Raw

    Обратите внимание, что параметр Raw появился в третьей версии PowerShell. Если вдруг у вас более ранняя версия, то можно воспользоваться статическим методом ReadAllText класса File:

    статический метод ReadAllText

    Ну и для разнообразия еще один способ. Можно считать файл стандартным способом и затем передать его командлету Out-String, например так:

    $d = Get-Content C:\files\file.txt | Out-String

    конвертирование с помощью Out-String

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

    GET-HELP

    Самый первый и самый главный командлет PowerShell – вызов справки. С помощью командлета Get-Help можно проверить синтаксис, посмотреть примеры использования и детальное описание параметров любого PowerShell командлета. Этот командлет примечателен тем, что вы просто можете набрать Get-Help Services, чтобы получить список всех командлетов, которые подходят для работы со службами.
    Пример:


    Вы можете выбрать любой командлет из списка, выведенного по запросу выше, чтобы получить справку о нем. Например,


    Вы получаете всю информацию о командлете Get-Service (будет рассмотрен ниже).

    GET-CONTENT

    Чтение содержимого файлов – наиболее частое требование для новичков, которые пытаются выучить PowerShell. Процедура чтения файлов с PowerShell упрощается. Даже неспециалист может читать содержимое файла, просто передав его в командлет Get-Content.
    Пример.


    Необходимо больше информации о командлете? Воспользуйтесь Get-Help:

    GET-SERVICE

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



    Здесь мы запросили информацию о двух службах wwansvc и spooler
    Выводится таблица со статусом службы, ее именем и отображаемым именем.
    Мы можем видеть что служба spooler запущена, а wwansvc остановлена

    STOP-SERVICE И START-SERVICE

    Запуск и остановка служб – достаточно важный момент в работе администратора Windows. В PowerShell имеются встроенные командлеты, которые упрощают работу администратора, не требуя открытия консоли MMC. Используя эти командлеты Вы можете останавливать/запускать службы как на локальных, так и на удаленных компьютерах.
    Примеры:
    Запуск/остановка службы на локальном компьютере (на примере службы spooler):


    Запуск/остановка службы на удаленном компьютере (spooler):

    GET-PROCESS

    Этот командлет позволяет быть в курсе, какие процессы запущены на локальных или удаленных компьютерах. Показываются имя и ID процесса, а также путь к исполняемому файлу, имя компании, версия исполняемого файла и память, используемая процессом.
    Примеры:
    Получение информации о процессах, запущенных на локальном компьютере:



    Введите следующий командлет для получения подробной информации о запущенных процессах


    Получение информации о процессах, запущенных на удаленном компьютере:


    MYPC1 необходимо заменить на имя того компьютера, с которого вы хотите получить информацию о запущенных процессах.

    STOP-PROCESS

    Этот командлет остановливает процесс на локальном или удаленном компьютере. Он берет имя или ID процесса и завершает этот процесс. Это полезно в тех случаях, когда приложение не отвечает.
    Пример:
    Остановить процесс с ID 22608 на локальном компьютере:

    Остановить все процессы Excel на локальном компьютере:


    Совет: Хотя у командлета Stop-Process отсутствует параметр -ComputerName, Вы все равно можете использовать его для завершения удаленных процессов, используя предложенный ниже совет:

    Читайте также: