Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] День недели по-русски (http://forum.oszone.net/showthread.php?t=343910)

DJ Mogarych 02-02-2020 13:16 2907994

День недели по-русски
 
Привет!
Подскажите, пожалуйста - как мне заставить павершелл возвращать день недели на русском?
Сейчас вот так:
Код:

PS C:\temp> (get-date).DayOfWeek
Sunday

Это при том, что Windows русский, все региональные параметры настроены на русский, часовой пояс, местоположение, настройка для программ, не понимающих юникода - всё русское.

В чём дело?

Windows 10 1909 x64 pro.

YuS_2 02-02-2020 13:48 2907999

Цитата:

Цитата DJ Mogarych
как мне заставить павершелл возвращать день недели на русском? »

Код:

get-date -f dddd
Цитата:

Цитата DJ Mogarych
В чём дело? »

Это дотнет перечисление...

DJ Mogarych 02-02-2020 14:10 2908002

Вот жеж, а!
Сколько граблей поразложено везде!

Спасибо!

YuS_2 02-02-2020 14:59 2908008

Цитата:

Цитата DJ Mogarych
Сколько граблей поразложено везде! »

Угу, голова должна крутиться на 360 градусов, чтобы по лбу не получить... такие индусы. :)

Кстати, если требуется именно точечная нотация, то в цитате метод описан:
Код:

(get-date).tostring('dddd')

DJ Mogarych 03-02-2020 09:27 2908069

Хотел ещё спросить.

Есть некий CSV, я его импортирую, и в выборе полей (select) есть такое:
Код:

@{n='Время доступа';e={$_.TimeAccessed -as [datetime]}},
@{n='День недели';e={($_.TimeAccessed -as [datetime]).ToString('dddd')}},

Можно ли как-то сделать так, чтобы два раза не преобразовывать строку в datetime?
Типа -outvariable, чтобы вызвать его во второй строке, но у меня не получилось его как-то сюда воткнуть.

Busla 03-02-2020 11:20 2908079

DJ Mogarych, можете вторым select вычислять второе свойство :-)

либо через внешнюю переменную:
Код:

$externalVar = @{}
[PSCustomObject]@{TimeAccessed='2020-02-03 14:58:03'},[PSCustomObject]@{TimeAccessed='2020-02-01 14:58:03'} | Select-Object @{n='Время доступа';e={ ($externalVar['dateTimeAccessed'] = $_.TimeAccessed -as [datetime])}},@{n='День недели';e={$externalVar['dateTimeAccessed'].ToString('dddd')}}


DJ Mogarych 03-02-2020 15:52 2908110

Спасибо!

В итоге придумал третий способ. Так как в том селекте ещё вместо логина подставлялось ФИО, то, чтобы не искать в выгрузке из AD ФИО для каждой строки, вынес всё в отдельную конструкцию после импорта CSV:

Код:

foreach ($user in ($src.'ФИО' |sort -Unique)) {
$fio = (get-aduser $user -Properties displayname -ErrorVariable fioNotFound).displayname
($src.where{$_.'ФИО' -eq $user}).foreach({
    if (!($fioNotFound)) {$_.'ФИО' = $fio}
    $_.'День недели' = ($_.'Время доступа').tostring('dddd')
    })
}


YuS_2 03-02-2020 16:22 2908113

Цитата:

Цитата DJ Mogarych
Можно ли как-то сделать так, чтобы два раза не преобразовывать строку в datetime? »

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

Цитата:

Цитата DJ Mogarych
В итоге придумал третий способ. »

Ну, через цикл можно и в конвейере было добавить свойство...
Код:

...|select @{n='Время доступа';e={$_.timeaccessed -as [datetime]}}|
%{
    $_|
    add-member -membert noteproperty -name {День недели} -value ($_.'Время доступа').tostring('dddd') -force -pass
}


DJ Mogarych 03-02-2020 17:35 2908127

Вариант!

Charg 04-02-2020 15:37 2908212

Когда-то давно стояла похожая задача (нужны были месяцы в родительном падеже да ещё и на украинском). Очень долго сидел над этой проблемой и таки нашел красивый, читабельный и скорее всего наиболее правильный способ.
Выдрал из исходников, актуализировал под эту задачу, пользуйтесь :)

Код:

$now = Get-Date
$now.DayOfWeek # Tuesday

$cultureRU = [cultureinfo]::CreateSpecificCulture("ru-RU")
$cultureRU.DateTimeFormat.GetDayName($now.DayOfWeek) # Вторник

$cultureJA = [cultureinfo]::CreateSpecificCulture("ja-JA") # japanese
$cultureJA.DateTimeFormat.GetDayName($now.DayOfWeek) # 火曜日


greg zakharov 04-02-2020 17:43 2908229

Цитата:

Цитата Charg
Очень долго сидел над этой проблемой и таки нашел красивый, читабельный и скорее всего наиболее правильный способ.

Наиболее правильный способ был показан YuS_2. Почему? Командлет Get-Date спроектирован относительно пространства имен System.Globalization, так что ваш код избыточен вдвойне, если учесть наличие командлета Get-Culture:
Код:

(Get-Culture ru-RU).DateTimeFormat.GetDayName((Get-Date).DayOfWeek) # вторник
(Get-Culture ja-JP).DateTimeFormat.GetDayName((Get-Date).DayOfWeek) # 火曜日
(Get-Culture uk-UA).DateTimeFormat.GetDayName((Get-Date).DayOfWeek) # вiвторок


Charg 04-02-2020 19:19 2908238

greg zakharov, я честно говоря не улавливаю причинно-следственных связей.
Про командлет Get-Culture не знал, а в остальном приведенный код идентичен моему, за исключением количества вызовов Get-Date.

YuS_2 04-02-2020 19:56 2908241

Цитата:

Цитата Charg
Про командлет Get-Culture не знал, а в остальном приведенный код идентичен моему, за исключением количества вызовов Get-Date. »

Не совсем идентичный, хоть и построен одинаково. У Вас текущая дата сохраняется в переменной и становится константой. В большинстве случаев это не проблема (ибо получаем всего навсего, день недели), но в пограничных случаях перехода даты, может получится не запланированное смещение... (повторюсь, чаще всего, это мелкая и не критичная проблема, в том числе и по потреблению памяти).
Кстати, Ваш способ хорош ещё и тем, что можем получать название не только на языке системы, но и на том, который запросили. А правильно/неправильно - категории относительные, имхо.

Charg 04-02-2020 20:11 2908243

Цитата:

Цитата YuS_2
Не совсем идентичный, хоть и построен одинаково. У Вас текущая дата сохраняется в переменной и становится константой. В большинстве случаев это не проблема (ибо получаем всего навсего, день недели), но в пограничных случаях перехода даты, может получится не запланированное смещение... (повторюсь, чаще всего, это мелкая и не критичная проблема, в том числе и по потреблению памяти). »

А, ну это вопрос скорее архитектурный. Где-то нужно брать отправную точку и считать\преобразовывая относительно, а где-то нужно иметь данные "на сейчас". Тут правильно\неправильно не бывает, задачи то разные.
Ну и да, я изначально думал что задача именно "получить день недели на любом языке".
А на то что DayOfWeek не локализован я вообще не знал, у меня ОС английская и для меня было логично что и дни недели на английском :D


Время: 23:29.

Время: 23:29.
© OSzone.net 2001-