Генерирование файлов по шаблону из csv при помощи PowerShell

Задача: сгенерировать 300 конфигурационных файлов по шаблону с заполнением полей из CSV при помощи PowerShell.

Задача возникла в связи с тем, что понадобилось создать конфигурационные файлы для настройки IP-телефонов в количестве примерно 300. Таким образом, рассмотрим такой пример:
В CVS-файле содержатся данные о логинах и паролях в виде:
login;pass
101;g6j34yi7
102;ff6erdr3

300;65feu650

Конфигурационный файл должен иметь имя, совпадающее с логином, например, 101.cfg, и содержать следующие данные:
# Panasonic SIP Phone Standard Format File # DO NOT CHANGE THIS LINE!

## SIP Settings
PHONE_NUMBER_1="101"
# Authentication ID
SIP_AUTHID_1="101"
# Authentication Password
SIP_PASS_1="g6j34yi7"


Таким образом, на основании этих данных, скрипт PowerShell будет иметь следующий вид:

$choices = New-Object Collections.ObjectModel.Collection `
[Management.Automation.Host.ChoiceDescription]
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription `
-ArgumentList '        &Yes      '))
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription `
-ArgumentList '        &No       '))

$decision = $Host.UI.PromptForChoice($message, $question, $choices, 1)
if ($decision -eq 0) {
  Write-Host 'confirmed'

$UsersFile = 'VoIP-username-password.csv'
$UsersList = Import-Csv -Path $UsersFile -Encoding 'UTF8' -Delimiter ";"

$Template = '# Panasonic SIP Phone Standard Format File # DO NOT CHANGE THIS LINE!
 
## SIP Settings
PHONE_NUMBER_1="%login%"
# Authentication ID
SIP_AUTHID_1="%login%"
# Authentication Password
SIP_PASS_1="%PWD%"'

Foreach ($UserItem in $UsersList) 
{
 $NewTemplate = $Template -replace "%login%", $UserItem.login
 $NewTemplate = $NewTemplate -replace "%PWD%", $UserItem.pass
 $Path = 'C:\TEMP\tel\' + $UserItem.login + '.cfg'
 $NewTemplate >$Path
}

} else {
  Write-Host 'cancelled'
}

Конструкция:

$choices = New-Object Collections.ObjectModel.Collection `
[Management.Automation.Host.ChoiceDescription]
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription `
-ArgumentList '        &Yes      '))
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription `
-ArgumentList '        &No       '))

$decision = $Host.UI.PromptForChoice($message, $question, $choices, 1)
if ($decision -eq 0) {
  Write-Host 'confirmed'
... 
} else {
  Write-Host 'cancelled'
}

Этот блок предназначен для защиты от случайного запуска, который я стараюсь включать во все скрипты. Он всего лишь выводит сообщение, спрашивающее запускать ли скрипт.

$UsersFile = 'VoIP-username-password.csv'
$UsersList = Import-Csv -Path $UsersFile -Encoding 'UTF8' -Delimiter ";"

Здесь мы задаем имя CSV файла и загружаем его.
В переменную $Template записываем шаблон, предварительно определив заменяемые поля: %login% и %PWD%.
Далее зачитываем в цикле загруженный файл построчно.

$NewTemplate = $Template -replace "%login%", $UserItem.login
$NewTemplate = $NewTemplate -replace "%PWD%", $UserItem.pass
$Path = 'C:\TEMP\tel\' + $UserItem.login + '.cfg'
$NewTemplate >$Path

Здесь в шаблоне делаем замену шаблонных полей на нужные нам поля: $UserItem.login и $UserItem.pass, зачитанные из файла.
В переменной $Path нужно задать путь и имя файла для сохранения.


В результате выполнения данного скрипта получим список файлов в указанной директории:


(с) Ella S.
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.

3 комментария:

  1. Привет!
    Генерируемый таким образом файл, имеет размер в два раза больше шаблона.
    Power Shell добавляет к каждому байту - дополнительный байт 0х20.

    ОтветитьУдалить
  2. Чтобы исправить добавление байта 0х20 к каждому байту шаблона, надо вместо
    $NewTemplate >$Path
    написать
    $NewTemplate | Out-File -FilePath $Path -Encoding ASCII

    ОтветитьУдалить