#powershell
#powershell
Вопрос:
Приведенная ниже инструкция If продолжает сообщать, что у меня отсутствует блок инструкции после if. Может ли кто-нибудь указать мне правильное направление при сортировке инструкции IF?
If ($ts = (Get-Date) - (Get-CimInstance -ClassName Win32_OperatingSystem).LastBootUpTime)
Я знаю, что это оператор IF, но не могу понять, почему? Ниже приведен полный КОД…
#subtract the LastBootUpTime date from the current date and time to get a TimeSpan object
If ($ts = (Get-Date) - (Get-CimInstance -ClassName Win32_OperatingSystem).LastBootUpTime) -ErrorAction SilentlyContinue
#write-Host "Exit Error Message"
{
Exit 1001
} else {
#now format it into a human readable string to go in the report
$UpTime = '{0} days {1} hours {2} minutes {3} seconds' -f $ts.Days, $ts.Hours, $ts.Minutes,
$ts.Seconds
write-host "The Up-Time is:" $UpTime
#write-host "Exit Success Message"
Exit 0
}
Комментарии:
1. Попробуйте удалить закомментированный оператор между if и открытием
{
. Или переместите его в оператор block.2. В вашем первом фрагменте кода вам не хватает закрытия
)
. В следующем фрагменте кода вы добавили-ErrorAction
, но он не принадлежит ни одной команде, потому что вы вложили все свои команды()
и не включили параметр3. Вам нужно использовать оператор сравнения (например
-eq
), а не оператор присваивания (=
)4. @AdminOfThings, если я использую ($ts = (Get-Date) — (Get-CimInstance -className Win32_OperatingSystem). LastBootUpTime -ErrorAction SilentlyContinue) выдает сообщение об ошибке в -ErrorAction SilentlyContinue
5. Потому
-ErrorAction SilentlyContinue
что это должно быть в команде Cim, а не после свойства, обозначенного точкой.($ts = (Get-Date) - (Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue).LastBootUpTime)
Ответ №1:
Во-первых, ваша логика ошибочна. То, что вы пытаетесь сделать, называется сжатием переменных, что означает, что если $ts заполняется, сделайте что-нибудь; иначе сделайте что-нибудь другое. Итак, если ваша команда завершается успешно и заполняет $ts, вы пытаетесь завершить работу с кодом 1001, что кажется противоположным тому, что вы хотите.
Затем вам нужно завершить блок скобок if ( )
и переместить параметр erroraction в правильное место в команде. До тех пор, пока вы лучше не разберетесь в том, как структурировать оператор, возможно, будет намного проще разделить операторы.
#subtract the LastBootUpTime date from the current date and time to get a TimeSpan object
$ts = (Get-Date) - (Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue).LastBootUpTime
If ($ts)
{
#now format it into a human readable string to go in the report
$UpTime = '{0} days {1} hours {2} minutes {3} seconds' -f $ts.Days, $ts.Hours, $ts.Minutes, $ts.Seconds
write-host "The Up-Time is:" $UpTime
#write-host "Exit Success Message"
exit 0
}
else
{
#write-Host "Exit Error Message"
exit 1001
}
или сломанный еще больше, как это
#subtract the LastBootUpTime date from the current date and time to get a TimeSpan object
$lastboot = (Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue).LastBootUpTime
$ts = (Get-Date) - $lastboot
If ($ts)
{
#now format it into a human readable string to go in the report
$UpTime = '{0} days {1} hours {2} minutes {3} seconds' -f $ts.Days, $ts.Hours, $ts.Minutes, $ts.Seconds
write-host "The Up-Time is:" $UpTime
#write-host "Exit Success Message"
exit 0
}
else
{
#write-Host "Exit Error Message"
exit 1001
}
Комментарии:
1. Спасибо @DougMaurer за вашу помощь в решении проблемы.