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