Операторы powershell: Операторы Windows PowerShell | Windows IT Pro/RE

Логические операторы и управляющие инструкции в PowerShell, часть 1

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

За проверку истинности/ложности в языке отвечают логические операторы, а за действия в том или ином случае управляющие инструкции.

Логических операторов в PowerShell, в общем-то, не так уж и много.

ОператорЗначениеПример использования (возвращается значение $True)
-andИ(1 -eq 1) -and (2 -eq 2)
-orИЛИ(1 -ne 2) -or (1 -eq 2)
-notНЕ-not (1 -gt 2)
!НЕ!(1 -gt)

В примерах использованы операторы сравнения. Если Вы их подзабыли, можно подсмотреть их здесь.

Что касается управляющих инструкций, то это уже более широкая тема, на которой нужно остановиться подробнее.

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

If и Else знакомы всем, кто имеет хотя бы поверхностное понятие о языках программирования. В Windows PowerShell при помощи If можно выполнить код только в том случае, если условие возвращает значение $True. В противном случае будет выполняться код после Else. Можно поэтапно проверять несколько условий при помощи ElseIf.

В общем виде всё это выглядит так:

If (условие1)

   {блок_кода1}

[ElseIf (условие2)

   {блок_кода2}]

[Else

   {блок_кода3}]

Сначала проверяется условие1, если оно верно (значение $True), то выполняется блок_кода1. Если условие1 ложно (значение $False), то проверяется условие2. Его истинность приведет к исполнению блока_кода2, а ложность — блока_кода3.

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

Посмотрим, как это работает. Запишем код следующего содержания:

$a=3
If ($a -eq 5) {
'a равно 5'
}
Else {'a не равно 5'}

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

Цикл While

Перейдем к циклам. Цикл While является самым простым из доступных в PowerShell. В нем цикл будет выполняться до тех пор, пока условие имеет значение $True. В общем виде While выглядит так:

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

Приведем пример такого цикла.

While ($b -ne 3)
{
$b++
$b
}

Цикл While

Думаю, здесь всё интуитивно понятно. При каждом наше переменная $b увеличивается на 1 до тех пор, пока не станет равной 3.

Цикл Do … While

В целом, это почти то же самое, но с одним отличием — условие проверяется не до блока команд, а после.

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

$c=5
Do {$c++; $c} While ($c -ne 10)

Цикл Do … While

Цикл For

Данный цикл является циклом со счетчиком. Такой цикл обычно применяется для выполнения определенных действий с каждым из элементов какого-либо массива. В общем виде цикл For выглядит так:

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

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

условие — часть инструкции, которая может принимать значение $True или $False. Проверка условия проводится при каждой итерации цикла. При значении $True выполняется блок_команд.

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

блок_команд — одна или несколько команды, выполняемых, когда значение условия равно $True.

Собственно, вот простой пример.

For ($d=7; $d -lt 12; $d++) {$d}

Цикл For

Пока значение переменной $d будет меньше 12, цикл For будет увеличивать её значение на 1 и выводить нам на экран.

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

Продолжение следует…

Операторы -like, -notlike и -not в PowerShell — sergey vasin

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

Например, так.

Get-Service | Where-Object Description -like "*wsman*"

Или же

Get-Service | Where-Object Description -like "*w?man*"

По умолчанию этот оператор не чувствителен к регистру. То есть, следующие команды будут полностью равнозначными.

Get-Service | Where-Object Description -like "*wsman*"
Get-Service | Where-Object Description -like "*WSman*"
Get-Service | Where-Object Description -like "*WSMAN*"

Если же нам нужно, чтобы оператор -like принимал во внимание регистр рассматриваемых им элементов, то есть, был, что называется, case-sensitive, мы можем указать его как -clike

Get-Service | Where-Object Description -clike "*wsman*"

С другой стороны, чтобы развеять все сомнения в том, что оператор к регистру не чувствителен, то есть, case-insensitive, мы можем указать его как -ilike.

Get-Service | Where-Object Description -ilike "*wsman*"

Кроме того, в PowerShell существует и оператор, обратный вышеуказанному, -notlike.

Get-Service | Where-Object StartupType -notlike "Auto*"

Который, в свою очередь, точно так же обладает двумя вариациями: -cnotlike и -inotlike.

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

Если мы передаем ему скалярное значение, то результатом будет объект типа bool, то есть True или False.

"Some string." -like "*string*"
True
"Some string." -like "*integer*"
False

Если же мы передадим ему массив, результатом будут те элементы массива, которые соответствуют заданному условию.

"Winter", "Spring", "Summer", "Autumn" -like "*er"
Winter
Summer

Кроме простых сравнений операторы -like и -notlike позволяют нам задавать и более сложные условия.

Начнем с того, что получим все службы, которые зависят от Remote Procedure Call (RPC).

Get-Service | Where-Object { $_.RequiredServices.Name -like "RpcSs" } | Select-Object Name, DisplayName, RequiredServices
Name                 DisplayName                             RequiredServices
----                 -----------                             ----------------
AppIDSvc             Application Identity                    {RpcSs, CryptSvc, AppID}
Appinfo              Application Information                 {RpcSs, ProfSvc}
AppVClient           Microsoft App-V Client                  {AppvVfs, RpcSS, AppvStrm, netprofm}
AppXSvc              AppX Deployment Service (AppXSVC)       {rpcss, staterepository}
Audiosrv             Windows Audio                           {AudioEndpointBuilder, RpcSs}
autotimesvc          Cellular Time                           {rpcss}
AxInstSV             ActiveX Installer (AxInstSV)            {rpcss}
BFE                  Base Filtering Engine                   {RpcSs}
BITS                 Background Intelligent Transfer Service {RpcSs}
BrokerInfrastructure Background Tasks Infrastructure Service {DcomLaunch, RpcSs, RpcEptMapper}
. ..

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

Давайте получим службы, работа которых зависит не только от Remote Procedure Call (RPC).

Get-Service | Where-Object { $_.RequiredServices.Name -like "RpcSs" -and $_.RequiredServices.Name -notlike "RpcSs" } | Select-Object Name, DisplayName, RequiredServices
Name                 DisplayName                             RequiredServices
----                 -----------                             ----------------
AppIDSvc             Application Identity                    {RpcSs, CryptSvc, AppID}
Appinfo              Application Information                 {RpcSs, ProfSvc}
AppVClient           Microsoft App-V Client                  {AppvVfs, RpcSS, AppvStrm, netprofm}
AppXSvc              AppX Deployment Service (AppXSVC)       {rpcss, staterepository}
Audiosrv             Windows Audio                           {AudioEndpointBuilder, RpcSs}
BrokerInfrastructure Background Tasks Infrastructure Service {DcomLaunch, RpcSs, RpcEptMapper}
. ..

Теперь же получим те службы, для работы которых требуется только RpcSs.

Get-Service | Where-Object { $_.RequiredServices.Name -like "RpcSs" -and -not ($_.RequiredServices.Name -notlike "RpcSs") } | Select-Object Name, DisplayName, RequiredServices
Name        DisplayName                             RequiredServices
----        -----------                             ----------------
autotimesvc Cellular Time                           {rpcss}
AxInstSV    ActiveX Installer (AxInstSV)            {rpcss}
BFE         Base Filtering Engine                   {RpcSs}
BITS        Background Intelligent Transfer Service {RpcSs}
...

Таким образом, используя комбинации операторов -like, -notlike и -not, мы можем создавать достаточно неординарные запросы.

Понравилось это:

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

Условная логика с оператором PowerShell If

Эта статья обновлена ​​до 2023 года!

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

Не читатель? Посмотрите соответствующий видеоурок!

Не видите видео? Убедитесь, что ваш блокировщик рекламы отключен.

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

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

Понимание синтаксиса инструкции PowerShell If

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

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

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

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

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

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

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

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

Логический поток оператора PowerShell If

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

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

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

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

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

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

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

Если вы проверите только определенное значение, например if ($Value) { } , PowerShell проверит, соответствует ли $Value не является $Null , 0 , $False , пустой строкой или пустым массивом.

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

Single If Condition Example

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

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

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

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

Одно условие оператора If

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

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

 $число = 11
$num-gt 10 ? «$num больше 10» : «$num НЕ больше 10» 

Если синтаксис инструкции с использованием тернарного оператора

Проверка $Null в PowerShell If Statement

Вы можете подумать, что проверка условия $Null простой. Но сторона, на которой вы размещаете значение $Null , важна, так как она может не приводить к одинаковым результатам в разных условиях. Лучше всего всегда помещать условие $Null слева вот так.

 $Null -NE $Value 

Если вы поместите тест $Null в правую часть, а значением в левой части будет список, например массив, то $Null будет действовать как фильтр. Как видно из приведенного ниже примера, если $Null разместить слева, вы получите согласованные логические результаты.

 $Список = @(1,2,2,3,4)
$Список-NE $Нулевой
$Список-EQ $Null
$Null-NE $Null
$Null -EQ $Null 

$Null Условия тестирования для PowerShell If Заявление

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

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

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

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

 Пока ($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} 

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

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

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

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

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

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

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

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

 # Определить пороги в процентах
$ Критический = 20
$ Предупреждение = 70
# Получить всю информацию о фиксированном диске
$diskObj = Get-CimInstance -ClassName CIM_LogicalDisk | Где-Объект {$_.DriveType -eq 3}
# Инициализировать пустой массив, в котором будут храниться окончательные результаты
$finalReport = @()
# Повторить информацию о каждом диске
$diskObj.foreach(
    {
        # Рассчитать процент свободного места
        $percentFree = [int](($_.FreeSpace / $_.Size) * 100)
        # Определяем "Статус"
        если ($percentFree -gt $Warning) {
            $Статус = 'Нормальный'
        }
        elseif ($percentFree -gt $Critical) {
            $Статус = 'Предупреждение'
        }
        elseif ($percentFree -le $Critical) {
            $Статус = 'Критический'
        }
        # Составление свойств объекта для добавления в отчет
        $tempObj = [заказано]@{
            «Буква диска» = $_. DeviceID
            «Имя диска» = $_.VolumeName
            «Общее пространство (ГБ)» = [int]($_.Size / 1 ГБ)
            'Свободное пространство (ГБ)' = [int]($_.FreeSpace / 1 ГБ)
            'Свободное пространство (%)' = "{0}{1}" -f [int]$percentFree, '%'
            'Статус' = $Статус
        }
        # Добавляем объект в итоговый отчет
        $finalReport += New-Object psobject -property $tempObj
    }
)
вернуть $finalReport 

Вы также можете присвоить результат условия if/else переменной, т. е. $Status = if ($percentFree -gt $Warning) { 'Normal' } , чтобы сделать условие короче.

После сохранения сценария проверьте его, вызвав его имя в 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 не должна быть пустой или нулевой. В противном случае для $abortFlag будет установлено значение 1.
  • Если значение $abortFlag равно 1, сценарий завершится в этот момент и не будет продолжаться.
  • Если значение $abortFlag равно 0, сценарий продолжается до конца.

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

 $SendEmail = $true
$От = ""
$К = ""
$ CCEnabled = $ истина
$CC = ""
$BCCEnabled = $true
$BCC = ""
$ абортфлаг = 0
если ($SendEmail) {
    если (!$От) {
        Write-Host "[From] отсутствует" - ForegroundColor Red
        $ абортфлаг = 1
    }
    если (!$К) {
        Write-Host "[To] отсутствует" -ForegroundColor Red
        $ абортфлаг = 1
    }
    если ($ CCEnabled) {
        если (!$CC) {
            Write-Host "[CC] отсутствует" - ForegroundColor Red
            $ абортфлаг = 1
        }
    }
    если ($BCCEnabled) {
        если (!$BCC) {
            Write-Host "[BCC] отсутствует" - ForegroundColor Red
            $ абортфлаг = 1
        }
    }
    если ($abortFlag -eq 1) {
        Write-Host "Сработал флаг прерывания. Выйти из сценария. " -Красный цвет переднего плана
        перерыв
    }
    еще {
        Write-Host "Ваша электронная почта будет отправлена ​​с этого адреса $From" -ForegroundColor Green
        Write-Host "И будет отправлено следующим людям:" -ForegroundColor Green
        Write-Host "To: $To" -ForegroundColor Green
        если ($CCEnabled -и $CC) {
            Write-Host "CC: $CC" -ForegroundColor Green
        }
        если ($BCCEnabled -и $BCC) {
            Write-Host "BCC: $BCC" - ForegroundColor Green
        }
    }
} 

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

Пример вложенного If-Else

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

 $SendEmail = $true
$From = "[электронная почта защищена]"
$To = "[электронная почта защищена]"
$ CCEnabled = $ истина
$CC = "[электронная почта защищена]"
$BCCEnabled = $true
$BCC = "[электронная почта защищена]"
---SNIP--- 

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

Другой пример вложенного If-else

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

Резюме

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

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

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

Дополнительная информация

  • О программе If
  • Назад к основам: цикл foreach PowerShell

активный каталог — операторы Powershell

 while(($dois = Read-Host 'Server Lookup Y/N') -eq 'n') {
    переключатель ($ dois) {
        'Д' {
            делать {
                Clear-Host
                пытаться {
                    $SN = Read-Host 'Введите имя сервера'
                    $lookup = Get-ADComputer -identity $SN -Properties memberof, dnshostname | Select-Object dnshostname, memberof |
                        ConvertTo-Json-Глубина 100 | Исходящий файл '. \extract.json' | код .\extract.json
                }
                catch { Write-Warning "$SN не существует, введите допустимое имя сервера." }
            }до($поиск)
        }
        'N' {Write-Host -ForegroundColor cyan 'Конечный сценарий'}
    }
    Выход
}
 

Мне кажется, что я слишком долго работал над этим, и это выжигает меня. Сценарий предназначался для использования в качестве инструмента для извлечения некоторых свойств сервера, а затем экспорта его в файл JSON, он работал нормально, но не был интерактивным, и именно здесь я начал расширяться и теперь возникли проблемы, я добавил пользователя вариант для Y/N, и когда я выбираю N, сценарий выполняется, как и предполагалось, но проблема, когда они выбирают вариант Y, заключается в том, что в конце экспорта оболочка продолжает просить ввести имя сервера, но я хочу для оболочки чтобы представить параметр поиска сервера y / n, как при первоначальном запуске сценария, также предупреждение не срабатывает, когда они вводят неправильное имя сервера.

  • powershell
  • активный каталог

2

Основная проблема с вашим текущим кодом, до ($lookup) будет бесконечно повторяться, потому что $lookup всегда будет нулевым, потому что Out-File не производит никакого вывода. Вы можете попробовать следующее, используя логическое значение в конце блока try , если Get-ADComputer не сработало, вы можете убедиться, что в файл есть вывод.

 $поиск = $false
переключатель ($ dois) {
    'Д' {
        делать {
            пытаться {
                $SN = Read-Host 'Введите имя сервера'
                Get-ADComputer -identity $SN -Properties memberof, dnshostname |
                    Select-Object dnshostname, memberof |
                    ConvertTo-Json-Глубина 100 |
                    Исходящий файл '.\extract.json'
                # сигнал для остановки цикла `do`
                $поиск = $истина
            }
            ловить {
                Запись-предупреждение «$SN не существует, введите действительное имя сервера». 
            }
        }
        до ($ поиск)
    }
    'Н' {
        ....
    }
}
 

Лично я бы использовал что-то вроде этого: .PromptForChoice очень помогает убедиться, что пользователь выбрал правильный вариант ( Y или N ) и использовать оператор try / catch для проверки существования компьютера. Если командлету не удается найти компьютер с предоставленными входными данными, ничего не экспортируется. Также стоит отметить, что в случае, если пользователь решит продолжать запрашивать больше серверов, extract.json будет перезаписываться на каждой итерации цикла (при условии, что компьютер может быть найден).

 # мы должны войти в этот цикл? если `Нет`, то скрипт просто завершает работу
while($Host.UI.PromptForChoice('', 'Поиск сервера?', ('&Да', '&Нет'), 0) -eq 0) {
пытаться {
$sn = Read-Host 'Введите имя сервера'
Get-ADComputer $sn -Properties memberof, dnshostname |
Select-Object dnshostname, memberof |
ConvertTo-Json-Глубина 100 |
Set-Content '.