Создание пароля на Powershell

Немало копий сломано на тему, какое средство для создания случайных паролей лучше (обеспечивает наибольшую степень энтропии). На мой взгляд, лучшее – то, принцип работы которого прост и понятен, а цели ломать копья не стоит.

На моём рабочем столе всегда достойное место занимает 6 строчек Powershell-скрипта:

$pw=-Join("abcdefghijklmnopqrstuvwxyz".ToCharArray()|Get-Random -c 6)`
  + -Join("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()|Get-Random -c 6)`
  + -Join("1234567890".ToCharArray()|Get-Random -c 6)`
  + -Join("-_@#".ToCharArray()|Get-Random -c 1)
$pw=($pw -split '' | Sort-Object {Get-Random}) -join ''

При желании всегда можно изменить сложность, удалить внешне схожие символы (цифра 0 и буква O; заглавная I и прописная l).

Склонение числительных на Powershell

Много лет назад, когда проект Teampass назывался cpassman, в нём был косяк с локализацией интерфейса. Если в Web UI было несколько папок, то в английской версии было написано: “34 Folders”, а в русской – “34 Папкаs”. Это было очень смешно.

Действительно, в английском всё просто: есть единственное и множественное число. И всё. В русском, не будь он могуч, ситуация несколько сложнее:

  • 21 папка;
  • 44 папки;
  • 17 папок.

Окончания пляшут, как им вздумается. К счастью, изобретать велосипед не нужно. Логика формирования окончания описана и доступна для всех языков: http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html

Вооружившись Powershell, перекладываем логику на бумагу:

Function Get-PluralForm() {Param([int]$num,[string]$pf1,[string]$pf2,[string]$pf3)
    switch($num) {
        {$num%10 -eq 1 -and $num%100 -ne 11} {"$num $pf1"}
        {$num%10 -ge 2 -and $num%10 -le 4 -and ($num%100 -le 10 -or $num%100 -ge 20)} {"$num $pf2"}
        Default {"$num $pf3"}
    }
}

И получаем результат:

PS C:\> Get-PluralForm 22 день дня дней
22 дня

Сниппет прекрасно ложится на любой код. А главное, экономит нервные клетки перфекционистов. Если вы понимаете, о чём я 😉