Powershell изменить строку в файле

Обновлено: 04.07.2024

Я только начал использовать Powershell, потому что мне нужно создать сценарий, который помещает ссылки во все файлы (файлы htm) папки. Эти ссылки фактически связывают все файлы между собой. У меня есть список файлов, которые находятся в папке (этот файл называется list.txt и содержит имена файлов без расширения)

В каждый файл я хочу внести следующие изменения:

<tspan x="53" y="54.8"><a href="C:/[. path. ]/HTMs/Surveillance_Err_PRG.htm">Surveillance_Err_PRG</a></tspan>

После некоторого исследования я написал следующий код, но он ничего не делает (вывод просто отображает мой код):

До этого у меня было так:

На самом деле это не работает, так как просто помещает ссылку во внутренний заголовок (в каждом htm есть имя документа, отображаемое вверху).

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

2 ответа

Итак, я нашел решение

Сначала у меня там была проблема

Переменные были разными, но потом я получил эту ошибку:

Я решил эту проблему, добавив .FullName после $ file, что предотвратило попытку Get-Content получить доступ к файлу из текущего каталога:

Поскольку вы не включили все файлы, я создал простой файл source.html :

Для вашего примера, чтобы получить окончательный результат, вам нужно будет сделать это следующим образом: (примечание: Не забудьте изменить свой путь к HtmlAgilityPack.dll )

Хост записи выдаст ваше желание:

<tspan x="53" y="54.8"><a href="c:\<your_path>\HTMs\Surveillance_Err_PRG.htm">Surveillance_Err_PRG</a></tspan>

Чтобы найти строку в файле, вы можете сделать что-то вроде этого (просто фрагмент):

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

Теперь все вместе это выглядит так:

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

В Windows PowerShell предусмотрены встроенные возможности сопоставления и замены строк с помощью операторов сравнения. Однако в PowerShell нет собственной команды для замены строк текста в файлах, и, чтобы устранить этот изъян, я подготовил сценарий Replace-FileString.ps1. В этой статье сначала я покажу, как эффективно использовать возможности PowerShell, а затем речь пойдет о применении Replace-FileString.ps1

Собственные возможности PowerShell

С помощью имеющихся в PowerShell операторов -like, -match и -replace пользователи, мало знакомые с программированием, могут без труда сопоставлять и заменять строки. В командной строке PowerShell проще экспериментировать с регулярными выражениями. NET, чем в традиционных языках сценариев. Регулярное выражение (иногда именуемое regex) — строка, содержащая специальные символы или последовательности символов, которые представляют другие символы или их последовательности. Регулярные выражения похожи на универсальные символы, но гораздо выразительнее. Знакомство с регулярными выражениями можно начать с раздела about_regular_expressions в «Справке PowerShell». Для просмотра раздела введите

в командной строке PowerShell.

Очевидная область применения регулярных выражений — замена строк в файлах. Например, требуется извлечь только имена компьютеров из вывода команды Net View. Если запустить команду

а затем открыть файл List.txt в программе «Блокнот», то видно, что в нем присутствует много разнообразной избыточной информации, в том числе заголовки столбцов, дополнительные пробелы в конце каждой строки и нижняя строка, в которой сообщается об успешном завершении команды. С помощью регулярных выражений в PowerShell можно извлечь из вывода только имена компьютеров. Например, рассмотрим команду

Хотя команда показана на нескольких строках, ее следует вводить в одной строке в консоли PowerShell. То же относится и к другим командам, разнесенным по нескольким строкам. Команда Get-Content извлекает отдельные строки из List.txt. Затем команда Where-Object с помощью оператора -match проверяет, начинается ли строка с двух обратных косых черт. Такие строки передаются в команду ForEach-Object, где с помощью оператора -replace отбираются только имена компьютеров.

Остановимся подробнее на операторе -match, который используется с последовательностью ^\\\\. Символ каре (^) указывает, что нужно сопоставить начальные символы. Косая обратная черта — управляющий символ для регулярных выражений, поэтому нужно использовать две косые обратные черты (\\) для представления одной косой обратной черты (\). Таким образом, в общей сложности получается четыре косые обратные черты. В таблице 1 описаны этот и другие шаблоны регулярных выражений, используемые в команде.

Таблица 1. Шаблоны в коде извлечения

Сценарий Replace-FileString.ps1

Часто при работе с текстовыми файлами бывает полезно заменить строки в файле с использованием регулярных выражений, а затем записать результаты в первоначальный файл. В PowerShell нет команды с такой функциональностью, поэтому я подготовил сценарий Replace-FileString.ps1. Его действие аналогично открытию файла в программе «Блокнот», выполнению операции поиска и замены и сохранению файла. Но, в отличие от «Блокнота», этот сценарий можно использовать для замены строк в нескольких файлах одновременно.

Для Replace-FileString.ps1 требуется PowerShell 2.0. Параметры командной строки для сценария приведены в таблице 2. Кроме параметров, перечисленных в таблице 2, сценарий распознает типовые параметры -Confirm, -Verbose и -WhatIf.

Таблица 2. Параметры сценария Replace-FileString.ps1

Существует два обязательных параметра: -Pattern и -Replacement. Также необходимо указать файл, в котором будут выполнены поиск и замена строк. Сделать это можно двумя способами. Первый способ — использовать параметр -Path или -LiteralPath в команде следующего вида:

Обычно нет нужды использовать параметр -LiteralPath, если только не требуется указать путь или имя файла с символами, часто интерпретируемыми PowerShell как универсальные. Типичный пример — квадратные скобки, [].

Чтобы продемонстрировать использование Replace-FileString.ps1, рассмотрим три примера применения. В них показано, как с помощью сценария преобразовать вывод Net View в список имен компьютеров с разделительными запятыми, заменить данные в. ini-файлах и заменить путь LDAP в наборе сценариев.

Пример применения 1

Предположим, что требуется преобразовать вывод Net View в список имен компьютеров с разделителями запятыми. Сначала можно использовать команду Net View с операторами -match и -replace для формирования списка имен компьютеров, например:

Описания шаблонов регулярных выражений можно найти в таблице 1. Файл Computers.txt содержит имена компьютеров из команды Net View, по одному имени в строке. Затем можно заменить в файле переходы на новую строку запятыми с помощью команды

Эта команда заменяет запятыми все символы \r\n (возврат каретки и перевод строки) в файле и выводит файл. При необходимости можно добавить параметр -Overwrite, чтобы заменить исходный файл измененной копией, например:

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

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

$string = ″My name is Kirill″
$string | Get-Member

свойства и методы строки

Свойства

А свойство Chars позволяет обращаться к любому символу в строке по его номеру, например:

свойства строки

Кстати, к символам в строке можно обращаться без использования Chars, а как к элементам массива, по индексу:

А если указать отрицательное число, то массив будет перебираться с конца:

Также кроме одного символа можно указать диапазон, например:

обращение к элементам строки

Методы

Теперь возьмем строку и начнем над ней издеваться приступим к методам.

Метод Insert служит для вставки подстроки в исходную строку, начиная с указанного символа. Для примера вставим ″ .N″ в конец строки (после 17 символа):

Метод Remove удаляет символы из строки начиная с указанного символа, например:

Метод Replace находит в исходной строке подстроку и заменяет ее на другую, например:

методы insert, remove и replace

Метод Split разбивает строку на массив строк с помощью разделяющего символа или группы символов. Например так мы разобьем строку, используя в качестве разделителя пробел:

А так укажем в качестве разделителя букву е:

Если необходимо указать несколько разделителей, то достаточно просто перечислить их через запятую:

метод split

Метод Substring позволяет получить подстроку, сформированную из исходной строки. Есть два варианта использования этого метода. К примеру результатом выполнения следующей команды будет строка, полученная путем удаления из исходной строки заданного количества символов:

А таким способом мы получим подстроку, сформированную из исходной строки, начинающуюся с указанной позиции (8) и содержащую указанное количество символов (9):

метод substring

Метод Clone создает точную копию исходного объекта, например:

Метод CompareTo производит сравнение двух строк и выдает 0, если строки совпадают:

В случае несовпадения метод может выдать -1 (если первая строка больше второй) или 1 (если первая строка меньше второй). Также при использовании этого метода стоит учитывать, что регистр символов влияет на результат сравнения. Если необходимо сравнить строки без учета регистра, то можно воспользоваться статическим методом Compare, о котором чуть позже.

Метод Equals также сравнивает две строки и в зависимости от результата возвращает True или False:

Кстати, такой же результат получается при использовании оператора сравнения -eq:

$string -eq $string2

методы clone, compareto и equals

Метод Contains проверяет наличие в строке указанной подстроки, и в зависимости от результата возвращает True или False. Например:

Метод StartsWith проверяет, начинается ли строка с указанной подстроки:

а метод EndsWith проверяет, заканчивается ли исходная строка подстрокой:

Обратите внимание, что эти методы также чувствительны к регистру символов.

методы contains, startwith, endwith

Говоря о зависимости от регистра символов, стоит упомянуть еще два метода. Метод ToUpper переводит исходную строку в верхний регистр:

а метод ToLower соответственно в нижний:

методы toupper и tolower

С их помощью можно избавиться от регистрозависимости, например при поиске или сравнении:

избавление от регистрозависимости

Метод IndexOf находит индекс начала вхождения подстроки в исходной строке. Например, создадим строковую переменную:

$string = ″substring one, substring two, substring three″

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

методы indexof и lastindexof

методы indexofany и lastindexofany

Методы PadLeft и PadRight позволяют дополнить исходный текст до нужного количества символов слева или справа. Для примера создадим новую переменную $string и посмотрим ее длину:

$string = ″my name is Vasya Pupkin″
$string.Length

Как видите, строка содержит 23 символа. Дополним ее точками до 26 символов слева:

а получившуюся строку дополним знаками вопроса до 30 символов справа:

В принципе, процесс можно не разбивать на части, а дополнить сразу с двух сторон:

методы padleft и padright

и лишние знаки вопроса в конце:

методы trimstart и trimend

Немного о типах данных. Текущий тип данных можно посмотреть с помощью метода GetType, например:

$a = ″string ″
$a.GetType()

В поле Name указан тип данных String (строка).

метод gettype

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

Если теперь проверить тип данных, то вместо String мы увидим тип Char[].

метод tochararray

Преобразовать тип данных можно и с помощью статического метода Convert. Для примера создадим переменную, содержащую строку, а затем преобразуем ее в число (Int32);

$string = ″123″
$int = [convert]::ToInt32($string)

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

Статические методы

Кроме обычных к строке можно применять статические методы. Вывести их список можно все той же командой Get-Member с ключом -Static.

статические методы строки

Методов много, поэтому коротко пробежимся по некоторым из них.

Метод Concat используется для объединения нескольких строк. В качестве примера создадим три стоковых переменных и объединим их:

$a = ″one″
$b = ″two″
$c = ″three″
[string]::Concat($a,$b,$c)

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

статические методы concat и join

Метод Copy создает точную копию исходной строки:

Метод Compare производит сравнение двух строк и выдает 0 при их совпадении или 1\-1 при несовпадении, аналогично методу CompareTo:

Метод Equals также производит сравнение и выдает результат в виде True\False:

статические методы compare и equals

$a = ″string″
$b = ″String″

А теперь сравним их. Эта команда покажет, что строки идентичны:

использованием регистрозависимости и без

И еще пара интересных методов для проверки строк. Метод IsNullOrEmpty проверяет наличие строки, а также не является ли она пустой строкой:

Метод IsNullOrWhiteSpace тоже проверяет наличие строки, а также то, что строка содержит только white-space символы (пробел, табуляция, символ новой строки и т.п.):

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

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

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

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

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

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



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

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

Set-Content

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

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

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

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

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

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

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

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

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

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

По умолчанию 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.

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

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

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

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

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

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

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


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

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

Командлет 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

Add-Content

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


Командлет 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».

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