2015-08-19 2 views
3

У меня возникла проблема со сценарием, который я пишу для своего сына. Мое намерение - это простое напоминание, чтобы он помнил свои дела. Недавно я начал делать PowerShell, и мне это очень нравится. Я купил пару книг и прошел через множество других сообщений.Если/ElseIf блок не работает с -или

То, что я получил до сих пор ниже, кажется, если оценки правильно не работает с -or (или, может быть, я goofed?)

## REMINDERS TO DO CHORES ## 

$sun = "Sunday" 
$mon = "Monday" 
$tue = "Tuesday" 
$wed = "Wednesday" 
$thu = "Thursday" 
$fri = "Friday" 
$sat = "Saturday" 

$today = (get-date).DayOfWeek 

$choreVac = "Vacuum the rooms and stairs" 
$choreBath = "Clean the Bathroom Including emptying the garbage" 
$choreOther = "No Chores Today -- But keep dishes done up" 


if($today -eq $mon -or $wed -or $fri) { 
msg /time:2500 * "Today is a Chore Day: your job is to $choreVac" 
} 

elseif ($today -eq $tue -or $sat) { 
msg /time:2500 * "Today is a Chore Day: your job is to $choreBath and PLEASE do a good job" 
} 
else { 
msg /time:2500 * $choreOther 
} 

Проблема заключается в том, я не думаю, что это оценивается правильно на день, так что на сегодняшний день во вторник, оцененный результат: $mon -or $wed -or $fri

Если я перекодирую это для каждого дня следующим образом, он работает, как и ожидалось. Почему он не работает с -or?

if($today -eq $tue) { 
msg /time:2500 * $choreBath 
} 
+0

Ahh Я просто понял это. Я должен полностью квалифицировать его, если ($ today -eq $ mon -or $ today -eq $ wed -or $ today -eq $ fri) {он работает – PCPaul

+0

Не стесняйтесь публиковать ответ на свой вопрос с подробным описанием найденного решения. – Guvante

+0

Вы не должны указывать ответ в вопросе выше :) Я удалил эту часть. –

ответ

5

Как вы обнаружили себя PowerShell не оценивала ваш, если заявление , как вы хотели, чтобы это было. Ваше выражение может быть лучше понято так:

if(($today -eq $mon) -or ($wed) -or ($fri)) 

Так же, как в свой комментарий код, который вы хотели,

$today -eq $mon -or $today -eq $wed -or $today -eq $fri 

или другой способ смотреть на него.

($today -eq $mon) -or ($today -eq $wed) -or ($today -eq $fri) 

PowerShell не нуждается в скобках, но хорошо использовать их, если что-то не пойдет вам на пути.

Когда строки с нулевой/нулевой длиной в PowerShell равны true при использовании в качестве булевых. Сосредоточение на втором пункте его можно переписать в виде

"Wednesday" -or "Friday" 

Который является всегдаtrue. Вот почему ваше заявление if стреляло, когда вы этого не ожидали.

То, что вы кодировали, имело логический смысл, но оно было синтаксически неправильным. Другой подход, который я хотел бы представить вам, если вы еще не знакомы с ним, - это switch. Это помогло бы уменьшить беспорядок всех заявлений if и было бы особенно полезно, если бы они стали более сложными, поскольку хлопоты эволюционировали с течением времени.

$today = (get-date).DayOfWeek 

$choreVac = "Vacuum The Apt" 
$choreBath = "Clean the Bathroom Including empting the garbage" 
$choreOther = "NO CHORES TODAY -- BUT YOU CAN Keep dishes done up, and Keep Garbage from Overflowing AND CLEAN YOUR ROOM and OR Do Laundry!!!. Especially your bedding" 

Switch ($today){ 
    {$_ -in 1,3,5}{$message = "Today is a Chore Day: Your job is to`r$choreVac"} 
    {$_ -in 2,6}{$message = "Today is a Chore Day: Your job is to`r$choreBath and PLEASE do a good job"} 
    default{$message = $choreOther} 
} 

msg /time:2500 * $message 

Мы удалили все вызовы msg в одно заявление, так как только $message изменения. Если рабочий день не включен в предложение в коммутаторе, то по умолчанию это просто $choreOther.

Также дни недели могут быть представлены как целые числа, как вы видите выше. Это может привести к снижению читаемости кода, но я думаю, что это растяжение.

+0

@Matt Спасибо, переключатель отличный. Это больше похоже на оператор case, как я использовал в PL/SQL, или что я видел на других языках, таких как C/C++, что тоже было весело. +1 – PCPaul

1

Вот полный код, исправленный и работающий, как я этого хотел.

## REMINDERS TO DO CHORES ## 

$sun = "Sunday" 
$mon = "Monday" 
$tue = "Tuesday" 
$wed = "Wednesday" 
$thu = "Thursday" 
$fri = "Friday" 
$sat = "Saturday" 

$today = (get-date).DayOfWeek 

$choreVac = "Vacuum The Apt" 
$choreBath = "Clean the Bathroom Including empting the garbage" 
$choreOther = "NO CHORES TODAY -- BUT YOU CAN Keep dishes done up, and Keep Garbage from Overflowing AND CLEAN YOUR ROOM and OR Do Laundry!!!. Especially your bedding" 

if($today -in ($mon, $wed ,$fri)) { 
msg /time:2500 * "Today is a Chore Day: your job is to $choreVac" 
} 

elseif ($today -in ($tue,$sat)) { 
msg /time:2500 * "Today is a Chore Day: your job is to $choreBath and PLEASE do a good job" 
} 
else { 
msg /time:2500 * $choreOther 
} 
+1

Вы можете записать его более компактно с оператором -in: 'if ($ today -in ($ mon, $ wed, $ fri)) {}' –

+1

@ dan-gph +10 Мне нравится это еще лучше! много чище. Приветствия. – PCPaul

1

Вы также можете использовать Hashtables для обработки списков обязанностей и связанных дней.Ниже позволит вам легко добавить работу по дому в любой день (или даже поставить несколько хлопот на один день)

$chores = @{Vac = "Vacuum the Appt"; 
      Bath = 'Clean the bathroom including emptying the garbage'; 
      Other = 'Nothing today -- But keep dishes done up' 
      } 

$day = @{Sunday = $chores.Other; 
     Monday = $chores.Vac; 
     Tuesday = $chores.Bath; 
     Wednesday = @($chores.Vac,$chores.Other); 
     Thursday = $chores.Other; 
     Friday = $chores.Vac; 
     Saturday = $chores.Bath; 
     } 

$base = "Chores for today: " 
$today = (Get-Date).DayOfWeek 
if ($day."$today".count -gt 1) { 
    $first = "`n " + $day."$today"[0] 
    $rest = for ($i = 1; $i -lt $day."$today".count; $i++) { 
     "`n " + $day."$today"[$i] 
    } 

    $msg = $base + $first + $rest 
} else { 
    $msg = $base + "`n " + $day."$today" 
} 

msg /time:2500 * $msg 

Если вы не хотите, чтобы поддерживать наличие нескольких хлопот в день (что в приведенном выше применяется в среду), просто замените весь блок If/Else на пункт else, и он просто перечислит хлопоты дня.

Смежные вопросы