Командлеты Set-Content и Add-Content для обработки строк


Обработка строк в PowerShell

Кроме перенаправления вывода в файл и командлета Out-File, также предназначенного для сохранения вывода в файл, в PowerShell имеются два командлета для обработки строк. Это командлеты Set-Content и Add-Content.

Set-Content обрабатывает строки и перезаписывает содержимое файла, если он уже имеется.

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

Чтобы понять разницу между Out-File и Set-Content (Add-Content) посмотрите на пример работы этих программ:

Get-ChildItem | Out-File test1.txt
Get-Content test1.txt

Get-ChildItem | Set-Content test2.txt
Get-Content test2.txt

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

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

Get-ComputerInfo | Set-Content test3.txt

Причина потери данных в том, что вместо строк Set-Content получает объект Microsoft.PowerShell.Commands.ComputerInfo.

Set-Content

Set-Content — это командлет обработки строк, который записывает новое содержимое или заменяет содержимое в файле. Set-Content заменяет существующее содержимое и отличается от командлета Add-Content, который добавляет содержимое в файл. Чтобы отправить контент в Set-Content, вы можете использовать параметр -Value в командной строке или отправить контент через конвейер.


Например, следующие команды равнозначны:

Get-Help about_Comparison_Operators -Full > man.txt
Get-Help about_Comparison_Operators -Full | Set-Content man.txt

Вместо Set-Content вы можете использовать встроенный псевдоним этой команды «sc».

Set-Content предназначен для обработки строк. Если вы передаёте нестроковые объекты по конвейеру Set-Content, он преобразует объект в строку перед её записью. Для записи объектов в файлы используйте Out-File.

Командлет Set-Content разработан для работы с данными, предоставляемыми любым провайдером. Чтобы вывести список поставщиков, доступных в вашем сеансе, введите

Get-PsProvider

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

Get-Help about_Comparison_Operators -Full | Set-Content man.txt
Get-Help about_Comparison_Operators -Full | Set-Content -Path man.txt

Опции -Path можно найти применение, поскольку она поддерживает подстановочные символы, например:

Get-Help about_Comparison_Operators -Full | Set-Content -Path man[1-3].txt

Предыдущая команда НЕ означает, что будет созданы 3 файла с именами man1.txt, man2.txt, man3.txt и одинаковым содержимым. Эта команда означает, что будет выполнен поиск файлов по указанному образцу, и если таких файлов нет, то программа завершиться ошибкой.

Смотрите также: Подстановочные символы в PowerShell

При рабоче с группой файлов вы можете комбинировать с опцией -Path опцию -Exclude (исключить файлы по указанному шаблону) и опцию -Include (включить файлы по указанному шаблону). Обе эти опции также поддерживают подстановочные знаки.

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

Выше показаны примеры передачи строк для сохранения в файл по контейнеру (трубе), строку или объект также можно указать с опцией -Value:

Set-Content -Value "String to save" str.txt

По умолчанию Set-Content не выводит на экран сохраняемые строки, вы можете одновременно с сохранением файла вывести содержимое по конвейеру, для этого добавьте опцию -PassThru. Если в конвейере отсутствуют последующие командлеты, то содержимое будет показано в стандартном выводе (в консоли).

Опция -AsByteStream указывает, что содержимое следует читать как поток байтов. Этот параметр был введён в PowerShell 6.0. Предупреждение возникает при использовании параметра -AsByteStream с параметром -Encoding. Параметр AsByteStream игнорирует любую кодировку, и выходные данные возвращаются в виде потока байтов.

Опция -Encoding задаёт тип кодировки для целевого файла. Значение по умолчанию — UTF8NoBOM. Кодировка — это динамический параметр, который поставщик FileSystem добавляет в Set-Content. Этот параметр работает только на дисках с файловой системой. Допустимые значения этого параметра следующие:

  • ASCII: использует кодировку для набора символов ASCII (7-бит).
  • BigEndianUnicode: кодирует в формате UTF-16, используя порядок байтов с прямым порядком байтов.
  • 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"».

Примеры использования Set-Content

Пример 1: Замена содержимого нескольких файлов в директории

Проверяем наличие файлов в текущей папке:

Get-ChildItem -Path .\Test*.txt
Test1.txt
Test2.txt
Test3.txt

Записываем строку во все три файла и проверяем их содержимое:

Set-Content -Path .\Test*.txt -Value 'Hello, World'
Get-Content -Path .\Test*.txt
Hello, World
Hello, World
Hello, World

Командлет Get-ChildItem использует параметр -Path для вывода списка файлов .txt, которые начинаются с Test в текущем каталоге. Командлет Set-Content использует параметр -Path для указания файлов вида *.txt.

Параметр -Value предоставляет текстовую строку «Hello, World», которая заменяет существующее содержимое в каждом файле. Командлет Get-Content использует параметр -Path для указания файлов вида *.txt и отображает содержимое каждого файла в консоли PowerShell.


Пример 2: Создание новых файлов и запись в них

Set-Content -Path .\DateTime.txt -Value (Get-Date)
Get-Content -Path .\DateTime.txt
16.08.2021 8:41:37

Set-Content использует параметры -Path и -Value для создания нового файла с именем DateTime.txt в текущем каталоге. Параметр -Value использует командлет Get-Date для получения текущей даты и времени. Set-Content записывает объект DateTime в файл в виде строки. Командлет Get-Content использует параметр -Path для отображения содержимого DateTime.txt в консоли PowerShell.

Пример 3: Замена текста в файле

Get-Content -Path .\Notice.txt
Warning
Replace Warning with a new word.
The word Warning was replaced.

(Get-Content -Path .\Notice.txt) | ForEach-Object {$_ -Replace 'Warning', 'Caution'} | Set-Content -Path .\Notice.txt

Get-Content -Path .\Notice.txt
Caution
Replace Caution with a new word.
The word Caution was replaced.

Командлет Get-Content использует параметр -Path для указания файла Notice.txt в текущем каталоге. Команда Get-Content заключена в круглые скобки, так что команда завершается перед отправкой по конвейеру.


Содержимое файла Notice.txt отправляется по конвейеру командлету ForEach-Object. ForEach-Object использует автоматическую переменную «$ _» и заменяет каждое вхождение «Warning» на «Caution». Объекты отправляются по конвейеру в командлет Set-Content. Set-Content использует параметр -Path для указания файла Notice.txt и записывает обновлённое содержимое в файл.

Последний командлет Get-Content отображает обновлённое содержимое файла в консоли PowerShell.

Пример 4: Использование фильтров с Set-Content

Set-Content -Path C:\Temp\* -Filter *.txt -Value "Empty"

Add-Content

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

Командлет Add-Content добавляет содержимое к указанному элементу или файлу. Вы можете указать содержимое, набрав содержимое в команде или указав объект, который содержит содержимое.

Командлет поддерживает все уже рассмотренные опции Set-Content, а именно:

  • -Value
  • -Path
  • -Exclude
  • -Include
  • -NoNewline
  • -PassThru
  • -AsByteStream
  • -Encoding

Значение опций одинаково, поэтому если вам нужна справка по ним, то пролистните чуть выше.

Дополнительно Add-Content поддерживает опцию -Force, которая переопределяет атрибут только для чтения, позволяя добавлять содержимое в файл, доступный только для чтения.

Например, -Force переопределит атрибут только для чтения или создаст каталоги для завершения пути к файлу, но не будет пытаться изменить права доступа к файлу.

Примеры использования Add-Content

Пример 1: Добавить строку во все текстовые файлы за исключением файлов с именем типа «help*»

Add-Content -Path .\*.txt -Exclude help* -Value 'End of file'

Параметр -Path указывает все файлы .txt в текущем каталоге, но параметр -Exclude игнорирует имена файлов, соответствующие указанному шаблону. Параметр -Value указывает текстовую строку, которая записывается в файлы.

Пример 2: Добавить дату в конец указанных файлов

Add-Content -Path .\DateTimeFile1.log, .\DateTimeFile2.log -Value (Get-Date) -PassThru
16 августа 2021 г. 8:39:40
16 августа 2021 г. 8:39:40

Get-Content -Path .\DateTimeFile1.log
16.08.2021 8:39:40

Командлет Add-Content создаёт два новых файла в текущем каталоге. Параметр -Value содержит выходные данные командлета Get-Date. Параметр -PassThru выводит добавленное содержимое в конвейер. Поскольку другого командлета для получения вывода нет, он отображается в консоли PowerShell. Командлет Get-Content отображает обновленный файл DateTimeFile1.log.

Пример 3: Добавить содержимое указанного файла в другой файл


$From = Get-Content -Path .\CopyFromFile.txt
Add-Content -Path .\CopyToFile.txt -Value $From
Get-Content -Path .\CopyToFile.txt

Командлет Get-Content получает содержимое CopyFromFile.txt и сохраняет его в переменной $From. Затем командлет Add-Content обновляет файл CopyToFile.txt, используя содержимое переменной $From. Командлет Get-Content отображает CopyToFile.txt.

Пример 4: Добавить содержимое указанного файла в другой файл с помощью конвейера

Get-Content -Path .\CopyFromFile.txt | Add-Content -Path .\CopyToFile.txt
Get-Content -Path .\CopyToFile.txt

Командлет Get-Content получает содержимое CopyFromFile.txt. Результаты передаются командлету Add-Content, который обновляет CopyToFile.txt. Последний командлет Get-Content отображает CopyToFile.txt.

Пример 5: Создать новый файл и скопировать содержимое

Add-Content -Path .\NewFile.txt -Value (Get-Content -Path .\CopyFromFile.txt)
Get-Content -Path .\NewFile.txt

Командлет Add-Content использует параметры -Path и -Value для создания нового файла в текущем каталоге. Затем командлет Get-Content получает содержимое существующего файла CopyFromFile.txt и передаёт его параметру -Value. Скобки вокруг командлета Get-Content гарантируют, что команда завершится до начала команды Add-Content. Далее командлет Get-Content отображает содержимое нового файла NewFile.txt.

Пример 6: Добавление содержимого в файл, доступный только для чтения

New-Item -Path .\IsReadOnlyTextFile.txt -ItemType File
Set-ItemProperty -Path .\IsReadOnlyTextFile.txt -Name IsReadOnly -Value $True
Get-ChildItem -Path .\IsReadOnlyTextFile.txt
Add-Content -Path .\IsReadOnlyTextFile.txt -Value 'Add value to read-only text file' -Force
Get-Content -Path .\IsReadOnlyTextFile.txt

Командлет New-Item использует параметры -Path и -ItemType для создания файла IsReadOnlyTextFile.txt в текущем каталоге. Далее командлет Set-ItemProperty использует параметры -Name и -Value для изменения свойства IsReadOnly файла на True. Затем командлет Get-ChildItem показывает, что файл пуст (0) и имеет атрибут только для чтения («r»). Командлет Add-Content использует параметр -Path для указания файла. Параметр -Value включает текстовую строку для добавления в файл. Параметр -Force записывает текст в файл, доступный только для чтения. Командлет Get-Content использует параметр -Path для отображения содержимого файла.

Чтобы удалить атрибут только для чтения, используйте команду Set-ItemProperty с параметром -Value, установленным на «False».

Пример 7: Использование -Filter с Add-Content

Add-Content -Path C:\Temp\* -Filter *.txt -Value "Done"

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *