Транслитерация через PowerShell

Время от времени возникают задачи по транслитерации содержания фалов. Недавно была задача, попросили помочь с переводом адресной книги .vcf из кириллических символов в латиницу. Была тоже задача после выгрузки из AD данных в .csv файл, оказалось что там много данных в кириллице.

Менять все это руками конечно можно, если там десяток или пару десятков строк, но когда количество больше сотни, а то и тысячу, то занятие становится нудным.

Задача была решена через powershell скрипт, а после чуть доработана в плане интерактивности.

Собственно сам скрипт с комментариями:

#############################################################
# Скрипт транслитерации с кириллических символов в латиницу #
#############################################################

# Чистка экрана
cls

# Загрузка классов .NET Framework для создания форм 
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# Создание формы и элементов управления
$form = New-Object System.Windows.Forms.Form
$form.Text = 'Транслитерация rus->eng'
$form.Size = New-Object System.Drawing.Size(300,240)
$form.StartPosition = 'CenterScreen'

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(75,160)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = 'OK'
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(150,160)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = 'Cancel'
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)

$labelin = New-Object System.Windows.Forms.Label
$labelin.Location = New-Object System.Drawing.Point(10,20)
$labelin.Size = New-Object System.Drawing.Size(280,20)
$labelin.Text = 'Введите путь к файлу для транслитерации:'
$form.Controls.Add($labelin)

$textBoxIn = New-Object System.Windows.Forms.TextBox
$textBoxIn.Location = New-Object System.Drawing.Point(10,40)
$textBoxIn.Size = New-Object System.Drawing.Size(260,80)
$form.Controls.Add($textBoxIn)

$labelout = New-Object System.Windows.Forms.Label
$labelout.Location = New-Object System.Drawing.Point(10,80)
$labelout.Size = New-Object System.Drawing.Size(280,20)
$labelout.Text = 'Введите путь выгрузки файла:'
$form.Controls.Add($labelout)

$textBoxOut = New-Object System.Windows.Forms.TextBox
$textBoxOut.Location = New-Object System.Drawing.Point(10,100)
$textBoxOut.Size = New-Object System.Drawing.Size(260,100)
$form.Controls.Add($textBoxOut)

# Вывод на передний план (поверх всех окон)
$form.Topmost = $true

# Фокус на первое текстовое поле
$form.Add_Shown({$textBoxIn.Select()})
$result = $form.ShowDialog()

# 
# Код формы - https://docs.microsoft.com/ru-ru/powershell/scripting/samples/creating-a-custom-input-box?view=powershell-5.1
# 

############################################################
# Функция транслитерации кириллических символов в латиницу  #
############################################################
function global:TranslitToLAT
{
param([string]$inString)
# таблица соответствия символов
$Translit_To_LAT = @{
[char]'а' = "a"
[char]'А' = "A"
[char]'б' = "b"
[char]'Б' = "B"
[char]'в' = "v"
[char]'В' = "V"
[char]'г' = "g"
[char]'Г' = "G"
[char]'д' = "d"
[char]'Д' = "D"
[char]'е' = "e"
[char]'Е' = "E"
[char]'ё' = "e"
[char]'Ё' = "E"
[char]'ж' = "zh"
[char]'Ж' = "Zh"
[char]'з' = "z"
[char]'З' = "Z"
[char]'и' = "i"
[char]'И' = "I"
[char]'й' = "i"
[char]'Й' = "I"
[char]'к' = "k"
[char]'К' = "K"
[char]'л' = "l"
[char]'Л' = "L"
[char]'м' = "m"
[char]'М' = "M"
[char]'н' = "n"
[char]'Н' = "N"
[char]'о' = "o"
[char]'О' = "O"
[char]'п' = "p"
[char]'П' = "P"
[char]'р' = "r"
[char]'Р' = "R"
[char]'с' = "s"
[char]'С' = "S"
[char]'т' = "t"
[char]'Т' = "T"
[char]'у' = "u"
[char]'У' = "U"
[char]'ф' = "f"
[char]'Ф' = "F"
[char]'х' = "kh"
[char]'Х' = "Kh"
[char]'ц' = "tc"
[char]'Ц' = "Tc"
[char]'ч' = "ch"
[char]'Ч' = "Ch"
[char]'ш' = "sh"
[char]'Ш' = "Sh"
[char]'щ' = "shch"
[char]'Щ' = "Shch"
[char]'ъ' = "" # "``"
[char]'Ъ' = "" # "``"
[char]'ы' = "y" # "y`"
[char]'Ы' = "Y" # "Y`"
[char]'ь' = "" # "`"
[char]'Ь' = "" # "`"
[char]'э' = "e" # "e`"
[char]'Э' = "E" # "E`"
[char]'ю' = "iu"
[char]'Ю' = "Iu"
[char]'я' = "ia"
[char]'Я' = "Ia"
[char]' ' = " "
}
# обработка в цикле кириллических символов с заменой на латиницу
$outChars=""
foreach ($c in $inChars = $inString.ToCharArray())
{
if ($Translit_To_LAT[$c] -cne $Null )
{$outChars += $Translit_To_LAT[$c]}
else
{$outChars += $c}
}
Write-Output $outChars
}
# конец функции

# обработка данных формы:

if ($result -eq [System.Windows.Forms.DialogResult]::OK) 
# обработка при нажатии ОК, иначе прекращение работы
{
$text = (Get-Content -raw $textBoxIn.Text)	
# Прием значения адреса файла для обработки содержания
$log = TranslitToLAT $text
# Транслитерация содержимого файла
$log > $textBoxOut.Text
# Выгрузка результат в файл по адресу из формы
}
# ###########################################
#  Конец скрипта                            #
# ###########################################

Не нашел пока решения как вводимые поля делать для выборки пути к файлу, поэтому нужно вводить полный путь к файлу обработки и вывода.

Top