Командлеты 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"
Связанные статьи:
- Как в PowerShell сохранить вывод в файл (аналоги > и >>) (50%)
- Аналог echo в PowerShell (50%)
- Аналог cat в PowerShell (50%)
- Как в PowerShell менять набор выводимых по умолчанию данных (50%)
- Как выводить данные без таблицы в PowerShell (50%)
- Как вывод скрипта PowerShell записать в файлы журнала (RANDOM - 50%)