Потребовалось создать большое количество файлов, но с разным содержанием. К тому же содержание не однострочное, а полнотекстовое и в каждом файле разное. Я был уверен, что 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 Вы применяли.