Powershell Golf: следующий рабочий день - PullRequest
3 голосов
/ 19 июня 2009

Как найти следующий рабочий день с powershell?

Ответы [ 4 ]

11 голосов
/ 19 июня 2009

Что ж, мой телефон позволяет мне устанавливать, какие дни являются рабочими днями, но Windows / .NET не будет, поэтому я предполагаю, что с понедельника по пятницу.

Примечание: так как вопрос включает в себя «гольф», я играю в гольф, который пытается использовать как можно меньше байтов для сценария. В результате код не обязательно читается.

Самый простой и простой способ сделать это - начать с сегодняшнего дня, добавить день и посмотреть, находится ли он в требуемом диапазоне:

PS> $d = [DateTime]::Now.AddDays(1); while ($d.DayOfWeek -eq "Saturday" -or $d.DayOfWeek -eq "Sunday") { $d = $d.AddDays(1) }; $d
Montag, 22. Juni 2009 19:50:27

Мы можем сократить это немного, хотя:

PS> $d=(Get-Date)+"1";for(;6,0-contains$d.DayOfWeek){$d+="1"}$d
Montag, 22. Juni 2009 19:52:31

Но мы также можем попробовать это по-другому, используя конвейер. Следующий рабочий день, по крайней мере, один и максимум три дня, поэтому мы можем сгенерировать список возможных дат и отфильтровать их соответствующим образом и, наконец, выбрать первый:

PS> @(1..3|%{(Get-Date).AddDays($_)}|?{$_.DayOfWeek -ge "Monday" -and $_.DayOfWeek -le "Friday"})[0]
Montag, 22. Juni 2009 22:11:19

или короче:

PS> @(1..3|%{(Get-Date)+"$_"}|?{1..5-contains$_.DayOfWeek})[0]
Montag, 22. Juni 2009 19:55:53

Допуская диапазон, равный 4, мы можем гарантировать, что он всегда будет возвращать не менее двух рабочих дней, и сохранить оператор @ для принудительной установки массива:

PS> (1..4|%{(Get-Date)+"$_"}|?{1..5-contains$_.DayOfWeek})[0]
Montag, 22. Juni 2009 20:24:06
9 голосов
/ 21 июня 2009

Это тоже довольно короткий (но использует псевдонимы):

,(1,2-eq7-(date).dayofweek)|%{(date)+"$(1+$_[0])"}

В одном утверждении:

(date)+"$(1+$(@(1,2-eq7-(date).dayofweek)))"

Несколько замечаний об этом подходе:

  • В Powershell (по крайней мере, v1) сравнения с коллекциями возвращают элементы, в которых выполняется условие, например:

    PS> 1,2 -eq 1
    PS> 1

  • Я пользуюсь тем, что фактические исключения из правила today + 1 для расчета следующего рабочего дня - это только пятница (+3 дня) и суббота (+2 дня).

3 голосов
/ 19 июня 2009

Вот еще один способ:

(@(1..4) | foreach { if (([datetime]::Now.AddDays($_)).DayOfWeek -ne "Sunday" -and ([datetime]::Now.AddDays($_)).DayOfWeek -ne "Saturday") {[datetime]::Now.AddDays($_); }})[0]

Не уверен, почему я должен использовать (1..4) вместо (1..3).

0 голосов
/ 24 апреля 2013

Мне показалось, что пример кода в первом ответе действительно сложен, поэтому я переписал его, чтобы было легче увидеть, что происходит. Я по-прежнему использую поведение -eq, где тест -eq возвращает соответствующее значение.

$date = get-date "2013 Apr 24"

write-host "Based on your date"
$date

write-host "next business day (skipping saturday and sunday)"
$Date.AddDays(1 + $(1,2 -eq 7 - [int]$date.dayofweek) )

write-host "Next week monday"
$Date.AddDays(1 + $(0,1,2,3,4,5,6,7 -eq 7 - [int]$date.dayofweek) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...