2009-06-19 5 views

ответ

8

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

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

В один один оператор:

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

Несколько замечаний по поводу такого подхода:

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

    PS> 1,2 -eq 1
    PS> 1

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

+0

отлично, это должен быть правильный ответ, но мне нужно было это быстро ... Я новичок powerhell; не знал для псевдонима даты :) – m1k4

+2

Я буду звучать как задница, но вы можете изменить принятый ответ в любое время на SO. Вы можете также подождать, так как, возможно, кто-то еще придумает еще более компактный onliner. Некоторые разработчики из Microsoft Powershell Team тоже находятся на SO ... – guillermooo

+0

Вы правы, это правильный ответ, поэтому заголовок вопроса – m1k4

11

Ну, мой телефон позволяет мне установить, какие дни являются рабочими днями, но 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 
+0

я люблю эти конвейерных версии, первые две версии имеют два заявления, спасибо много – m1k4

+2

Ну, не знаю, что более чем одно заявление было запрещено. – Joey

3

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

(@(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

Ну, это очевидно. Если текущий день - пятница, вы получаете только один результат назад (следующий понедельник), который будет возвращен как один объект, а не как массив, поэтому вы не можете индексировать его с помощью [0]. Когда вы используете 1..4 (вы можете отбросить @() вокруг этого, кстати), вы получаете две даты, то есть массив, в котором вы можете выбрать первый. Другим вариантом было бы поставить @() вокруг полного оператора (см. Мой ответ), чтобы заставить массив (даже с одним элементом), где вы снова можете использовать [0]. – Joey

0

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

$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)) 
Смежные вопросы