Pull to refresh

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' ")

Согласен. Плюс к тому DataTable имеет развитый функционал фильтрации и сортировки данных. Ну и напрямую может быть использован как DataSource для DataGridView

Похоже на его же хэштаблицы :)

Медлительность "+=" при работе с массивами обещали побороть в Posh 7, но что-то её задалось видимо.

MS в документации пишет, что в PowerShell 7.5 они все-таки оптимизировали добавление массива и "+=" больше не создает новый массив для каждой операции.

$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

Sign up to leave a comment.

Articles