Заметки о Windows и других программных продуктах Microsoft...

Как вставить строку в текстовый файл с помощью PowerShell

Как вставить строку в текстовый файл с помощью PowerShell

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

Итак, в папке C:\temp находится текстовый файл file.txt. Для начала выведем его содержимое командой:

Get-Content file.txt

вывод содержимого файла

 

В файле всего 5 строк и нам необходимо вставить дополнительную строку между третьей и четвертой. Действовать будем следующим образом:

Сначала возьмем исходный файл и поместим его содержимое в переменную. Команда Get-Content выгружает текстовый файл в виде массива, в котором элементами являются строки. Таким образом в переменной $FileOriginal мы получим массив строк:

$FileName = ″C:\temp\file.txt″
$FileOriginal = Get-Content $FileName

Затем создадим еще один массив строк, пустой:

[String[]]$FileModified = @()

Строку, которую необходимо вставить, помещаем в переменную:

[String]$string = ″String three and half.″

Теперь берем исходный массив $FileOriginal и в цикле построчно передаем его в новый массив $FileModified, попутно проверяя каждую строку.  Если строка соответствует заданному условию, то после нее вставляется дополнительная строка:

Foreach ($Line in $FileOriginal){
$FileModified += $Line
if ($Line -match ″three″) {$FileModified += $string}
}

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

Set-Content $fileName $FileModified -Force

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

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

 

Если требуется вставить несколько строк, то можно немного изменить скрипт. С помощью конструкции Here-Strings добавим несколько строк в переменную $strings и уже эту переменную будем вставлять в текст:

$FileName = ″C:\temp\file.txt″
$FileOriginal = Get-Content $FileName
[String[]]$FileModified = @()

$strings = @″
String three and quarter.
String three and half.
″@

Foreach ($Line in $FileOriginal){
$FileModified += $Line
if ($Line -match ″three″) {$FileModified += $strings}
}
Set-Content $fileName $FileModified -Force

Получится примерно так.

вставка нескольких строк

 

И еще один возможный случай, когда надо не просто вставить новый текст, а заменить существующий.  Для этого можно воспользоваться свойством Replace строки. Еще раз изменим скрипт:

$FileName = ″C:\temp\file.txt″
$FileOriginal = Get-Content $FileName
[String[]]$FileModified = @()
[String]$string = ″String three and half.″

Foreach ($Line in $FileOriginal){

if ($Line -match ″three″) {

$FileModified += $Line.Replace($Line, $string)

} else {

$FileModified += $Line

}
}

Set-Content $fileName $FileModified -Force

Теперь при запуске скрипта исходная строка будет заменена.

замена строки

 

Вот как то так.

 
 
Комментарии

Спасибо за статью.
А как выполнить такое действие: из текстового файла с N строк извлечь в новый файл, например, каждую 10-ую строку?

Как то так:

Foreach ($Line in $FileOriginal){
if ($Line.ReadCount -match «0») {$FileModified += $Line}
}

Set-Content $NewfileName $FileModified -Force

Диана

Может сможет кто подсказать. Нужен скрипт, который будет записывать в один и тоже файл цифры от 1 до 100, не перезаписывая, а добавляя

Ответить