Comments 20
У меня тоже есть похожая статья. Кстати, вы знали что русская строка на PowerShell зависит от того, является ли .ps1 файл сохранённых UTF8 или 16?
И ещё неумение печатать объекты, пресловутый object, сравнить хотя бы питоном
Да, спасибо, вы правы! И даже скажу более - для корректной работы скрипта MS рекомендует использовать UTF8 именно с BOM, или UTF16. Если скрипт сохранен как UTF8 без BOM, однозначно будут проблемы с русским языком и спецсимволами.
винда разрулит, а вот линукс...
Нет, я это ловил под виндой
К сожалению, не разрулит. Без BOM и под виндой будут проблемы с русской кодировкой
Нужен конкретный пример. В целом UTF-8 корректно читается в винде и с ВОМ, и без него.
А вот в Линуксе, если скрипт лежит в ВОМ-файле, то вызвать другой скрипт или прочесть файл без ВОМа - даст плохие последствия. Скрипт не распознается вообще, а файл (если не открывался с точным указанием к прочтению) прочтётся некорректно. И наоборот, если в не-ВОМ скрипте работаешь с ВОМ-файлами, будет тот же эффект.
В целом я с вами полностью согласен.
Под виндой я, например, сталкивался с проблемой, что в кодировке UTF8 без BOM подпись WinForm кнопки, в которой использовались юникод символы, отображается не корректно.
Ещё один почему-то неожиданно редко используемый приём связан с работой с большими списками. Сплошь рядом встречается работа с ними либо как с массивами, либо как с внешней базой данной. Хотя есть очень шустрая и достаточно функциональная реализация прямо в PowerShell:
New-Object System.Data.Datatable
# Создание
$UserTableDB = New-Object System.Data.Datatable
# Описание столбцов
[void]$UserTableDB.Columns.Add("id")
[void]$UserTableDB.Columns.Add("name")
[void]$UserTableDB.Columns.Add("guestType")
[void]$UserTableDB.Columns.Add("status")
[void]$UserTableDB.Columns.Add("sponsorUserName")
[void]$UserTableDB.Columns.Add("sponsorUserId")
[void]$UserTableDB.Columns.Add("userName")
[void]$UserTableDB.Columns.Add("firstName")
[void]$UserTableDB.Columns.Add("lastName")
[void]$UserTableDB.Columns.Add("emailAddress")
[void]$UserTableDB.Columns.Add("password")
[void]$UserTableDB.Columns.Add("creationTime")
[void]$UserTableDB.Columns.Add("enabled")
[void]$UserTableDB.Columns.Add("notificationLanguage")
[void]$UserTableDB.Columns.Add("validDays")
[void]$UserTableDB.Columns.Add("fromDate")
[void]$UserTableDB.Columns.Add("toDate")
[void]$UserTableDB.Columns.Add("location")
[void]$UserTableDB.Columns.Add("href")
# Пример заполнения из массива
foreach ( $UserTableRaw in $UserTable ) {
[void]$UserTableDB.Rows.Add($UserTableRaw.id , $UserTableRaw.name, $UserTableRaw.guestType, $UserTableRaw.status, $UserTableRaw.sponsorUserName, $UserTableRaw.sponsorUserId, $UserTableRaw.userName, $UserTableRaw.firstName, $UserTableRaw.lastName, $UserTableRaw.emailAddress, $UserTableRaw.password, $UserTableRaw.creationTime, $UserTableRaw.enabled, $UserTableRaw.notificationLanguage, $UserTableRaw.validDays, $UserTableRaw.fromDate, $UserTableRaw.toDate, $UserTableRaw.location, $UserTableRaw.href)
}
# поиск
$SearchResult = $UserTableDB.Select("Name = 'username@domain.com' and GuestType = 'Guest2' ")Медлительность "+=" при работе с массивами обещали побороть в Posh 7, но что-то её задалось видимо.
$array = @("A", "B", "C")
return, $array
Вот тут, как программист, я ожидал бы создание массива массивов с одним элементом.
А вообще, я почти 5 лет плотно работал с PowerShell и почти всегда матерился. Ну не понимаю я логики этого языка, и раздражение синтаксисом я так и не поборол, хотя часто удивляло, насколько легко на нем писать всякие системные штуки.
И кстати, не знаю, есть ли IDE, которая показывает, какой объект возвращает та или иная команда и какие у него методы и прочее. Приходилось часами копаться в документации MS или руками исследовать каждый объект, что доставало изрядно.
Как-то не очень вы работали 5 лет. Get-Member есть как минимум.
$array = @("A", "B", "C")
return, $arrayВот тут, как программист, я ожидал бы создание массива массивов с одним элементом.
А вообще, я почти 5 лет плотно работал с PowerShell и почти всегда матерился. Ну не понимаю я логики этого языка, и раздражение синтаксисом я так и не поборол, хотя часто удивляло, насколько легко на нем писать всякие системные штуки.
Прекрасно понимаю вас, сам регулярно сталкиваюсь с этим чувством.
Удобство работы с конвейером в PowerShell имеет обратную сторону - кажущуюся нелогичность поведения PowerShell. Вы, кстати, затронули интересный момент.
Вот такой код, как и указано в статье, вернет массив из 3-х элементов:
$array = @("A", "B", "C")
return , $arrayА теперь заменим return на присвоение:
$array = @("A", "B", "C")
$newArray = , $arrayИ вот теперь в $newArray будет массив массивов, как вы и говорили.
Почему? А потому, что return это просто вывод в конвейер. А когда PowerShell выводит массивы в конвейер, он каждый элемент элемент массива выводит отдельно, то есть просто разворачивает массив. А вот при при присвоении разворачивания массива нет.
Как по мне, такое поведение может показаться нелогичным и приводить к багам. Но так уж устроен PowerShell.
кстати, если надо массив с добавлением элементов стоит напомнить про arraylist,(может кто забыл :) ) в остальных видах работ он похоже как обычный массив powershell
Ловушки PowerShell: поведение, которое ломает привычные ожидания разработчиков