Задача: сгенерировать 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 будет иметь следующий вид:
Конструкция:
Этот блок предназначен для защиты от случайного запуска, который я стараюсь включать во все скрипты. Он всего лишь выводит сообщение, спрашивающее запускать ли скрипт.
Здесь мы задаем имя CSV файла и загружаем его.
В переменную $Template записываем шаблон, предварительно определив заменяемые поля: %login% и %PWD%.
Далее зачитываем в цикле загруженный файл построчно.
Здесь в шаблоне делаем замену шаблонных полей на нужные нам поля: $UserItem.login и $UserItem.pass, зачитанные из файла.
В переменной $Path нужно задать путь и имя файла для сохранения.
В результате выполнения данного скрипта получим список файлов в указанной директории:
(с) Ella S.
Задача возникла в связи с тем, что понадобилось создать конфигурационные файлы для настройки 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.
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.
Привет!
ОтветитьУдалитьГенерируемый таким образом файл, имеет размер в два раза больше шаблона.
Power Shell добавляет к каждому байту - дополнительный байт 0х20.
Чтобы исправить добавление байта 0х20 к каждому байту шаблона, надо вместо
ОтветитьУдалить$NewTemplate >$Path
написать
$NewTemplate | Out-File -FilePath $Path -Encoding ASCII
Спасибо за дополнение.
Удалить