программирование,

Как создать много файлов с разным, динамическим содержанием в Powershell

Jul 31, 2019 · 3 мин. на прочтение
Как создать много файлов с разным, динамическим содержанием в Powershell
Поделиться

Потребовалось создать большое количество файлов, но с разным содержанием. К тому же содержание не однострочное, а полнотекстовое и в каждом файле разное. Я был уверен, что Powershell лучший помощник в этом деле, но как именно это сделать я не знал. Делюсь с Вами своими изысканиями.

Ниже я привожу не свою, а выдуманную задачу. Она лучше подходит для описания.

Задача

Есть большой список фамилий. Под каждую фамилию нужно сгенерировать отдельный файл, содержащий несколько строк текста, но таким образом, чтобы в нужном месте подставлялась фамилия.

Решение

Задача делиться на три части.

  • Прочитать из файла фамилии
  • Создать файл
  • Поместить в файл содержимое с подстановкой фамилии в нужном месте

Прочитать из файла фамилии

Для начала нам нужно из заранее подготовленного файла построчно прочитать его содержимое и поместить его в переменную. Это делается очень просто.

$users = Get-Content users.txt

Создать файл

Создать файл тоже очень просто. Для этого используем командлет New-Item. В параметре -Path задаём путь к файлу, в параметре -Name его имя, а параметр -Value будет содержать текст, который мы хотим поместить в файл.

New-Item -Path C:\Temp -Name "file_name.txt" -Value $fileContent

Всё просто, если бы нам нужно было создать один файл с одностроковым содержимым. Чтобы создать много файлов нам понадобится цикл foreach и каким-то образом нужно поместить в файл многострочный текст, да ещё и с подстановкой динамического контента в нужном месте. Вот тут-то я и узнал о Here-Strings в powershell.

Поместить в файл содержимое с подстановкой фамилии в нужном месте

Прежде всего нам нужно поместить многострочный текст в переменную. Допустим это будет следующий текст:

Уважаемый $user,

Приветствую Вас на страницах моего нового блога. Надеюсь, что Вам здесь понравиться.

С Уважением,
danshin.ms

В Powershell мы можем использовать Here-Strings, чтобы объявить блок текста и поместить его в переменную. Вот как это делается.

$fileContent = @"
Уважаемый $user,

Приветствую Вас на страницах моего нового блога. Надеюсь, что Вам здесь понравиться.

С Уважением,
danshin.ms
"@

Переменная $fileContent будет содержать наш текст. Форматирование передаётся параметру -Value в командлете New-Item. А вместо $user будет подставляться содержимое этой переменной. Это то, что нам нужно! Осталось только поместить это всё в цикл.

Сразу приведу полный текст скрипта.

# Читаем из файла список пользователей и помещаем его в массив $users.
$users = Get-Content users.txt

# С помощью цикла foreach проходим по каждому элементу массива.
foreach ($user in $users)
{
  $fileContent = @"
Уважаемый $user,

Приветствую Вас на страницах моего нового блога. Надеюсь, что Вам здесь понравиться.

С Уважением,
danshin.ms
"@

# Создаём файл.
  New-Item -Path C:\Temp -Name $user".txt" -Value $fileContent
}

Как видите, всё очень просто и элегантно. Думаю, что Here-Strings пригодиться ещё не раз. Напишите в комментариях, что Вы об этом думаете и какие сценарии использования Here-Strings Вы применяли.

Заходите в группу Telegram
Если есть вопросы или хотите пообщаться, то заходите в мою группу Telegram.