Разное

If else powershell: о программе — PowerShell | Microsoft Docs

29.05.1972

Содержание

о программе — PowerShell | Microsoft Docs

  • Чтение занимает 2 мин

В этой статье

КРАТКОЕ ОПИСАНИЕ

Описывает команду языка, которую можно использовать для выполнения списков инструкций на основе результатов одного или нескольких условных тестов.

ПОДРОБНОЕ ОПИСАНИЕ

Можно использовать If инструкцию для выполнения блоков кода, если заданная условная проверка имеет значение true. Можно также указать один или несколько дополнительных условных тестов для выполнения, если все предыдущие тесты имеют значение false. Наконец, можно указать дополнительный блок кода, который будет выполняться, если ни одна из предыдущих условных тестов не возвращает значение true.

Синтаксис

В следующем примере показан If синтаксис инструкции:

if (<test1>)
    {<statement list 1>}
[elseif (<test2>)
    {<statement list 2>}]
[else
    {<statement list 3>}]

При выполнении If инструкции PowerShell вычисляет <test1> условное выражение как true или false. Если <test1> имеет значение true, <statement list 1> выполняется, а PowerShell завершает выполнение If инструкции. Если <test1> значение равно false, то PowerShell оценивает условие, заданное <test2> условным оператором.

Дополнительные сведения о логическом вычислении см. в разделе about_Booleans.

Если <test2> имеет значение true, <statement list 2> выполняется, а PowerShell завершает выполнение

If инструкции. Если оба <test1> <test2> аргумента и имеют значение false, <statement list 3> блок кода выполняется, а PowerShell завершает инструкцию if.

Можно использовать несколько Elseif инструкций для сцепления последовательности условных тестов. Таким образом, каждый тест выполняется только в том случае, если все предыдущие тесты имеют значение false. Если необходимо создать If инструкцию, содержащую множество Elseif инструкций, вместо нее рекомендуется использовать оператор switch.

Примеры:

Простейшая If инструкция содержит одну команду и не содержит ни операторов ElseIf, ни инструкций else. В следующем примере показана простейшая форма If оператора:

if ($a -gt 2) {
    Write-Host "The value $a is greater than 2."
}

В этом примере, если переменная $a больше 2, условие принимает значение true и выполняется список инструкций. Однако если $a меньше или равно 2 или не является существующей переменной, If инструкция не отображает сообщение.

При добавлении инструкции else отображается сообщение, если $a меньше или равно 2. Как показано в следующем примере:

if ($a -gt 2) {
    Write-Host "The value $a is greater than 2."
}
else {
    Write-Host ("The value $a is less than or equal to 2," +
        " is not created or is not initialized.")
}

Для дальнейшего уточнения этого примера можно использовать Оператор ElseIf для вывода сообщения, если значение $a равно 2. Как показано в следующем примере:

if ($a -gt 2) {
    Write-Host "The value $a is greater than 2."
}
elseif ($a -eq 2) {
    Write-Host "The value $a is equal to 2."
}
else {
    Write-Host ("The value $a is less than 2 or" +
        " was not created or initialized.")
}

Использование синтаксиса оператора ternary

В PowerShell 7,0 появился новый синтаксис с помощью оператора ternary. Он соответствует синтаксису оператора C# ternary:

<condition> ? <if-true> : <if-false>

Оператор ternary ведет себя так же, как и упрощенная if-else инструкция. <condition>Выражение вычисляется, и результат преобразуется в логическое значение, чтобы определить, какую ветвь следует вычислить следующим образом:

  • Выражение <if-true> выполняется, если выражение <condition> имеет значение true.
  • Выражение <if-false> выполняется, если выражение <condition> имеет значение false.

Пример:

$message = (Test-Path $path) ? "Path exists" : "Path not found"

В этом примере $message при возврате возвращается значение «Path Exists» Test-Path $true . При Test-Path возврате $false значение $message равно «путь не найден».

$service = Get-Service BITS
$service.Status -eq 'Running' ? (Stop-Service $service) : (Start-Service $service)

В этом примере, если служба запущена, она останавливается и, если ее состояние не выполняется

, запускается.

СМ. ТАКЖЕ

Работа с операторами условий IF в Powershell ELSEIF и ELSE на примерах

Логические операторы IF ElseIf и Else в Powershell относятся к основным командам условий не только в этом языке, но и в других. Благодаря таким операторам в наших скриптах добавляются условия.

Вы можете представить скрипт, где вам нужно поставить запятую в выражении «Казнить нельзя помиловать». В зависимости от того к чему это выражение применяется запятая будет стоять в разных местах и эту проблему решает условный оператор.

Самих условий может быть несколько. Каждый будет разобран дальше.

If

Этот оператор работает самый первый из блока условий и является обязательным в случае любых условий. Когда мы хотим проверить само существование значение достаточно указать переменную:


$uslovie = $true
if ($uslovie) {
   Write-Output "Условие выполнено"
}

Результат любого сравнение приравнивается к 2 булевым значениям — это True (правда, существует) и False (ложь, не существует, $None). Если вы передаете переменную в условие без каких либо дополнительных операторов, то само существование значения у переменной позволяет выполнить следующую часть и написать «Условие выполнено». Та часть, которая экранируется в фигурные скобки называется ScriptBlock.

На следующем примере, в первом случае у нас вернется True, так как значение у переменной существует. Во втором случае мы проверяем переменную, которая не хранит никаких значений (она не была объявлена), а значит соответствует $null и вернет False:


$uslovie = 1
if ($uslovie) {
   Write-Output "Условие выполнено"
}

# Переменная notexist не имеет значения, т.е. равно $null
if ($notexist) {
   Write-Output "Условие не выполнено"
}

Else

Этот оператор не является обязательным. Else используется когда результаты предыдущих проверок равен Fasle:


$uslovie = $false
if($uslovie) {
   Write-Output "Условие равно True"
}
else { 
   Write-Output "Условия равны False"
}

Обратите внимание, что я использую Powershell ISE, а не консоль.

При запуске в консоли, при таком написании, у нас будут ошибки:

  • Имя «else» не распознано как имя командлета, функции, файла сценария или выполняемой программы.
  • The term ‘else’ is not recognized as the name of a cmdlet, function, script file, or operable program.

Связано это с тем, что консоль выполняет каждою строку отдельно и оператор else воспринимается как отдельный. Для избежания таких ситуаций есть множество способов решения:

  1. Объявлять операторы в одну строку.
  2. Использовать функции.
  3. Хранить скрипт в файле и импортировать его.

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

Elseif

Представим, что нам нужно проверить существование нескольких значений. Мы можем это сделать так:

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

Elseif не является обязательным и выполняется после IF. В отличие от else, который работает в случае когда все операторы вернули False, оператор elseif может проверять на True и False. Переписав предыдущий пример, но с новым оператором, условие будет выглядеть так:


$uslovie1 = $false
$uslovie2 = $true
if ($uslovie1) {
   Write-Output "Первое условие выполнено"
}
elseif ($uslovie2) {
    Write-Output "Первое условие не выполнено"
    Write-Output "Второе условие выполнено"
}
else {
    Write-Output "Условия не выполнены"
}

В отличие от других операторов elseif может использоваться множество раз. Тот оператор, который первый вернет True, отменит выполнение следующих условий.

 

Когда нам нужно проверить не только существование значения, но и эквивалентность или упоминание, нам нужно использовать операторы сравнения.

-eq проверка эквивалентности

С помощью оператора -eq можно проверить полное соответствие между значениями. Для примера это может быть строка или число:


$num = 33
if($num -eq 33) {
   Write-Output "Число совпадает"
}

Если бы значения не совпадали, то результат был бы False и условие было бы не выполненным.  Проведем пример со всеми условиями:


$num = 33
if ($num -eq 33) {
   Write-Output "Число 33"
}
elseif ($num -eq 34) {
   Write-Output "Число 34"
}
else{
   Write-Output "Другое число"
}

Powershell, по умолчанию, не является зависимым от регистра. Это значит, что «Строка» и «строка» будут эквивалентны друг другу. Что бы проверить равенство с учетом регистра нужно использовать -ceq:


$str = 'Строка'
if ($str -ceq 'строка') {
   Write-Output 'Первая буква маленькая'
}
elseif ($str -ceq 'Строка') {
   Write-Output 'Первая буква большая'
}
else{
   Write-Output 'Другое число'
}

Самые первые примеры, которые были показаны выше, являются сокращенным вариантом написания с оператором -eq:


$str = 'строка'

if($str) {Write-Host 'Ok' }
# Одинаковые условия
if($str -eq $True ) {Write-Host 'Ok'}

Важно понять работу следующего примера:


$bo = $false

if ($bo -eq $false){'Pass'}

Так как проверка на эквивалентность $false правдива, результат работы условия будет True.

-ne или не соответствие

Когда нужно проверить отсутствие конкретного значения используется команда -ne:


if( 5 -ne $value )
{
    'Pass'
}

Как уже писалось выше, если первое условие возвращает True второе выполняться не будет:


$value = 6
if ( 5 -ne $value )
{
    'Pass Ne'
}
elseif (6 -eq $value)
{
    'Pass Eq'
}

Так же как и в предыдущем случае если оператор учета регистра -cne.

Для примера так мы запустим сервис, если он не равен Running:


$Service = 'WinRM'
if ( (Get-Service -Name $service).Status -ne 'Running' )
{
    Start-Service -Name $Service
    Write-Host "Сервис запущен"
}

-gt -ge -lt -le проверка на большее и меньшее значение

Аналогично предыдущим примерам мы можем включать проверку на большее и меньшее значение, для примера выполним такое условие:


$numeric = 5
if ( $numeric -lt 5 ){
    'Число меньше 5'
}
elseif ($numeric -ge 5){
    'Число больше 5'
}
else{
    'Число равно 5'
}

Дословно операторы выше переводятся как Less than (меньше чем) и Gt (больше чем) и именно поэтому выполняется условие else. Другие операторы, включающие букву ‘e’ вместо ‘t’ выполняют так же проверку на равенство, например ge — Greater or equal  (больше или равно). Таких операторов достаточно много:

  • gt — больше чем;
  • cgt — больше чем, но с учетом регистра;
  • ge — больше или равно;
  • cge — больше или равно с учетом регистра;
  • lt — меньше чем;
  • clt — меньше чем, но с учетом регистра;
  • le — меньше чем или равно;
  • cle — меньше чем или равно с учетом регистра.

Не совсем ясно зачем делать учет регистра в определении количества, но такая возможность тоже есть.

-like проверка вхождений

В Powershell есть возможность проверки вхождений используя -like и определенный синтаксис:

  • ? — обозначение единственного пропущенного символа;
  • * —  обозначение любого количества пропущенных символов.

$computer = 'AD-Moscow-001'
if ($computer -like 'AD*') {'Этот компьютер AD'}

Выше мы проверяли начинается ли строка с символов AD. Если бы мы искали конец строки нужно было указывать символ * до последнего элемента:


$computer = 'AD-Moscow-001'
# Это условие не пройдет, так как проверяется конец строки
if ($computer -like '*AD') {'Pass if'}
# Это условие не пройдет, так как проверяется полное соответствие
elseif ($computer -like 'AD') {'Pass elsif 1'}
# Это пройдет
elseif ($computer -like 'AD*1') {'Pass elsif 2'}

Варианты использования:

  • like — поиск вхождения, не чувствителен к регистру;
  • clike — поиск вхождения, чувствителен к регистру; 
  • notlike — проверка на отсутствие вхождения, не чувствителен к регистру;
  • cnotlike — проверка на отсутствие вхождения, чувствителен к регистру.

-match использование регулярных выражений

Для проверки с использованием регулярных выражений есть свой оператор -match. Конечно, синтаксис в использовании регулярных выражений и -like отличается:


$computer = 'AD-Moscow-001'
if ($computer -match '^AD-\w\w\w\w\w\w-001') {'Pass if'}

Если не указывать маску/шаблон, то match будет искать по полному совпадению:


$computer = 'AD-Moscow-001'
if ($computer -match 'AD-Moscow-001') {'Pass if'}

Так же есть несколько вариантов использования регулярных выражений:

  • match — регулярные выражения не чувствительные к регистру:
  • cmatch — чувствительные к регистру;
  • notmatch — поиск не совпадающих, не чувствительных к регистру значений;
  • cnotmatch — поиск не совпадающих, чувствительных к регистру значений.

-is проверка типов

Часто бывает необходимость проверить тип данных перед дальнейшем использованием. Использование сложения со строкой и числом приводит к разным последствиям. Для избежания этих проблем нужно проверять типы. На примере ниже я проверяю является ли значение числом:


$int = 1
if ($int -is [int]){'Значение число'}

Таких типов данных в Powershell около 13:

  • [string] — строка;
  • [char] — 16-битовая строка Unicode;
  • [byte] — 8 битовый символ;
  • [int] — целое 32 битовое число;
  • [long] — целое 64 битовое число;
  • [bool] — булево значение True/False;
  • [decimal] — 128 битовое число с плавающей точкой;
  • [single] — 32 битовое число с плавающей точкой;
  • [double] — 64 битовое число с плавающей точкой;
  • [DateTime] — тип данных даты и времени;
  • [xml] — объект xml;
  • [array] — массив;
  • [hashtable] — хэш таблица.

Так же можно использовать ключ -isnot, который выполняет противоположные действия.

 

Когда мы работаем с коллекциями, массивами или листами проверка вхождений работает немного иначе чем в предыдущих примерах. Тут важно учитывать не только порядок, но и логику:


@(1,3,4,5) -eq 4 
4 -eq @(1,2,3,4)

Этот пример так же будет работать с логическими операторами:


$array = @(1,2,3,4)
if (4 -eq $array){'Проверка пройдена 1'}
elseif ($array -eq 4){'Проверка пройдена 2'}

Обратите внимание, что в случае с -ne, который ищет неравенство, результат будет True если хотя бы одно число и строка не совпадает с указанной:


$array = @('string1','string4','string3','string2')
$array -ne 'string1'
if ($array -ne 'string2'){'Проверка пройдена'}

Когда используются операторы типа ge, lt и другие, результат будет True если хотя бы одно из значений будет больше:


$array = @(6,2,3,4)
$array -ge 4
if ($array -ge 4){'Passed'} 

Для поиска вхождений в массивах обычно используются операторы описанные далее.

-contains

При использовании contains у нас возвращаются булевы значения True и False и является более логичным для проверки массивов:


$massive = @('node1','node2','node3') 
$massive -contains 'node1'
if ($massive -contains 'node1'){'Passed'} 

Другие варианты использования:

  • contains — без учета регистра;
  • ccontains — с учетом регистра;
  • notcontains — отсутствие значения без учета регистра;
  • cnotcontains — отсутствие значение с учетом регистра.

-in

Этот оператор создан для удобства людей, которые пишут на других языках. Он отличается от contains порядком проверяемых значений. В этом случае массив должен находиться справа:


$massive = @('node1','node2','node3') 
$massive -in 'node1'
'node1' -in $massive
if ($massive -in 'node1'){'Passed 1'} 
elseif ('node1' -in $massive){'Passed 2'} 

Доступные варианты:

  • in — регистр не имеет значения;
  • cin — регистр имеет значение;
  • notin — отсутствие вхождения, регистр не имеет значения;
  • cnotin — отсутствие вхождения, регистр имеет значения.

Больше примеров можно увидеть в статье Работа с массивом в Powershell и листами на примерах.

 

Когда нам нужно комбинировать условия удобно использовать логические операторы.

-not

Использование этого оператора переворачивает результат. Если результат значения равен False, то используя not, выражение все равно будет выполнен:


if (-not $notexist ){'Passed 1'} 

Если вы хотите использовать предыдущие операторы тоже, тогда их нужно помещать между скобок:


$hs = @('ex1','ex2','ex3')
if (-not ('ex4' -in $hs) ){'Passed 1'} 

У -not есть алиас в виде восклицательного знака ! :


if (!('ex4' -in $hs) ){'Passed 1'}

-and

And позволяет связывать несколько значений. Условие будет выполнено только в том случае, если все значения будут True:


$cost = 13
if (($cost -gt 2) -and ($cost -lt 16)){Write-Host 'Выполнено'}

Если хотя бы одно из выражений было бы равно False, то все условие относилось бы к False:


$cost = 13
if (($cost -gt 2) -and ($cost -lt 10)){Write-Host 'Выполнено 1'}
elseif (($cost -gt 2) -and ($cost -lt 14)){Write-Host 'Выполнено 2'}

Мы так же можем проверять существование нескольких значений:


$cost = 13,14,15
if (($cost[0]) -and ($cost[1]) -and ($cost[2]) ) {'Верно'}

-or

Отличия -and от -or в том, что нам достаточно получить True только от одного выражения:


$a = 4
$b = 7
if (($a -ge 4) -or ($b -eq 2)){Write-Host 'ок'}

Вы можете комбинировать несколько операторов для верного выполнения условия, главное помещать их в кавычки:


$a = 4
$b = 7
if (($a -ge 4) -and ($b -eq 7) -or ($b -eq 7)){Write-Host 'ок'}

 

Мы можем использовать команды Powershell в сравнениях:


if (Get-NetAdapter){Write-Host "Сетевой адаптер установлен"}

Командой Get-NetAdapte мы получаем список адаптеров. Если бы список был пуст, то он бы вернул $null и выражение бы не выполнилось.

Можно использовать серию скриптов, но главное экранировать в скобки:


if ( (Get-Process -Name *powersh*) -and (Get-Service) ) {'Ok'}

 

Мы уже писали о сложностях работы с $null в Powershell, но главное придерживаться правила, что это значение должно быть слева:


if ( $null -eq $value )

 

Вы можете назначать переменную через условие, а в самом ScriptBlock работать с ней:


if ( $proc = Get-Process Notepad* ){$proc | Stop-Process}

Процесс Notepad будет остановлен в случае, если такой процесс существует.

Мы так же можем назначать результат работы условий с помощью переменной:


$a = 33
$result =if ( $a -eq 22 ){$a += $a}
elseif ($a -eq 33){$a += 1}
else {$a}

$a

Эти способы весомо ухудшают читаемость кода и я бы не советовал их использовать.

Теги: #powershell

PowerShell-оператор If/Else работает неправильно — CodeRoad

Другой ответ довольно хорошо объяснил, почему ваш код не работает. Я туда не пойду. Вместо этого я дам несколько предложений, которые, по моему мнению, улучшат ваш сценарий, и объясню, почему я так думаю. Давайте начнем с функций. Некоторые из вещей, которые вы делаете, — это функции, которые я держу под рукой, потому что они хорошо работают и используются достаточно часто, чтобы мне нравилось иметь их под рукой.

Во-первых, ваш диалог, чтобы получить путь к файлу CSV. Это работает, не поймите меня неправильно, но, вероятно, могло бы быть и лучше… Как бы то ни было, вы открываете диалоговое окно открытия файла без параметров. Эта функция позволяет вам использовать несколько различных параметров по желанию или ни одного для очень общего диалога открытия файла, но я думаю, что здесь это небольшое улучшение:

Function Get-FilePath{
[CmdletBinding()]
Param(
    [String]$Filter = "|*. *",
    [String]$InitialDirectory = "C:\")

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
    $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    $OpenFileDialog.initialDirectory = $InitialDirectory
    $OpenFileDialog.filter = $Filter
    [void]$OpenFileDialog.ShowDialog()
    $OpenFileDialog.filename
}

Тогда просто назовите это так:

$CSVFile = Get-FilePath -Filter "Comma Separated Value (.CSV)|*.CSV" -InitialDirectory "$env:USERPROFILE\Desktop"

Это открывает диалоговое окно фильтрации только для CSV файлов и запускает их просмотр на рабочем столе (я нахожу, что многие люди сохраняют вещи на своем рабочем столе). Это только получает путь, так что вы будете выполнять проверку, как и раньше. На самом деле, не так, как ты. Кажется, ты действительно все усложнил. Но я перейду к этому через минуту, во-первых, еще одна функция! Вы довольно часто вызываете окна сообщений, набираете кучу вариантов, вызываете тип и все такое каждый раз. Если вы собираетесь делать это несколько раз, облегчите себе задачу, сделайте функцию. Вот, зацени это:

Function Show-MsgBox ($Text,$Title="",[Windows.Forms.MessageBoxButtons]$Button = "OK",[Windows.Forms.MessageBoxIcon]$Icon="Information"){
[Windows.Forms.MessageBox]::Show("$Text", "$Title", [Windows.Forms.MessageBoxButtons]::$Button, $Icon) | ?{(!($_ -eq "OK"))}
}

Затем вы можете указать для него столько или столько, сколько захотите. Кроме того, он использует параметры типа, поэтому завершение вкладки работает, или в ISE (если вы пишете свой сценарий, как я) появятся допустимые параметры, и вы просто выберете из списка кнопки или значок для отображения. Кроме того, он ничего не возвращает, если это простой ответ ‘OK’, чтобы сохранить все в чистоте, но вернет Yes/No/Cancel или любой другой вариант, который вы выберете для кнопок.

Хорошо, это функции, давайте перейдем к сути сценария. Проверка вашего файла… Хорошо, вы тянете первую строку файла, так что это должна быть просто строка, я не уверен, почему вы разделяете ее и проверяете каждый заголовок по отдельности. «?machine name»?,»?mac»?$’){ Show-MsgBox «The CSV File’s headers must be Machine Name and MAC.» ‘Invalid CSV File headers!’ -Icon Warning break }

Итак, теперь у нас есть две функции и 5 строк кода. Да, функции занимают больше места, чем у вас было раньше, но с ними удобнее работать и они более функциональны. Ваша коррекция адреса MAC и отправляющая часть WOL-все это тузы, насколько я понимаю. Нет причин менять эту часть. Теперь, для проверки того, что компьютеры вернулись… здесь мы могли бы использовать некоторые улучшения. Вместо того, чтобы создавать [List] , просто добавьте элемент к каждому объекту, а затем отфильтруйте его ниже. Сценарий в целом был бы немного длиннее, но я думаю, что для этого лучше.

Add-Type -AssemblyName Microsoft.VisualBasic,System.Windows.Forms

Function Get-FilePath{
[CmdletBinding()]
Param(
    [String]$Filter = "|*.*",
    [String]$InitialDirectory = "C:\")

    [void][System.Reflection.Assembly]::LoadWithPartialName("System."?machine name"?,"?mac"?$'){
    Show-MsgBox "The CSV File's headers must be Machine Name and MAC." 'Invalid CSV File headers!' -Icon Warning
    break
}

$ComputerList = Import-Csv -Path $CSVFile |
Out-GridView -PassThru -Title "Select Computers to Wake up"

ForEach($Computer in $ComputerList)

    {

        If($Computer.'MAC' -notmatch '([:]|[-])')

            {

                $Computer.'MAC' = $Computer.'MAC' -replace '(..(?!$))','$1:'

            }

        $MACAddr = $Computer.'MAC'.split('([:]|[-])') | %{ [byte]('0x' + $_) }
        $UDPclient = new-Object System.Net.Sockets.UdpClient
        $UDPclient.Connect(([System.Net.IPAddress]::Broadcast),4000)
        $packet = [byte[]](,0xFF * 6)
        $packet += $MACAddr * 16
        [void] $UDPclient.Send($packet, $packet.Length)
        write "Wake-On-Lan magic packet sent to $($Computer.'Machine Name'.ToUpper())"

    }

Write-Host "Pausing for sixty seconds before verifying connectivity."
Start-Sleep -Seconds 60

$ComputerList|ForEach

    {

        Write-Host "Pinging $($_.'Machine Name')"
        Add-Member -InputObject $_ -NotePropertyName "PingResult" -NotePropertyValue (Test-Connection -ComputerName $Computer.'Machine Name' -Quiet)

    }

If(($ComputerList|Where{!($_.PingResult)}).Count -gt 0)

    {

        Show-MsgBox "All machines selected are online." 'Success'

    }

Else

    {

        Show-MsgBox "The following machines did not respond to a ping: $(($ComputerList|?{!($_.PingResult)}) -join ", ")" 'Unreachable Machines' -Icon Asterisk

    }

Ладно, я собираюсь слезть с коробки 45 и пойти домой, моя смена закончилась, и пришло время для холодной.

Операторы условий Powershell — Системный Администратор

Операторы условий (они же условные операторы) – используются для условного выполнения кода. Проще говоря, в момент когда необходимо принять решение, будут задействованы операторы условий. Почти всегда используются совместно с операторами сравнения, рассмотренными ранее. Давайте взглянем поближе на операторы условий Powershell.

Оператор IF

IF (если) – вычисляет значение заданное в круглых скобках (). Если результатом вычисления является логическое True, то выполняется конструкция команд в фигурных скобках {}. Если результат вычисления будет False выполнятся команды следующие за фигурными скобками. Давайте рассмотрим на примере.

$test_operator=$True
if ($test_operator)
{
Write-Host "УРА. Оператор имеет значение TRUE"
}

Результатом выполнения данного скрипта будет вывод в консоль фразы: УРА. Оператор имеет значение TRUE. Если переменная $test_operator будет иметь значение FALSE фразы указанной выше не появится, т.к. командлет выводящий данную фразу на экран находится в {} скобках.

Оператор ELSE

ELSE (иначе) – используется в связке с оператором IF. Оператор ELSE позволяет определить что делать в случае если оператор IF не равен TRUE. Написание конструкции состоит из оператора ELSE, далее идут фигурные скобки. Разберем на примере для лучшего понимания.

$proc=(Get-Process).ProcessName
if ($proc -like "notepad")
{
Write-Host "Блокнот запущен."
}
else 
{start notepad}

В переменную $proc мы сохраняем список запущенных процессов с указанием вывода по полю ProcessName. Далее оператором if сравниваем, есть ли в переменной $proc запущенный процесс с именем notepad. Если есть, то выводим на экран сообщение Блокнот запущен. Если такого процесса нет в ход идет конструкция else и выполняет команды в фигурных скобках, то есть запускает notepad.

Данный скрипт конечно в простейшем варианте, но тоже пригоден и часто используется системными администраторами. Очень удобно контролировать запущен ли конкретный процесс и если нет запускать его.

Оператор ELSEIF

ELSEIF – объединяет IF и ELSE. Используется после оператора IF в случае когда необходимо сделать дополнительное сравнение. Давайте рассмотрим пример в Васей. Определим переменную $vasya_years и укажем возраст. Далее через конструкцию IF, ELSEIF и ELSE выясним насколько Вася старый.

$vasya_years=19
if ($vasya_years -gt 60)
{Write-Host "Вася уже старенький. Ему" $vasya_years "лет"}
elseif ($vasya_years -ge 40)
{Write-Host "Вася еще молод. Ему" $vasya_years "лет"}
else {
Write-Host "Васе еще жить да жить. Ему только" $vasya_years "лет" 
}

В переменной мы указали что Васе 19 лет. Первый условный оператор if проверил что Васе не больше 60 лет и передал следующему оператору elseif. В результате проверки выяснилось что Васе меньше 40 лет и следующий этап за оператором else. Который принял решение, что Вася не попадает под первые два оператора, и он явно еще молодой.

Операторы условий Powershell могу содержать в себе и другие условные операторы. Бывает необходимо для более сложной оценки. Посмотрим на примере с блокнотами.

$proc=(Get-Process).ProcessName
$len=($proc -like "notepad").Length
if ($proc -like "notepad")
{
    if ($len -ge 2)
    {Write-Host "Количество запущенных блокнотов =" $len}
    else {
    Write-Host "Блокнот запущен."}
}
else 
{start notepad}

В первом условии if мы сравниваем переменную $proc и в случае положительного результата переходим в вложенному if. Во втором (вложенном) if мы сравниваем переменную $len с двойкой. Если запущено 2 и более процесса notepad будет выведено сообщение с указанием количества запущенных блокнотов. В случае 1 запущенного блокнота будет сообщение Блокнот запущен. Если блокнот не запущен, в последнем операторе else скрипт его запустит.

Оператор SWITCH

SWITCH – использует немного другой синтаксис для сравнения значений. Его еще называют оператор переключения. В круглых скобках указывается выражение, результат которого сравнивается со значениями в фигурных скобках. Перейдем к примеру

$names = 'Даша'
switch ($names)
{
    'Даша'
    {
        'Поздравляю вы выбрали Дарью'
    }
    'Машу'
    {
        'Вы выбрали Марию'
    }
    'Глафира'
    {
        'Вы выбрали Глафиру'
    }
    Default {"Вы никого не выбрали получайте Колю"}
}

В переменной $names мы указали имя Даша. Оно последовательно сравнивается с каждым именем в фигурных скобках. Если не одно из имен не подошло, выполняется действие указанное в параметре Default. Параметр default не обязательный можно его не указывать. В случае отсутствия совпадения скрипт просто завершит работу.

Рекомендую к прочтению:

powershell — Powershell дает неправильный вывод в блоке if else

Проверьте следующий код с простыми блоками if else

cls
$a = Read-Host("Enter the marks ")

if (($a -le 100) -and ($a -ge 90)){

 Write-Host("The grade is A")

}
elseif (($a -le 89) -and ($a -ge 80)){

 Write-Host("The grade is B")

}

elseif (($a -le 79) -and ($a -ge 70)){

 Write-Host("The grade is C")

}

elseif (($a -le 69) -and ($a -ge 60)){

 Write-Host("The grade is D")

}
elseif($a -lt 60){
Write-Host("The grade is F")
}

И когда я ввожу ввод между 90 - 99, он возвращается без вывода. И если я введу 100 в качестве ввода, я получаю "The grade is F", т.е. блок else выполняется, но он не должен работать в соответствии с кодом. Кто-нибудь может объяснить почему?

0

Roshin Raphel 24 Ноя 2020 в 11:47

1 ответ

Лучший ответ

Причина проблемы — тип данных. По умолчанию тип данных — «Строка». Требование здесь состоит в том, чтобы сравнить числа, поэтому приведенное ниже решение для обозначения типа данных как ‘int’ подходит.

cls
[int]$a = Read-Host("Enter the marks ")
if (($a -le 100) -and ($a -ge 90)){
 Write-Host("The grade is A")
}
elseif (($a -le 89) -and ($a -ge 80)){
 Write-Host("The grade is B")
}
elseif (($a -le 79) -and ($a -ge 70)){
 Write-Host("The grade is C")
}
elseif (($a -le 69) -and ($a -ge 60)){
 Write-Host("The grade is D")
}
elseif($a -lt 60){
Write-Host("The grade is F")
}

Мне это нравится больше

& {
    param(
        [ValidateRange(1, 100)]
        [int]$a
    )

    switch ($a){
        {$_ -in 90..100}{Write-Host("The grade is A")}
        {$_ -in 80..89}{Write-Host("The grade is B")}
        {$_ -in 70..79}{Write-Host("The grade is C")}
        {$_ -in 60..69}{Write-Host("The grade is D")}
        default {Write-Host("The grade is D")}
    }
    
} -a 95

$numberInString = Read-Host "imput number well be string"

    $numberInString -le 100
    [int]$numberInString -le 100

    $numberInString -ge 90
    [int]$numberInString -le 100

imput number well be sting: 95
False
True
True
True

Если введена отметка, скажите «99». Глядя на первое сравнение:

"99" -le "100"

Причина, по которой приведенный выше результат — «Ложь», потому что «9» больше «1». Сравнение строк происходит путем сравнения символа за символом, пока одна или обе строки не достигнут конца.

3

sunilvijendra 27 Ноя 2020 в 03:02

НОУ ИНТУИТ | Лекция | Сценарии Windows PowerShell

Аннотация: Описываются управляющие инструкции языка PowerShell (ветвления и циклы). Обсуждаются механизмы безопасности, применяемые при запуске сценариев PowerShell

Сценарии Windows PowerShell

До настоящего момента мы работали в оболочке PowerShell интерактивно, вводя команды и получая результат их выполнения. Перейдем теперь к рассмотрению сценариев, поддержка которых реализована в PowerShell в полной мере – от самых простых до очень сложных.

Сценарии PowerShell представляют собой текстовые файлы с расширением ps1, в которых записаны команды, операторы и другие конструкции языка PowerShell. В отличие от сценариев WSH и командных файлов интерпретатора Cmd.exe, сценарии PowerShell можно писать поэтапно, непосредственно в самой оболочке, перенося затем готовый код во внешний текстовый файл. Такой подход значительно упрощает изучение языка и отладку сценариев, так как можно сразу видеть результат выполнения отдельных частей сценария.

Как правило, при создании более-менее сложных сценариев возникает необходимость в управлении ходом выполнения программы. Для этого в языке PowerShell, как и в любом алгоритмическом языке, предусмотрены специальные инструкции.

Управляющие инструкции языка PowerShell

В языке PowerShell имеются элементы, позволяющие выполнить логическое сравнение и предпринять различные действия в зависимости от его результата, или дающие возможность повторять одну или несколько команд снова и снова.

Инструкция If … Elseif … Else

Логические сравнения лежат в основе практически всех алгоритмических языков программирования. В PowerShell при помощи инструкции If можно выполнять определенные блоки кода только в том случае, когда заданное условие имеет значение True (истина). Также можно задать одно или несколько дополнительных условий выполнения, если все предыдущие условия имели значение False. Наконец, можно задать дополнительный блок кода, который будет выполняться в том случае, если ни одно из условий не имеет значения True.

Синтаксис инструкции If в общем случае имеет следующий вид:

if (условие1)
   {блок_кода1}
[elseif (условие2)
    {блок_кода2}]
[else
   {блок_кода3}]

При выполнении инструкции If проверяется истинность условного выражения условие1.

Замечание

Условные выражения в PowerShell формируются, чаще всего, с помощью операторов сравнения и логических операторов, рассмотренных в лекции 17. Кроме того, важной особенностью языка является то, что в качестве условных выражений можно использовать конвейеры команд PowerShell.

Если условие1 имеет значение true, то выполняется блок_кода1, после чего PowerShell завершает выполнение инструкции If. Если условие1 имеет значение false, то PowerShell проверяет истинность условного выражения условие2. Если условие2 имеет значение true, то выполняется блок_кода2, после чего PowerShell завершает выполнение инструкции If. Если и условие1, и условие2 имеют значение false, то выполняется блок_кода3, а затем PowerShell завершает выполнение инструкции If.

Приведем пример использования инструкции If в интерактивном режиме работы. Запишем сначала в переменную $a число 10:

Сравним теперь значение переменной $a с числом 15 (в нашем примере используется командлет Write-Host, который выводит информацию на экран):

PS C:\> if ($a -eq 15) {
>> Write-Host '"Значение $a равно 15'
>> }
>> else {Write-Host 'Значение $a не равно 15'}
>>
Значение $a не равно 15

Из данного примера также видно, что в оболочке PowerShell в интерактивном режиме можно выполнять инструкции, состоящие из нескольких строк (это может оказаться очень кстати при отладке сценариев).

Цикл While

В PowerShell поддерживаются несколько видов циклов. Самый простой из них – цикл While, в котором команды выполняются в до тех пор, пока проверяемое условие имеет значение True.

Инструкция While имеет следующий синтаксис:

while (условие){блок_команд}

При выполнении инструкции While оболочка PowerShell вычисляет раздел условие инструкции, прежде чем перейти к разделу блок_команд. Условие в инструкции принимает значения True или False. До тех пор, пока условие имеет значение True, PowerShell повторяет выполнение раздела блок_команд.

Замечание

Как и в инструкции If, в условном выражении цикла While может использоваться конвейер команд PowerShell.

Раздел блок_команд инструкции While содержит одну или несколько команд, которые выполняются каждый раз при входе и повторении цикла.

Например, следующая инструкция While отображает числа от 1 до 3, если переменная $val не была создана, или была создана и инициализирована значением 0.

while($val -ne 3)
{
   $val++
   Write-Host $val
}

В данном примере условие (значение переменной $val не равно 3) имеет значение true, пока $val равно 0, 1 или 2. При каждом повторении цикла значение $val увеличивается на 1 с использованием унарного оператора увеличения значения ++ ( $val++ ). При последнем выполнении цикла значением $val становится 3. При этом проверяемое условие принимает значение false, и цикл завершается.

При интерактивной работе команды удобнее записывать в одной строке, например:

PS C:\> while($val -ne 3){$val++; Write-Host $val}
1
2
3while($val -ne 3){$val++; Write-Host $val}

Обратите внимание, что в качестве разделителя команд в PowerShell используется точка с запятой ( ; ).

Цикл Do … While

Цикл Do…While похож на цикл While, однако условие в нем проверяется не до блока команд, а после:

do{блок_команд}while (условие)

Например:

PS C:\> $val=0
PS C:\> do {$val++; Write-Host $val} while($val -ne 3)
1
2
3
Цикл For

Инструкция For в PowerShell реализует еще один тип циклов – цикл со счетчиком. Обычно цикл For применяется для итерации массива значений и выполнение действий на подмножестве этих значений. В PowerShell инструкция For используется не так часто, как в других языках программирования, так как коллекции объектов обычно удобнее обрабатывать с помощью инструкции Foreach. Однако, если необходимо знать, с каким именно элементом коллекции или массива мы работаем на данной итерации, то цикл For может помочь.

Синтаксис инструкции For:

for (инициация; условие; повторение){блок_команд}

Составные части цикла For имеют следующий смысл:

  • инициация — это одна или несколько разделяемых запятыми команд, выполняемых перед началом цикла. Данная часть цикла обычно используется для создания и присвоения начального значения переменной, которая будет затем основой для проверяемого условия в следующей части инструкции For.
  • условие — часть инструкции For, которая может принимать логическое значение true или false. PowerShell проводит оценку условия при каждом выполнении цикла For. Если результатом этой оценки является true, то выполняются команды в блоке блок_команд, после чего проводится новая оценка условия инструкции. Если результатом оценки условия вновь становится true, команды блока блок_команд выполняются вновь, и т.д., пока результатом проверки условия не станет false.
  • повторение — это одна или несколько разделяемых запятыми команд, выполняемых при каждом повторении цикла. Данная часть цикла обычно используется для изменения переменной, проверяемой внутри условия.
  • блок_команд — это набор из одной или нескольких команд, выполняющихся при вхождении в цикл или при повторении цикла. Содержимое блока блок_команд заключается в фигурные скобки.

Классический пример:

PS C:\> for ($i=0; $i -lt 5; $i++) { Write-Host $i }
0
1
2
3
4

об If — PowerShell | Документы Microsoft

  • 3 минуты на чтение

В этой статье

КРАТКОЕ ОПИСАНИЕ

Описывает языковую команду, которую можно использовать для запуска списков операторов на основе результаты одного или нескольких условных тестов.

ПОЛНОЕ ОПИСАНИЕ

Вы можете использовать оператор If для запуска блоков кода, если указанный условный тест оценивается как истина.Вы также можете указать одно или несколько дополнительных условных тесты для запуска, если все предыдущие тесты дали ложные результаты. Наконец, вы можете указать дополнительный блок кода, который запускается, если не было другого предшествующего условного теста оценивается как истина.

Синтаксис

В следующем примере показан синтаксис оператора If :

  если ()
    {<список операторов 1>}
[elseif ()
    {<список операторов 2>}]
[еще
    {<список операторов 3>}]
  

Когда вы запускаете оператор If , PowerShell оценивает условное условие выражение как истинное или ложное.Если истинно, запускается <список операторов 1> , и PowerShell выходит из оператора If . Если ложно, PowerShell оценивает условие, указанное условным оператором .

Для получения дополнительной информации о логическом вычислении см. about_Booleans.

Если истинно, <список операторов 2> запускается, и PowerShell выходит из Если утверждение.Если и , и оцениваются как false, <список операторов 3 > выполняется блок кода, и PowerShell завершает выполнение оператора If.

Вы можете использовать несколько операторов Elseif , чтобы связать серию условных тесты. Таким образом, каждый тест запускается только в том случае, если все предыдущие тесты ложны. Если вам необходимо создать оператор If , который содержит множество операторов Elseif , рассмотрите возможность использования вместо этого оператора Switch.

Примеры:

Самый простой Если оператор содержит одну команду и не содержит любые заявления Elseif или любые заявления Else. В следующем примере показано простейшая форма оператора If :

  if ($ a -gt 2) {
    Write-Host «Значение $ a больше 2».
}
  

В этом примере, если переменная $ a больше 2, условие оценивает значение true, и список операторов запускается. Однако, если $ a меньше или равно 2 или не является существующей переменной, оператор If не отображает сообщение.

При добавлении оператора Else отображается сообщение, когда $ a меньше или равно 2. Как показано в следующем примере:

  if ($ a -gt 2) {
    Write-Host «Значение $ a больше 2».
}
еще {
    Write-Host ("Значение $ a меньше или равно 2", +
        "не создается или не инициализируется.")
}
  

Для дальнейшего уточнения этого примера вы можете использовать оператор Elseif для отображения сообщение, когда значение $ a равно 2. Как показано в следующем примере:

  if ($ a -gt 2) {
    Write-Host "Значение $ a больше 2."
}
elseif ($ a -eq 2) {
    Write-Host «Значение $ a равно 2.»
}
еще {
    Write-Host ("Значение $ a меньше 2 или" +
        "не был создан или инициализирован")
}
  

Использование синтаксиса тернарного оператора

PowerShell 7.0 представил новый синтаксис с использованием тернарного оператора. Следует синтаксис тернарного оператора C #:

  <условие>? : 
  

Тернарный оператор ведет себя как упрощенный оператор if-else <условие> выражение вычисляется, и результат преобразуется в логическое чтобы определить, какая ветвь должна быть оценена дальше:

  • Выражение выполняется, если выражение <условие> правда
  • Выражение выполняется, если выражение <условие> ложь

Например:

  $ message = (Test-Path $ path)? «Путь существует»: «Путь не найден»
  

В этом примере значение $ message - «Путь существует», когда Test-Path возвращает $ true .Когда Test-Path возвращает $ false , значение $ message равно "Путь не найден".

  $ service = Get-Service BITS
$ service.Status -eq «Выполняется»? (Stop-Service $ service): (Start-Service $ service)
  

В этом примере, если служба запущена, она остановлена, и если ее состояние не Запуск , он запущен.

СМОТРИ ТАКЖЕ

Условная логика

с PowerShell If-Else

Сценарии могут принимать решения.Как? Используя концепцию, называемую условной логикой. Оператор PowerShell if и конструкции if / else - общие способы определения условий.

Когда вы пишете сценарии PowerShell, вы делаете это с учетом конкретной задачи или задач. Но операция может иметь более одного возможного действия на основе одного или нескольких условий. В этой ситуации на помощь приходит конструкция PowerShell If-Else.

Из этой статьи вы узнаете, что такое конструкция PowerShell If-Else, разберетесь с ее синтаксисом и принципами работы.Вы также узнаете из примеров некоторые из различных способов использования PowerShell If-Else для добавления обработки условной логики в свои сценарии.

Понимание синтаксиса PowerShell If-Else

Конструкция PowerShell if-else вычисляет одно или несколько условных выражений. Ниже вы увидите синтаксис оператора If. Этот стиль иногда называют управлением потоком.

  если ()
    {<список операторов 1>}
[elseif ()
    {<список операторов 2>}]
[еще
    {<список выписок 3>}]  

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

Списки операторов содержат код, предназначенный для запуска, если результат теста оценивается как истина.

Тогда есть три возможных оператора в группе операторов If. Это операторы IF, ELSEIF и ELSE.

  • Оператор if содержит первый проверяемый тест, за которым следует первый список операторов, заключенный в фигурные скобки {} .Инструкция PowerShell if - единственная инструкция, которая должна присутствовать.
  • Оператор elseif - это то место, где вы добавляете условия. Вы можете добавить несколько операторов ElseIf при нескольких условиях. PowerShell будет последовательно оценивать каждое из этих условий.
  • Оператор e lse не принимает никаких условий. Список операторов в этом операторе содержит код для запуска, если все предыдущие проверенные условия ложны.

Понимание логического потока PowerShell If-Else

Чтобы лучше понять, как работает PowerShell If-Else, вам необходимо ознакомиться с его логической последовательностью. На приведенной ниже диаграмме показан базовый процесс выполнения PowerShell If-Else.

Поток логики PowerShell If-Else

Когда выполняется инструкция if, PowerShell выполняет каждое условие, оценивая, возвращает ли код истинное или ложное значение. Краткое описание поведения приведено ниже:

  • PowerShell оценивает условие в Test 1 .
  • Если результат Test 1 возвращает true , код внутри списка операторов If будет запущен, а затем PowerShell завершит выполнение оператора If.
  • Если результат Test 1 возвращает false, PowerShell продолжает оценивать условие (Test n ) в следующем операторе ElseIf .
  • Если результат Test n возвращает false , PowerShell продолжает оценивать условие (Test n ) в следующем операторе ElseIf , если существует другой оператор ElseIf -OR-
  • Если результат Тест № возвращает false , выполняется код в операторе Else .Затем PowerShell выйдет из оператора If -OR-
  • . Если результат Test n вернет истину, будет выполнен код из оператора ElseIf . Затем PowerShell выйдет из оператора If.

Использование заявления PowerShell If-Else

В следующих разделах приведено несколько примеров использования оператора PowerShell If-Else при написании сценариев. Методы, которые вы изучите, могут помочь вам в использовании оператора If, если вы столкнетесь с реальной ситуацией, требующей его использования.

Единичное условие If-Else

Начнем с самого простого оператора If. Вы должны использовать единственный оператор if, когда нужно проверить только одно условие.

В приведенном ниже примере проверяется, больше ли значение переменной $ num , чем 10. Если результат верен, то на экране будет отображаться результат «$ num больше 10» . Если результат ложный, PowerShell ничего не делает, потому что нужно проверить только одно условие.

  $ число = 11
if ($ num -gt 10) {
    "$ num больше 10"
}  

Вставка приведенного выше кода в PowerShell даст вам результат, показанный ниже.

Пример одного условия If

Теперь, если вы хотите добавить «резервное» действие по умолчанию, а не просто позволять PowerShell ничего не делать, когда результат теста ложный, вы можете добавить оператор Else .

В приведенном ниже примере код в инструкции Else будет выполняться, если значение переменной $ num НЕ больше 10.

  $ число = 9
если ($ число -gt 10)
{
    "$ num больше 10"
}
еще
{
    "$ num НЕ больше 10"
}  

Выполнение измененного кода в PowerShell дает результат, показанный ниже.

Одно условие If

Начиная с PowerShell 7.0, был введен новый синтаксис для оператора If с использованием тернарного оператора . Операторы Single If могут эффективно использовать этот новый синтаксис.

Используя тот же пример выше, вот как будет выглядеть код с тернарным оператором.

  $ число = 11
$ num -gt 10? «$ num больше 10»: «$ num НЕ больше 10»  
Синтаксис оператора if с использованием тернарного оператора

Несколько условий If-Else с ElseIf

Если необходимо оценить несколько условий, необходимо добавить один или несколько операторов ElseIf. Каждый оператор ElseIf содержит тестовое выражение и собственный код для запуска.

Приведенный ниже сценарий при выполнении будет продолжать запрашивать имя фрукта до тех пор, пока не будет нажата клавиша CTRL + C или пока пользователь не введет букву « X ».

Затем оператор If последовательно перебирает все условия, пока не найдет совпадение. Если входные данные не соответствуют ни одному из условий, будет выполнен код внутри оператора Else .

  В то время как ($ fruit -ne "X") {
    $ fruit = Read-Host "Назови этот фрукт"

    if ($ fruit -eq 'Яблоко') {
        'У меня есть яблоко'
    }
    elseif ($ fruit -eq 'Банан') {
        "У меня есть банан"
    }
    elseif ($ fruit -eq 'Апельсин') {
        "У меня есть апельсин"
    }
    еще {
        «Извините, этого фрукта нет в списке»
    }
}  

Ниже показано, как приведенный выше сценарий ведет себя при запуске в PowerShell.

Несколько условий If-Else

Сообщение о состоянии свободного дискового пространства

Отчетность о свободном дисковом пространстве - одна из общих задач системных администраторов. Обычный способ сообщения информации о пространстве на фиксированных дисках на компьютере с Windows основан на приведенном ниже коде.

  Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object {$ _. DriveType -eq 3}  

Информация, которую вернет приведенный выше код, будет выглядеть примерно так, как показано на следующем снимке экрана.

Отчет с информацией о простом дисковом пространстве

Как видите, приведенные выше выходные данные показывают букву диска и значения свободного пространства, а также другие свойства. Хотя приведенный выше вывод хорош, он не интуитивно понятен. Способ представления информации не указывает на то, находится ли дисковое пространство в критическом состоянии, состоянии предупреждения или нормальном состоянии.

Использование инструкции If PowerShell для улучшения кода

Используя оператор PowerShell If-Else, можно добиться более интуитивного вывода, добавив условия для проверки того, превышает ли свободное пространство определенные пороговые значения или ниже их.И эти пороги будут определять состояние свободного дискового пространства.

В приведенном ниже примере сценария выполняется следующее:

  • Используя значение переменной $ Critical , определите порог, до которого процент свободного места будет помечен как критический .
  • Используя значение переменной $ Предупреждение , определите порог, до которого процент свободного места будет помечен как предупреждение .
  • Получить всю фиксированную информацию о диске с локального компьютера.
  • Прокрутите всю информацию о диске, чтобы определить свободное место и пометить его состояние.
    • Если процент свободного места выше, чем значение переменной $ Warning , состояние дискового пространства помечается как нормальное .
    • Если процент свободного места выше, чем значение переменной $ Critical , состояние дискового пространства помечается как предупреждение .
    • Если процент свободного пространства меньше или равен значению переменной $ Critical , состояние дискового пространства помечается как критическое .
  • Составьте свойства объекта 'Буква диска' , 'Имя диска' , 'Общий объем (ГБ)' , 'Свободное пространство (ГБ)' , 'Свободное пространство (%)' и «Статус» .
  • Вернуть окончательный отчет

Скопируйте приведенный ниже код и сохраните сценарий под именем Get-DiskSpace.ps1 . Не забудьте изменить значения переменных $ Critical и $ Warning , если вы хотите протестировать с другими пороговыми значениями.

  # Определить пороги в процентах
$ Critical = 20
$ Предупреждение = 70

# Получить всю информацию о фиксированном диске
$ diskObj = Get-CimInstance -ClassName CIM_LogicalDisk | Where-Object {$ _. DriveType -eq 3}

# Инициализировать пустой массив, который будет содержать окончательные результаты
$ finalReport = @ ()

# Итерировать информацию о каждом диске
$ diskObj.foreach (
    {
        # Рассчитать процент свободного места
        $ percentFree = [int] (($ _.FreeSpace / $ _. Размер) * 100)

        # Определить "Статус"
        if ($ percentFree -gt $ Предупреждение) {
            $ Status = 'Нормальный'
        }
        elseif ($ percentFree -gt $ Critical) {
            $ Status = 'Предупреждение'
        }
        elseif ($ percentFree -le $ Critical) {
            $ Status = 'Критическое'
        }

        # Составьте свойства объекта для добавления в отчет
        $ tempObj = [заказано] @ {
            'Буква диска' = $ _. DeviceID
            "Имя диска" = $ _.VolumeName
            'Общий объем (ГБ)' = [int] ($ _. Размер / 1 ГБ)
            'Свободное пространство (ГБ)' = [число] ($ _. FreeSpace / 1 ГБ)
            'Свободное пространство (%)' = "{0} {1}" -f [int] $ percentFree, '%'
            'Статус' = $ Статус
        }

        # Добавляем объект в итоговый отчет
        $ finalReport + = Новый объект psobject -property $ tempObj
    }
)

return $ finalReport  

После сохранения сценария протестируйте его, вызвав его имя в PowerShell. Ниже приведен пример, демонстрирующий, как работает этот скрипт.

Вывод команды состояния свободного дискового пространства

Как видно из выходных данных, статус для каждого диска определяется процентом свободного дискового пространства, который был результатом использования нескольких условий с PowerShell If-Else.

Множественные и вложенные If-Else

Допустим, у вас есть оператор if-else с условием, определенным в блоке else . Когда выполняется инструкция if-else, вызывается блок else , если код внутри блока if возвращает false.

Внутри блока else необходимо выполнить еще одну условную проверку. В результате вам понадобится еще один оператор If-Else. Этот сценарий называется вложенным If-Else. Вложенный оператор If-Else обычно используется, если внутренний If-Else зависит от результата операции во внешнем If-Else.

Использование нескольких вложенных операторов If-Else может сбивать с толку. Ключевой момент - запомнить размещение каркаса и убедиться, что вы делаете отступ в своем коде. Отступы в коде помогут вам легко распознавать и разделять операторы If-Else.

Пример нескольких / вложенных операторов If-Else

В приведенном ниже примере сценария показано, как несколько вложенных If-Else могут зависеть друг от друга. Логика приведенного ниже кода следующая.

  • Если $ SendEmail равно $ false , сценарий ничего не сделает и завершится.
  • Если $ SendEmail равен $ true , то переменные $ From и $ To не должны быть пустыми или нулевыми. В противном случае $ abortFlag будет установлен в 1.
  • Если $ SendEmail - это $ true , а $ CCEnabled - $ true , то переменная $ CC не должна быть пустой или нулевой. В противном случае для $ abortFlag будет установлено значение 1.
  • Если значение $ SendEmail равно $ true , а значение $ BCCEnabled равно $ true , тогда переменная $ BCC не должна быть пустой или значение NULL. В противном случае для $ abortFlag будет установлено значение 1.
  • Если значение $ abortFlag равно 1, сценарий завершится с этого момента и не продолжит работу.
  • Если значение $ abortFlag равно 0, сценарий продолжается до конца.

Скопируйте приведенный ниже код и сохраните его как Send-MyMail.ps1 . Пока не меняйте никаких значений.

  $ SendEmail = $ true

$ From = ""
$ To = ""

$ CCEnabled = $ true
$ CC = ""

$ BCCEnabled = $ true
$ BCC = ""

$ abortFlag = 0

if ($ SendEmail) {
    if (! $ From) {
        Write-Host «[От] отсутствует» -ForegroundColor Red
        $ abortFlag = 1
    }

    if (! $ To) {
        Write-Host «[Кому] отсутствует» -ForegroundColor Red
        $ abortFlag = 1
    }

    if ($ CCEnabled) {
        if (! $ CC) {
            Write-Host «[CC] отсутствует» -ForegroundColor Red
            $ abortFlag = 1
        }
    }

    if ($ BCCEnabled) {
        if (! $ BCC) {
            Write-Host «[BCC] отсутствует» -ForegroundColor Red
            $ abortFlag = 1
        }
    }

    if ($ abortFlag -eq 1) {
        Write-Host "Сработал флаг прерывания.Выход из скрипта. "-ForegroundColor Red
        сломать
    }
    еще {
        Write-Host "Ваше письмо будет отправлено с этого адреса $ From" -ForegroundColor Green
        Write-Host "И будут отправлены следующим людям:" -ForegroundColor Green
        Write-Host "To: $ To" -ForegroundColor Green

        if ($ CCEnabled -and $ CC) {
            Write-Host "CC: $ CC" -ForegroundColor Green
        }

        if ($ BCCEnabled -and $ BCC) {
            Write-Host "BCC: $ BCC" -ForegroundColor Green
        }
    }
}  

После сохранения файла запустите его в PowerShell, как показано ниже.Приведенная ниже демонстрация показывает результат выполнения сценария, когда значения переменных остаются неизменными.

Вложенный пример If-Else

Затем отредактируйте сценарий и обновите все переменные должным образом, как показано в приведенном ниже фрагменте.

  $ SendEmail = $ true

$ From = "[адрес электронной почты защищен]"
$ To = "[адрес электронной почты защищен]"

$ CCEnabled = $ true
$ CC = "[электронная почта защищена]"

$ BCCEnabled = $ true
$ BCC = "[электронная почта защищена]"

--- СНиП ---  

После редактирования переменных сохраните сценарий и снова запустите его.Он должен показать вам тот же результат, что и ниже.

Еще один вложенный пример If-else

Теперь измените переменные и попробуйте разные комбинации, чтобы проверить, как это повлияет на вложенное If-Else. Самостоятельное изменение и тестирование поможет вам лучше понять логику.

Сводка

Из этой статьи вы узнали о конструкции условной логики - конструкции PowerShell If-Else. Использование оператора If-Else позволяет разработчикам сценариев формулировать условную логику и направлять действия своих сценариев на основе результатов тестирования.

С помощью примеров, показанных в этой статье, вы должны были изучить способы и методы использования оператора If-Else при создании кода, управляемого принятием решений. If-Else может быть простым с использованием одного условия и становится более сложным, когда вы углубляетесь во вложенные операторы If-Else.

Что вы думаете об утверждении If-Else? Вы думаете, что будете использовать это все чаще и чаще после прочтения этой статьи? Какие еще цели вы можете придумать, чтобы применить полученные здесь знания?

Дополнительная литература

Заявление

PowerShell If-else - Javatpoint

Когда нам нужно выполнить блок операторов, когда условие истинно или когда условие ложно, мы должны использовать оператор if-else .

Если условие, которое является логическим выражением, оценивается как True, то будут выполнены операторы внутри тела ' if '. И если условие оценивается как ложное, будут выполнены операторы внутри тела « else ».

Синтаксис оператора If-Else

Если (тестовое_выражение) { Заявление-1 Заявление-2 ....... Заявление-N } еще { Заявление-1 Заявление-2....... Заявление-N }

Блок-схема заявления «Если-еще»

Примеры

В следующих примерах показано, как использовать оператор if-else в PowerShell:

Example1: В этом примере мы можем проверить, является ли число в переменной четным или нечетным. Если число четное, выводится Четное , в противном случае Нечетное .

PS C: \> $ a = 15 PS C: \> $ c = $ a% 2 PS C: \> если ($ c -eq 0) >> { >> echo "Число четное" >>} еще >> { >> echo "Число нечетное" >>}

Выход:

Example2: В этом примере мы проверим, является ли число отрицательным или положительным.

PS C: \> $ a = -10 PS C: \> if ($ a -lt 0) { >> echo "Введено отрицательное число" >>} еще >> { >> echo "Введено положительное число" >>}

Выход:

 Введено отрицательное число
 

Example3: В этом примере мы проверим, имеет ли человек право голосовать или нет.

PS C: \> $ age = 19 PS C: \> если ($ age -ge 20) >> { >> echo "Человек имеет право голосовать." >>} еще >> { >> echo «Человек не имеет права голоса». >>}

Выход:

 Лицо имеет право голоса.
 

Example3: В этом примере мы проверим наибольшее число в двух переменных.

PS C: \> $ n1 = 150 PS C: \> $ n2 = 200 PS C: \> если ($ n1 -gt $ n2) >> { >> echo "Значение переменной n1 больше." >>} еще >> { >> echo "Значение переменной n2 больше." >>}

Выход:

 Значение переменной n2 больше.
 

Powershell: основы оператора if - Томас Маурер

Оператор if очень важен, если вы создаете сценарии PowerShell. Поэтому я создал этот пост, чтобы получить базовую информацию о том, как использовать операторы if-else с PowerShell.

Основы оператора if-else в PowerShell

Как и многие другие языки, PowerShell имеет операторы для условного выполнения кода в ваших сценариях.Одним из таких операторов является оператор If.

Во-первых, синтаксис с простым if:

  if (условие) {do}  

Вы также можете использовать elseif и else:

  if (условие) {do} 
elseif (условие) {do}
else {do}

Простой if мог бы выглядеть так:

 if ($ varibale -eq "1") {
Write-Host "Да, переменная равна 1"
}
 

Операторы сравнения:

  • Равно: -eq
  • Меньше: -lt
  • Больше чем: -gt
  • Больше или равно: -ge
  • Меньше или равно: -le
  • Не равно: -ne

Вы также можете проверить регистр, добавив к оператору букву «c».« -экв. » будет « -экв. »

Логические операторы:

  • Нет -не
  • Не !
  • И - и
  • Или - или

Таким образом, вы можете просто добавить несколько условий:

 if ($ varibale -eq "1" -or $ varibale -eq "2") {
Write-Host "Варибал равен 1 или 2"
} 

Заключение

Я надеюсь, что это дает вам простой и краткий обзор того, как использовать операторы if-else с PowerShell.Если у вас есть вопросы, не стесняйтесь оставлять комментарии. Если вы хотите узнать больше, ознакомьтесь с Microsoft Docs.

Теги: код, условия, if, оператор if, Microsoft, операторы, PowerShell, ps, сценарии, Windows, Windows Powershell Последнее изменение: 22 декабря 2020 г.

Об авторе / Томас Маурер

Томас работает старшим консультантом по облачным технологиям в Microsoft. Он взаимодействует с сообществом и клиентами по всему миру, чтобы делиться своими знаниями и собирать отзывы для улучшения облачной платформы Azure.До того, как присоединиться к группе инженеров Azure, Томас был ведущим архитектором и Microsoft MVP, помогая в проектировании, внедрении и продвижении облачных технологий Microsoft. Если вы хотите узнать больше о Томасе, посетите его блог: www.thomasmaurer.ch и Twitter: www.twitter.com/thomasmaurer

Похожие сообщения

27 июля 2021 г. • PowerShell

Поскольку многие люди начинают хранить свои скрипты и файлы в репозиториях GitHub, у меня часто возникает вопрос, как мне скачать...

Читать дальше →

20 июля 2021 г. • Microsoft Azure

Если вы являетесь партнером Microsoft и работаете с клиентами в гибридных облачных и мультиоблачных средах, вам обязательно нужно иметь ...

Читать дальше →

13 июля 2021 г. • Microsoft, Microsoft Azure

Сегодня Эрин Чаппл (корпоративный вице-президент Microsoft, Azure Core) только что объявила о новой программе Inside Azure для ИТ, которая предоставляет ...

Читать дальше →

6 июля 2021 г. • Microsoft, PowerShell, Windows

В этом сообщении блога я хочу быстро рассказать, как можно начать работу с новым диспетчером пакетов Windows и WinGet CLI.В Microsoft ...

Читать дальше →

условий в PowerShell | CloudAffaire

Всем привет

Добро пожаловать в CloudAffaire, это Дебджит.

В последнем сообщении блога мы обсудили операторы в PowerShell.

Operators In PowerShell

В этом сообщении блога мы обсудим условия в PowerShell. Как и любой другой язык сценариев, PowerShell также предоставляет условия. Вы можете использовать условия в сценарии PowerShell для принятия решений.В PowerShell мы в основном используем условный оператор IF для принятия решений. PowerShell поддерживает условные операторы if, if else и if elseif else. Помимо if, switch также может использоваться как условный оператор.

Условия в PowerShell:

If, if-else и if-elseif-else:

if, if else и if elseif else блок условия может использоваться для принятия решений в PowerShell. Блок условий if, if else и if elseif else также поддерживает вложение.

  • if : if - это простейший условный блок, который можно определить в сценарии PowerShell.Если оценивает условие, и если условие истинно, выполняется следующая команда.
  • if else : В отличие от if, if else оценивает как истинные, так и ложные результаты данного условия.
  • If elseif else : Используя if elseif else, вы можете оценить несколько условий в сценарии оболочки. Несколько блоков elseif могут быть определены в блоке if elseif else в зависимости от ваших требований.

############################ ## PowerShell | Условия ## ############################ ## PowerShell Последняя версия (5) ## -------------- ## if elseif else ## -------------- ## if () ## {<список операторов 1>} ## [elseif () ## {<список операторов 2>}] ## [еще ## {<список операторов 3>}] ## Если $ a = 10; $ b = 7; $ c = 22 if ($ a -gt $ b) { Write-Host «$ a больше, чем $ b» ## возвращает «10 больше, чем 7» } ## если еще если ($ a -gt $ c) { Write-Host «$ a больше, чем $ b» } еще { Write-Host «$ c больше, чем $ a» ## возвращает «22 больше 10» } ## if elseif else если (($ a -gt $ b) -and ($ a -gt $ c)) { Write-Host "$ a лучше" } elseif (($ b -gt $ c) -and ($ b -gt $ c)) { Write-Host «$ b является самым большим» } еще { Write-Host «$ c является максимальным» ## возвращает «22 является максимальным» } ## вложение $ a = 30; $ b = 7; $ c = 22 если ($ a -gt $ b) { если ($ a -gt $ c) { Write-Host «$ a является максимальным» ## возвращает «30 является максимальным» } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

###########################

## PowerShell | Условия ##

############################

## PowerShell Последняя версия (5)

## --------------

## if elseif else

## --------------

## if ( )

## {<список операторов 1>}

## [elseif ()

## {<список операторов 2>}]

## [else

## {<список операторов 3 >}]

## Если

$ a = 10; $ b = 7; $ c = 22

if ($ a -gt $ b) {

Write-Host «$ a больше, чем $ b» ## возвращает «10 больше, чем 7»

}

## if else

if ($ a -gt $ c)

{

Write-Host "$ a больше, чем $ b"

}

else

{

Write-Host "$ c больше, чем $ a "## возвращает" 22 больше 10 "

}

## if elseif else

if (($ a -gt $ b) -and ($ a -gt $ c))

{

Write-Host «$ a является наибольшим»

}

elseif (($ b -gt $ c) -and ($ b -gt $ c))

{

Write-Host «$ b наибольшее значение» "

}

else

{

Write-Host" $ c наибольшее "## возвращает" 22 наибольшее "

}

## nesting

$ a = 30; $ b = 7; $ c = 22

if ($ a -gt $ b)

{

if ($ a -gt $ c)

{

Write-Host «$ a наибольшее значение» ## возвращает »30 максимальное значение "

}

}

Коммутатор:

Операторы Switch могут использоваться для одновременной оценки нескольких условий.Вы можете определить действие для каждого условия в инструкции switch, и если условие оценивается как «Истина», действие выполняется. Также существует блок действий по умолчанию, который выполняется, если не удовлетворяются никакие другие условия.

Оператор

Switch также поддерживает различные параметры, которые можно использовать для управления поведением переключателя. Коммутатор имеет следующие параметры:

  • Подстановочный знак : указывает, что условие является строкой с подстановочным знаком. Если предложение соответствия не является строкой, параметр игнорируется.При сравнении регистр не учитывается.
  • Exact : указывает, что предложение match, если это строка, должно точно соответствовать. Если предложение соответствия не является строкой, этот параметр игнорируется. При сравнении регистр не учитывается.
  • CaseSensitive : выполняет сопоставление с учетом регистра. Если предложение соответствия не является строкой, этот параметр игнорируется.
  • Файл : вводится из файла, а не из выражения значения. Если включено несколько параметров File, используется только последний.Каждая строка файла читается и оценивается оператором Switch. При сравнении регистр не учитывается.
  • Regex : Выполняет сопоставление значения с условием регулярного выражения. Если предложение соответствия не является строкой, этот параметр игнорируется. При сравнении регистр не учитывается. Автоматическая переменная $ match доступна для использования в блоке операторов сопоставления.

## ------ ## выключатель ## ------ ## переключатель [-regex | -wildcard | -exact] [- casesensitive] (<значение>) ## { ## "строка" | число | переменная | {выражение} {список операторов} ## default {список операторов} ##} $ a = "debjeet" switch ($ a) { "anil" {"Привет, Анил"} "bimal" {"Привет, Bimal"} "debjeet" {"Hello Debjeet"} ## возвращает "Hello Debjeet" } $ a = $ null switch ($ a) { "anil" {"Привет, Анил"} "bimal" {"Привет, Bimal"} "debjeet" {"Hello Debjeet"} default {"Нет совпадений"} ## возвращает "нет совпадений" } $ a = 1; $ b = 3 switch ($ a, $ b) { 1 {"one"} ## возвращает "one" 2 {"два"} 3 {"три"} ## возвращает "три" По умолчанию {"нет совпадений"} } $ a = "cloudaffaire" switch -wildcard ($ a) { "aws" {"AWS"} "gcp" {"GCP"} "cloud *" {"CloudAffaire"} ## возвращает CloudAffaire. По умолчанию {"нет совпадений"} } $ a = "AWS" switch -casesensitive ($ a) { "aws" {"aws"} "AWS" {"AWS"} ## возвращает "AWS" По умолчанию {"нет совпадений"} } $ a = "cloudaffaire" switch -exact ($ a) { "облако" {"облако"} "cloudaffaire" {"cloudaffaire"} ## возвращает "cloudaffaire" По умолчанию {"нет совпадений"} } $ a = 'https: // cloudaffaire.(http [s]?) \: //.*$ '{"веб-адрес"} ## возвращает "веб-адрес" по умолчанию {"нет совпадений"} } switch (1,2,3,4,5) { {$ _% 2} {"$ _ is odd"} ## возвращает 1,3,5 {-not ($ _% 2)} {"$ _ is even"} ## возвращает 2,4 По умолчанию {"нет совпадений"} }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

9 0016 64

65

66

67

68

## ------

## switch

## ------

## switch [-regex | -wildcard | -exact] [- casesensitive] ()

## {

## "строка" | число | переменная | {выражение} {список операторов}

## default {список операторов}

##}

$ a = "debjeet"

переключатель ($ a) {

"anil" {"Hello Anil"}

"bimal" {"Hello Bimal"}

"debjeet" {"Hello Debjeet"} ## возвращает "Hello Debjeet"

}

$ a = $ null

switch ($ a) {

"anil" {"Hello Anil"}

"bimal" {"Hello Bimal"}

"debjeet" {"Hello Debjeet"}

default { «Нет совпадений»} ## возвращает «Нет совпадений»

}

$ a = 1; $ b = 3

switch ($ a, $ b) {

1 {"one"} ## возвращает "one"

2 {"two"}

3 {"three"} ## возвращает "three "

По умолчанию {" нет совпадений "}

}

$ a =" cloudaffaire "

switch -wildcard ($ a) {

" aws "{" AWS "}

" gcp "{" GCP "}

" cloud * "{" CloudAffaire "} ## возвращает" CloudAffaire "

Default {" no match "}

}

$ a =" AWS "

switch -casesensitive ($ a ) {

"aws" {"aws"}

"AWS" {"AWS"} ## возвращает "AWS"

По умолчанию {"no match"}

}

$ a = "cloudaffaire"

switch -exact ($ a) {

"облако" {"облако"}

"cloudaffaire" {"cloudaffaire"} ## возвращает "clou" daffaire "

По умолчанию {" нет совпадений "}

}

$ a = 'https: // cloudaffaire.(http [s]?) \: //.*$ '{"веб-адрес"} ## возвращает "веб-адрес"

по умолчанию {"нет соответствия"}

}

переключатель (1,2, 3,4,5) {

{$ _% 2} {"$ _ is odd"} ## возвращает 1,3,5

{-not ($ _% 2)} {"$ _ is even" } ## возвращает 2,4

По умолчанию {"нет совпадений"}

}

Надеюсь, вам понравилась эта статья. В следующем сообщении блога мы обсудим циклы в PowerShell.

Чтобы получить более подробную информацию о PowerShell, пожалуйста, следуйте ниже официальной документации

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about?view=powershell-5.1

Заявление

If - Easy IT Tutorials

В этом руководстве мы рассмотрим оператор If в PowerShell.

Одиночный оператор If

Оператор If используется, когда мы хотим, чтобы что-то было сделано на основе условия.Например, , если возраст старше 65 лет, , тогда классифицируют человека как старшего. Если пол равен мужскому, , тогда назовите ребенка Кевином.

Состав заявления If следующий:

если ( условие ) {
действие
}

Обратите внимание, как условие устанавливается между круглыми скобками () , а действие устанавливается между фигурными скобками {} . Условие должно быть выполнено для выполнения действия . Если условие выполнено, действие выполняется. Если условие не выполняется, действие не выполняется.

Давайте посмотрим на пример:

Давайте разберемся:
Сначала мы объявляем переменную $ testScore и присваиваем ей значение 93 .
Затем мы объявляем условие If в круглых скобках . В условии указано, что значение $ testScore должно быть больше (-gt) 85 .
Наконец, мы указываем, каким будет Действие, если Условие выполнено. Действие представляет собой сообщение «Учащийся ПРОШЕЛ тест».

Запустив скрипт, мы видим, что условие выполнено, и действие отображается.

Давайте изменим значение $ testScore на другое и снова запустим скрипт:

Мы видим, что, поскольку значение $ testScore не превышает 85, действие не было выполнено.

Несколько операторов If

Мы также можем использовать несколько операторов If , каждое со своим условием.Мы можем использовать это, если хотим, чтобы выполнялись разные действия в зависимости от разных условий. Посмотрим на композицию:

if ( условие ) {
действие
}

if ( условие ) {
действие
}

Вот пример:

Давайте разберемся:
Сначала мы объявляем две переменные:
- $ customerName
- $ age .
Затем мы объявляем 3 условия If :
- Первое условие говорит, что $ age должен быть меньше (-lt) 18 .
- Второе условие гласит, что $ age должен быть больше или равен (-ge) 18, И (-и) меньше (-lt) 65 .
- Третье условие гласит, что возраст $ должен быть больше или равен (-ge) 65 .
Наконец, мы указываем, каким будет действие для каждого условия, если оно выполнено.

Запустив сценарий, мы видим, что, поскольку для $ age установлено значение 34, второе условие выполняется, и второе действие выполняется.

Давайте изменим значение $ age и посмотрим, как выполняются другие действия в зависимости от их условий:

Запустив сценарий, мы видим, что, поскольку для $ age установлено значение 12, первое условие выполняется, и поэтому выполняется первое действие. Запустив сценарий, мы видим, что, поскольку для $ age установлено значение 75, выполняется третье условие, и поэтому выполняется третье действие.

Вложенные операторы If

Мы также можем запускать вложенные операторы If, то есть иметь условия внутри других условий.Это полезно, когда мы хотим, чтобы перед выполнением действия было выполнено несколько условий. Посмотрим на композицию:

if ( condition ) {
if ( condition ) {
action
}
}

А вот пример:

Давайте разберемся:
Сначала мы объявляем 3 переменные:
- $ studentName
- $ class
- $ format
Затем мы объявляем условие If :
- Переменная класса $ должна быть равно (-eq) 'Biology 101' .
Затем мы объявляем другое условие If внутри первого :
- Переменная формата $ должна быть равна (-eq) «Класс» .
Наконец, мы указываем, каким будет действие , если ВСЕ условия выполнены :
- $ studentName назначается профессору Джонсону .

Следует отметить, что , если первое условие не выполняется, второе условие не будет проверяться . То есть, в приведенном выше примере, если $ class не равно «Biology 101», сценарий остановится и действие не будет выполнено.

Вот более длинный пример вложенных операторов If. Мы можем видеть, что существует 2 основных оператора If , с 2 вложенными операторами If каждый .

В зависимости от значений переменных будут выполняться разные действия:

Запустив сценарий, мы видим, что, поскольку для $ class установлено значение «Chemistry 205», а для $ format установлено значение «Classroom», выполняется третье условие, и поэтому выполняется третье действие. Запустив сценарий, мы видим, что, поскольку для $ class установлено значение «Biology 101», а для $ format установлено значение «Online», второе условие выполняется, и второе действие выполняется.

Вот и все, простое руководство по операторам PowerShell If .

Нравится:

Нравится Загрузка ...

Использование тернарного условного оператора в PowerShell 7

PowerShell 7.0 Beta 4 представляет знакомую основу большинства языков программирования - тернарный оператор. Использование гораздо более короткого синтаксиса для логики if / then делает определение условных значений для свойств более кратким и легким для чтения. Это, конечно, не единственный вариант использования, это просто тот, с которым я часто сталкиваюсь, и в котором тернарный оператор творит чудеса, упрощая.

Кроме того, если вы интенсивно пользуетесь командной строкой, более короткий синтаксис поможет вам быстро протестировать код и функциональность прототипа. Другой отличный пример - использование тернарного оператора в конкатенации строк или использование оператора формата. Более короткий синтаксис означает, что для обычных простых условий вы можете объединить несколько строк кода в одну и значительно повысить общую читаемость.

Использование логики If / Then

Допустим, вы хотите провести сравнение, которое затем определит конкретное действие, которое необходимо предпринять.Оператор if с потенциальным оператором else - обычный подход к этому варианту использования. Как и в большинстве языков, вы берете одно значение и с помощью оператора сравнения сравниваете его с другим значением, чтобы вывести логическое значение, которое означает «истина» или «ложь». Как показано ниже, простой оператор if / then сравнивает значения $ a и $ b и обнаруживает, что они неравны, и в этом случае выдает $ false .

Рекламный контент

Прочтите лучшие личные и бизнес-технологии без рекламы

Быть в курсе того, что происходит в технологическом секторе, важно для вашей карьеры и личной жизни, но реклама может отвлекать от чтения новостей.С Thurrott Premium вы можете наслаждаться лучшими технологиями без назойливой рекламы.

Узнать больше

  $ а = 1
$ b = 2

if ($ a -eq $ b) {
    $ правда
} еще {
    $ false
}

# Вывод: $ false
  

Хотя сравнение в данном случае простое. Вы, безусловно, можете усложнить задачу, сравнивая несколько условий и имея несколько предложений if / else. Таким образом можно оценить сложные условия в зависимости от того, что вам нужно делать.Ниже приведен пример нескольких условий и операторов if / else.

  если (
    ($ user -eq 'Joe' -and $ inactive -eq $ true) -или
    ($ user -eq 'Sally' -and $ inactive -eq $ true)
) {
    $ пользователь | Set-UserState -Inactive $ false
} elseif ($ user -eq 'Mary' -and ($ inactive -eq $ true -or $ expires -eq $ true)) {
    $ пользователь | Set-UserState -Inactive $ false
    $ пользователь | Set-UserState -Expires $ false
} еще {
    «Нет неактивных пользователей»
}
  

Знакомство с тернарным оператором

Вы можете спросить себя, почему бы просто не использовать обычный старый оператор if / then, он кажется кратким и достаточно простым в использовании.Что ж, if / then отлично подходит для многих вещей, но когда вам нужно определить значения большого количества свойств, было бы намного лучше иметь более сжатый встроенный синтаксис, который может напрямую присваивать значения свойствам по мере необходимости. Во всей красе вот новый Тернарный оператор, рефакторинг вышеприведенного примера:

($ a-экв. $ B)? $ true: $ false

Хотя это просто, давайте рассмотрим пример, где мы сможем увидеть, как это действительно хорошо. Например, при определении настраиваемых объектов предположим, что вы хотите назначить значения свойств условно.Вы можете определить множество длинных операторов if или встроить их назначение с помощью нового тернарного оператора.

Старый способ, с использованием множества операторов if / then для определения значений свойств.

  if ($ a -eq $ b) {
    $ property1 = $ true
} еще {
    $ property1 = $ false
}

if ($ test) {
    $ property2 = "Здесь"
} еще {
    $ property2 = "Там"
}

if (Test-Path $ Path) {
    $ property3 = $ true
} еще {
    $ property3 = $ false
}

[PSCustomObject] @ {
    "Property1" = $ property1
    "Property2" = $ property2
    "Property3" = $ property3
}
  

Вот обновленная версия с использованием новой оболочки PowerShell 7.0 Синтаксис тернарного оператора. Как видите, печатать стало намного меньше!

  [PSCustomObject] @ {
    "Свойство1" = (($ a -eq $ b)? $ True: $ false)
    "Property2" = (($ test)? "Здесь": "Там")
    "Property3" = ((Test-Path $ Path)? $ True: $ false)
}
  

Какие еще примеры из реальной жизни? Вот лишь некоторые из наиболее распространенных условий повседневного использования.

  • $ IsCoreCLR? 'pwsh': 'powershell'
  • (Test-Path $ path)? «Путь существует»: «Путь не найден»
  • $ env: CI -eq 'true'? '-Tag CI': '-Tag Daily'

Когда не работает тернарный оператор?

Я показал пример ранее, объясняя более сложный пример с использованием нескольких условий и операторов if / else.Как вы уже догадались, тернарный оператор обычно предназначен для довольно простых ситуаций. Он может не подходить для гораздо более сложного набора условий, требующих выполнения нескольких строк кода. Возможно, вам удастся кое-что из этого запихнуть, но, вероятно, в конечном итоге это будет не так читабельно.

Как и все языковые функции, у каждой из них есть свои лучшие сценарии использования, и тернарный оператор в этом случае ничем не отличается. Есть причина, по которой его иногда называют встроенным оператором if. Идеально подходят простые лаконичные логические тесты.Все, что больше этого, вероятно, выиграет от использования традиционного оператора if / then.

Не можете использовать PowerShell 7.0?

Возможно, вы не готовы перейти на PowerShell 7.0 или ваша организация еще не может выполнить обновление. Было несколько вариантов альтернативных синтаксисов, но одним из моих любимых является следующий синтаксис, описанный здесь. Вы можете увидеть, как его использовать, ниже.

  # Условие для проверки
$ CarColor = 'Синий'

# Hashtable с $ true и $ false в качестве ключей и последующими результатами в качестве значений
@ {$ true = 'Цвет машины синий'; $ false = 'Цвет машины не синий'

# Поиск, который проверяет условие и выводит соответствующее значение
[$ CarColor -eq 'Синий']
  

Даже если вы не можете перейти на PowerShell 7.0, но мы надеемся, что этот метод должен продемонстрировать, насколько удобным может быть такой более лаконичный синтаксис.

Используйте тернарный оператор сегодня

На момент написания этой статьи вы можете установить PowerShell 7.0 в его бета-форме, и вскоре она станет общедоступной. Теперь, когда вы увидели, как легко реорганизовать код, используя более короткий синтаксис, надеюсь, вы обнаружите множество случаев, когда это не только упростит ваш код, но и значительно ускорит разработку новых функций!

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *