Какой самый простой способ разбить массив в зависимости от дня недели? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть массив пользователей, часть которых я хотел бы обрабатывать в сценарии powershell каждый день недели.

Чтобы получить первую 1/7 массива, я мог бы использовать это:

Foreach ($user in $Users[0..($users.count/7)])

Эту часть я бы хотел обработать по понедельникам. Существует ли простой способ кодирования этого кода, чтобы первая седьмая была обработана, если скрипт выполняется в понедельник, вторая седьмая - если он выполняется во вторник и т. Д.?

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Я бы выбрал другую стратегию, начиная с [int](Get-Date).DayOfWeek (или с того же номера (Get-Date).DayOfWeek.value__). Например, сегодня (2019-10-31) вы обрабатываете каждого 4th, 11th, 18th,… пользователя (конечно, с нуля):

(Get-Date).DayOfWeek          # Thursday
[int](Get-Date).DayOfWeek     # 4
for ($i =[int](Get-Date).DayOfWeek; $i -lt $users.Count; $i+=7) {
    # process user $users[$i]
}

В следующем фрагменте кода показанпример: определяет фиктивный массив пользователей и перечисляет их обработку каждый день недели (0..6):

$users=65..(65+23) | ForEach-Object { 
    ([string][char]$_) +([string][char]$_).ToLower()
}
0..6 | ForEach-Object {
    '{0,10}: {1}' -f (
        [System.Enum]::GetNames('System.DayOfWeek')[$_]), 
        ( $(for ($i =$_; $i -lt $users.Count; $i+=7) {$users[$i]}) -join ', ' )
}

Результат:

D:\PShell\SO\58640469.ps1
    Sunday: Aa, Hh, Oo, Vv
    Monday: Bb, Ii, Pp, Ww
   Tuesday: Cc, Jj, Qq, Xx
 Wednesday: Dd, Kk, Rr
  Thursday: Ee, Ll, Ss
    Friday: Ff, Mm, Tt
  Saturday: Gg, Nn, Uu
0 голосов
/ 31 октября 2019

Так как .Net имеет приятное перечисление для дней недели , давайте использовать его с индексом по модулю.

Предполагая, что вам не важно, какие элементы обрабатываются, пока около 1/ 7-й элемент обрабатывается, мы можем обработать для каждой n-й ячейки. N-е выбирается по модулю дня недели. Например, давайте обработаем ячейки, которые являются записями четверга. Поскольку в четверг значение enum равно 4, по модулю индекса и четверга мы выберем каждый четвертый элемент. Вот так

function do_stuff {
  param([DayOfWeek]$dd, $item)
  $daytoday=(get-date).DayOfWeek
  if($dd -ne $daytoday) { "$dd is not $daytoday, not processing!"} 
  else { write-host "doing $dd stuff for $item" }
}
# Sample array that's long enough
$array= @(1..31)

for([int]$i = 0; $i -lt $array.Length; ++$i){
  # When $i>6, modulo is needed to convert the index into weekday
  do_stuff $($i%6)  $array[$i]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...