Как в PowerShell прочитать содержимое файла. Как сохранить содержимое файла в переменную
Оглавление
- Как прочитать содержимое файла и вывести его на экран
- Как прочитать файл и сохранить его в переменной
- Как прочитать несколько файлов с помощью одной команды Get-Content
- Использование подстановочных знаков с именами файлов в Get-Content
- Как прочитать определённое количество строк от начала файла
- Как прочитать определённое количество строк от конца файла
- Как узнать, сколько строк было прочитано
- Как вывести только определённые строки файла
- Как получить весь файл в виде одной строки
- Как получить содержимое файла в виде потока байтов
- Выбор нового разделителя
- Указание кодировки файла
- Мониторинг появления в файле новых строк
Как прочитать содержимое файла и вывести его на экран
Для чтения файлов используется командлет Get-Content. Имя файла который нужно прочитать указывается после опции -Path — эту опцию можно пропустить. То есть следующие две команды равнозначные:
Get-Content FILE Get-Content -Path FILE
Например:
Get-Content file1.txt
Прочитанное содержимое можно передать в другой командлет или присвоить переменной. Пример чтения содержимого файла с помощью Get-Content и передачи его другому командлету для последующей обработки:
Get-Content file1.txt | Select-String '='
Если ничего из этого не было сделано, то содержимое файла будет просто выведено на экран.
Как прочитать файл и сохранить его в переменной
В следующей команде будет прочитан файл file1.txt и его содержимое будет сохранено в переменную $file1:
$file1 = Get-Content file1.txt
Как прочитать несколько файлов с помощью одной команды Get-Content
В Windows командлет Get-Content имеет псевдоним cat, что намекает на то, что командлет Get-Content подразумевается как аналог cat в PowerShell. Если вспомнить предназначение команды cat, то это «concatenate files» (отсюда и название утилиты), то есть объединение файлов. Конечно, многие указывают в качестве опции cat только один файл и используют эту утилиту как удобный способ вывести или записать в переменную содержимое одного единственного файла.
Смотрите также: Аналоги cat, tail и head в PowerShell
Если после командлета Get-Content указать больше одного файла, то это вызовет ошибку. Если использовать опцию -Path больше одного раза, то это опять вызовет ошибку.
Решением это проблемы является передачи списка файлов в виде массива.
Если вы пытаетесь найти способ как прочитать и объединить содержимое нескольких файлов, то просто используйте массив с именами файлов:
Get-Content -Path @('file1.txt', 'file2.txt')
Поскольку массив можно создать просто перечислив его значения через запятую, без использования символа «@», и поскольку опцию -Path можно пропустить, то вы можете чуть сократить запись:
Get-Content 'file1.txt', 'file2.txt'
Поскольку PowerShell правильно работает со строками даже если они не помещены в кавычки, то команду можно записать следующим образом — это тоже сработает, но только если в именах файлов нет пробелов и других специальных символов:
Get-Content file1.txt, file2.txt
Все три последние команды дадут идентичный результат. То есть достаточно перечислить имена файлов через запятую. На мой взгляд, лучше иметь привычку использовать кавычки, чтобы не возникало проблем независимо от наличия пробелов и специальных символов в именах файлов.
Использование подстановочных знаков с именами файлов в Get-Content
Вы можете прочитать за раз несколько файлов (или один файл, название которого известно частично) с помощью использования подстановочных знаков в именах файлов. Например:
Get-Content file* Get-Content *.txt
Вы можете сочетать использование массивов имён файлов и подстановочные знаки, например:
Get-Content file*,DICTIONARY
Смотрите также: Подстановочные символы в PowerShell
Как прочитать определённое количество строк от начала файла
С помощью опции -TotalCount (у неё также имеются псевдонимы -First и -Head) вы моете указать количество строк, которое должно быть прочитано от начала файла.
Следующая команда прочитает 13 первых строк файла file1.txt:
Get-Content file1.txt -TotalCount 13
Как прочитать определённое количество строк от конца файла
С помощью опции -Tail вы можете прочитать последние строки файла, например:
Get-Content file1.txt -Tail 10
Как узнать, сколько строк было прочитано
Командлет Get-Content возвращает массив строк, поэтому вы можете использовать методы для массивов, например, следующие команды покажут количество строк в файле file1.txt:
(Get-Content file1.txt).Count (Get-Content file1.txt).Length
Для подсчёта количества строк вы также можете использовать командлет Measure-Object:
Get-Content file1.txt | Measure-Object -Line | select Lines
Обратите внимание, что эти команды вернули разное количество строк. Первая команда вернула общее количество строк вместе с пустыми, а вторая посчитала только непустые строки.
Как вывести только определённые строки файла
Вы можете вывести только определённые строки, перечислив их номера через запятую используя следующий синтаксис:
(Get-Content file1.txt)[3,4,5]
Если вы сохранили содержимое файла в переменную, вы можете использовать аналогичный синтаксис применительно к переменной:
$file = Get-Content file1.txt $file[3,4,5]
Помните, что нумерация в массиве начинается с 0, поэтому в предыдущих примерах хотя и указаны номера 3, 4 и 5, фактически будут выведены строки с номерами 4, 5 и 6.
Как получить весь файл в виде одной строки
По умолчанию без опции -Raw содержимое возвращается в виде массива строк, разделённых символами новой строки.
Если добавить опцию -Raw, то команда чтения файла игнорирует символы новой строки и возвращает всё содержимое файла в одной строке с сохранением символов новой строки. По умолчанию символы новой строки в файле используются в качестве разделителей для разбивки входных данных на массив строк.
Пример команды:
Get-Content file1.txt -Raw
Если вы выводите файл на экран, то это никак не скажется на его отображении.
Как получить содержимое файла в виде потока байтов
Опция -AsByteStream указывает, что содержимое следует читать как поток байтов.
Предупреждение выдаётся при использовании параметра -AsByteStream с параметром -Encoding. Параметр -AsByteStream игнорирует любую кодировку, и выходные данные возвращаются в виде потока байтов.
При чтении и записи двоичных файлов используйте параметр -AsByteStream и значение 0 для параметра -ReadCount. Значение -ReadCount, равное 0, считывает весь файл за одну операцию чтения. Значение -ReadCount по умолчанию, равное 1, считывает один байт в каждой операции чтения и преобразует каждый байт в отдельный объект. Передача однобайтового вывода в Set-Content приводит к ошибкам, если вы не используете параметр -AsByteStream с Set-Content.
В этом примере показано, как получить содержимое файла в виде [byte[]] как одного объекта.
$byteArray = Get-Content -Path file1.txt -AsByteStream -Raw
Параметр -Raw гарантирует, что байты будут возвращены в виде [System.Byte[]]. Если параметр -Raw отсутствовал, возвращаемое значение представляет собой поток байтов, который интерпретируется PowerShell как [System.Object[]].
Выбор нового разделителя
Опция -Delimiter позволяет указать разделитель, который Get-Content будет использовать для разделения файла на объекты во время чтения. По умолчанию используется \n, символ конца строки. При чтении текстового файла Get-Content возвращает коллекцию строковых объектов, каждый из которых заканчивается символом конца строки. Когда вы вводите разделитель, которого нет в файле, Get-Content возвращает весь файл как один неограниченный объект.
Вы можете использовать этот параметр, чтобы разделить большой файл на файлы меньшего размера, указав разделитель файлов в качестве разделителя. Разделитель сохраняется (не удаляется) и становится последним элементом в каждом разделе файла.
Указание кодировки файла
Опция -Encoding указывает тип кодировки целевого файла. Значение по умолчанию – utf8NoBOM.
Допустимые значения этого параметра следующие:
- ascii: использует кодировку набора символов ASCII (7-бит).
- ansi: использует кодировку для кодовой страницы ANSI текущего языка и региональных параметров. Эта опция была добавлена в PowerShell 7.4.
- bigendianunicode: кодирует в формате UTF-16 с использованием обратного порядка байтов.
- bigendianutf32: кодирует в формате UTF-32, используя обратный порядок байтов.
- oem: использует кодировку по умолчанию для MS-DOS и консольных программ.
- unicode: кодирует в формате UTF-16 с прямым порядком байтов.
- utf7: кодирует в формате UTF-7.
- utf8: кодирует в формате UTF-8.
- utf8BOM: кодирует в формате UTF-8 с меткой порядка байтов (BOM).
- utf8NoBOM: кодирует в формате UTF-8 без метки порядка байтов (BOM).
- utf32: кодирует в формате UTF-32.
Начиная с PowerShell 6.2, параметр -Encoding также позволяет использовать числовые идентификаторы зарегистрированных кодовых страниц (например, -Encoding 1251) или строковые имена зарегистрированных кодовых страниц (например, -Encoding "windows-1251"). Дополнительные сведения см. в документации .NET для Encoding.CodePage: https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding.codepage
Начиная с PowerShell 7.4, вы можете использовать значение Ansi для параметра -Encoding, чтобы передать числовой идентификатор для текущей кодовой страницы ANSI языка и региональных параметров без необходимости указывать его вручную.
Мониторинг появления в файле новых строк
Опция -Wait заставляет командлет ждать неопределённое время, оставляя файл открытым, пока выполнение команды не будет прервано. Во время ожидания Get-Content проверяет файл раз в секунду и выводит новые строки, если они есть.
Get-Content file1.txt -Wait
При удалении строки весь файл выводится заново.
При использовании с параметром -TotalCount командлет Get-Content ожидает, пока указанное количество строк не станет доступным в указанном файле. Например, если вы укажете -TotalCount, равный 10, и файл уже содержит 10 или более строк, Get-Content вернёт 10 строк и завершит работу. Если в файле менее 10 строк, Get-Content выводит каждую строку по мере её поступления, но перед выходом ждёт, пока не появится десятая строка.
Вы можете прервать -Wait, нажав Ctrl+C. Удаление файла вызывает ошибку, которая также прерывает выполнение командлета.
-Wait нельзя сочетать с -Raw.
Связанные статьи:
- Аналоги cat, tail, head и wc в PowerShell (100%)
- Как мониторить появление новых строк в файле в PowerShell (66.4%)
- Ошибки «Оператор "<" зарезервирован для использования в будущем» и «The '<' operator is reserved for future use.» (РЕШЕНО) (57%)
- Как очистить окно терминала в PowerShell. Аналог clear (55.6%)
- Как в PowerShell сохранить вывод в файл (аналоги > и >>) (50%)
- Как вывод скрипта PowerShell записать в файлы журнала (RANDOM - 50%)