Помощь с инструкцией If

#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 за вашу помощь в решении проблемы.