сведения об операторах сравнения — PowerShell
- Чтение занимает 11 мин
В этой статье
Краткое описание
Операторы сравнения в PowerShell могут либо сравнивать два значения, либо фильтровать элементы коллекции по входному значению.
Подробное описание
Операторы сравнения позволяют сравнивать значения или находить значения, соответствующие указанным шаблонам. PowerShell содержит следующие операторы сравнения:
Тип | Оператор | Тест сравнения |
---|---|---|
Равенство | -eq | equals |
-ne | не равно | |
-gt | больше чем | |
-ge | больше или равно | |
-lt | меньше чем | |
-le | меньше или равно | |
Matching | -like | строка соответствует шаблону шаблона |
-notlike | строка не соответствует шаблону шаблона | |
-match | строка соответствует шаблону регулярного выражения | |
-notmatch | строка не соответствует шаблону регулярного выражения | |
Замена | -Replace | заменяет строки, соответствующие шаблону регулярного выражения |
Containment | -contains | Коллекция содержит значение |
-notcontains | Коллекция не содержит значение | |
-in | значение находится в коллекции | |
-notin | значение не находится в коллекции | |
Тип | — имеет | Оба объекта имеют одинаковый тип |
-IsNot | объекты имеют разные типы |
Общие возможности
По умолчанию все операторы сравнения не учитывают регистр. Чтобы выполнить оператор сравнения с учетом регистра, добавьте c
после -
. Например, -ceq
— это версия с учетом регистра -eq
. Чтобы сделать явный учет регистра нечувствительным, добавьте i
после -
. Например, -ieq
является явной версией без учета регистра
.
Если входные данные оператора являются скалярным значением, оператор возвращает логическое значение. Если входные данные являются коллекцией, оператор возвращает элементы коллекции, соответствующие правому значению выражения. Если в коллекции нет совпадений, операторы сравнения возвращают пустой массив. Например:
$a = (1, 2 -eq 3)
$a.GetType().Name
$a.Count
Object[]
0
Существует несколько исключений:
- Операторы включения и типа всегда возвращают логическое значение.
-replace
Оператор возвращает результат замены-match
Операторы и-notmatch
также заполняют$Matches
автоматическую переменную, если левый операнд выражения не является коллекцией.
Операторы равенства
-eq и -ne
Если левая часть является скалярной, -eq
возвращает значение true , если правая часть является точным совпадением, в противном случае -eq
возвращает значение false. -ne
выполняет противоположный; При совпадении обоих сторон возвращается значение false . в противном случае -ne
возвращает значение true.
Пример:
2 -eq 2 # Output: True 2 -eq 3 # Output: False "abc" -eq "abc" # Output: True "abc" -eq "abc", "def" # Output: False "abc" -ne "def" # Output: True "abc" -ne "abc" # Output: False "abc" -ne "abc", "def" # Output: True
Если левая часть является коллекцией, -eq
возвращает элементы, соответствующие правой части, и -ne
отфильтровывает их.
Пример:
1,2,3 -eq 2 # Output: 2
"abc", "def" -eq "abc" # Output: abc
"abc", "def" -ne "abc" # Output: def
Эти операторы обрабатывают все элементы коллекции. Пример:
"zzz", "def", "zzz" -eq "zzz"
zzz
zzz
Операторы равенства принимают любые два объекта, а не только скаляр или коллекция. Однако результат сравнения не гарантируется для конечного пользователя. В следующем примере показана эта ошибка.
class MyFileInfoSet {
[String]$File
[Int64]$Size
}
$a = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$b = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032}
$a -eq $b
False
В этом примере мы создали два объекта с одинаковыми свойствами. Однако результат проверки равенства имеет значение false , так как они являются разными объектами. Чтобы создать сравнимые классы, необходимо реализовать System. IEquatable <T> в своем классе. В следующем примере демонстрируется частичная реализация класса Equals()
Метод возвращает значение true , если свойства File и size двух объектов мифилеинфосет одинаковы.
class MyFileInfoSet : System.IEquatable[Object] { [String]$File [Int64]$Size [bool] Equals([Object] $obj) { return ($this.File -eq $obj.File) -and ($this.Size -eq $obj.Size) } } $a = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032} $b = [MyFileInfoSet]@{File = "C:\Windows\explorer.exe"; Size = 4651032} $a -eq $b
True
Заметным примером сравнения произвольных объектов является определение того, равны ли они значению NULL. Но если необходимо определить, является ли переменная $null
, необходимо разместить $null
в левой части оператора равенства. Размещение с правой стороны не делает то, что вы ждете.
Например, пусть $a
массив содержит элементы со значением NULL:
$a = 1, 2, $null, 4, $null, 6
Следующие тесты $a
не имеют значение null.
$null -ne $a
True
Однако в следующем примере фильтрами определенными все элементы NULL из
:
$a -ne $null # Output: 1, 2, 4, 6
1
2
4
6
-gt,-GE,-lt и-Le
-gt
, -ge
, -lt
и -le
ведут себя точно так же. Если обе стороны скалярны, они возвращают значение true или false в зависимости от того, как сравниваются две стороны:
Оператор | Возвращает значение true, если… |
---|---|
-gt | Левая часть больше |
-ge | Левая часть больше или равна |
-lt | Левый край меньше |
-le | Левая часть меньше или равна |
В следующих примерах все инструкции возвращают значение true.
8 -gt 6 # Output: True
8 -ge 8 # Output: True
6 -lt 8 # Output: True
8 -le 8 # Output: True
Примечание
В большинстве языков программирования оператор «больше» имеет значение >
. В PowerShell этот символ используется для перенаправления. Дополнительные сведения см. в разделе about_Redirection.
Если левая часть является коллекцией, эти операторы сравнивают каждый элемент коллекции с правой стороны. В зависимости от логики они либо сохраняют, либо отклоняют элемент.
Пример:
$a=5, 6, 7, 8, 9 Write-Output "Test collection:" $a Write-Output "`nMembers greater than 7" $a -gt 7 Write-Output "`nMembers greater than or equal to 7" $a -ge 7 Write-Output "`nMembers smaller than 7" $a -lt 7 Write-Output "`nMembers smaller than or equal to 7" $a -le 7
Test collection:
5
6
7
8
9
Members greater than 7
8
9
Members greater than or equal to 7
7
8
9
Members smaller than 7
5
6
Members smaller than or equal to 7
5
6
7
Эти операторы работают с любым классом, реализующим System. IComparable.
Примеры:
# Date comparison [DateTime]'2001-11-12' -lt [DateTime]'2020-08-01' # True # Sorting order comparison 'a' -lt 'z' # True; 'a' comes before 'z' 'macOS' -ilt 'MacOS' # False 'MacOS' -ilt 'macOS' # False 'macOS' -clt 'MacOS' # True; 'm' comes before 'M'
В следующем примере показано, что на клавиатуре QWERTY для американского типа «а» нет символа, который сортируется после «a».’,’&’,’*’,'(‘,’)’,’_’,’+’,’-‘,’=’, ‘{‘,’}’,'[‘,’]’,’:’,’;’,'»‘,»»,’\’,’|’,’/’,’?’,’.’,’>’,’,’,'<‘ $a -gt ‘a’ # Output: Nothing
Если две стороны операторов не являются достаточно сравнимыми, эти операторы вызывают неустранимую ошибку.
Соответствующие операторы
Операторы сопоставления ( -like
,, -notlike
-match
и -notmatch
) находят элементы, которые соответствуют или не соответствуют указанному шаблону. Шаблон для -like
и -notlike
*
, ?
и [ ]
), а -match
также -notmatch
принимает регулярное выражение (Regex).Синтаксис выглядит следующим образом.
<string[]> -like <wildcard-expression>
<string[]> -notlike <wildcard-expression>
<string[]> -match <regular-expression>
<string[]> -notmatch <regular-expression>
Если входные данные этих операторов являются скалярным значением, они возвращают логическое значение. Если входные данные являются коллекцией значений, операторы возвращают все совпадающие элементы. Если в коллекции нет совпадений, операторы возвращают пустой массив.
-Like и-notlike
-like
и -notlike
ведут себя аналогично -eq
и -ne
, но правая часть может быть строкой, содержащей подстановочные знаки.
Пример:
"PowerShell" -like "*shell" # Output: True
"PowerShell" -notlike "*shell" # Output: False
"PowerShell" -like "Power?hell" # Output: True
"PowerShell" -notlike "Power?hell" # Output: False
"PowerShell" -like "Power[p-w]hell" # Output: True
"PowerShell" -notlike "Power[p-w]hell" # Output: False
"PowerShell", "Server" -like "*shell" # Output: PowerShell
"PowerShell", "Server" -notlike "*shell" # Output: Server
-Match и-notmatch
-match
и -notmatch
используют регулярные выражения для поиска шаблона в левой части значений.Power\w+’
# Output: PowerShell «Rhell», «Chell», «Mel», «Smell», «Shell» -match «hell»
# Output: Rhell, Chell, Shell «Bag», «Beg», «Big», «Bog», «Bug» -match ‘b[iou]g’
#Output: Big, Bog, Bug «Bag», «Beg», «Big», «Bog», «Bug» -notmatch ‘b[iou]g’
#Output: Bag, Beg
-match
и -notmatch
поддерживают регулярные выражения группы записи. Каждый раз, когда они выполняются на скалярном входе, -match
результат имеет значение true или -notmatch
результат имеет значение false, они перезаписывают $Matches
автоматическую переменную. $Matches
— Это хэш-таблица , которая всегда содержит ключ с именем «0», в котором сохраняется все совпадение.
Если регулярное выражение содержит группы захвата, $Matches
содержит дополнительные ключи для каждой группы.
Пример:
$string = 'The last logged on user was CONTOSO\jsmith'
$string -match 'was (?<domain>.+)\\(?<user>.+)'
$Matches
Write-Output "`nDomain name:"
$Matches.domain
Write-Output "`nUser name:"
$Matches.user
True
Name Value
---- -----
domain CONTOSO
user jsmith
0 was CONTOSO\jsmith
Domain name:
CONTOSO
User name:
jsmith
Если -match
результат равен false или -notmatch
результат имеет значение true или если входные данные являются коллекцией, $Matches
Автоматическая переменная не перезаписывается. Следовательно, он будет содержать ранее заданное значение или $null
Если переменная не была задана. При ссылке $Matches
после вызова одного из этих операторов рассмотрите возможность проверки того, что переменная была задана текущим вызовом оператора с помощью оператора Condition.
Пример:
if ("<version>1.0.0</version>" -match '<version>(.*?)</version>') {
$Matches
}
Дополнительные сведения см. в разделе about_Regular_Expressions и about_Automatic_Variables.
Оператор замены
Замена с помощью регулярных выражений
Например -match
, -replace
оператор использует регулярные выражения для поиска указанного шаблона. Но в отличие от -match
он заменяет совпадения другим указанным значением.
Синтаксис:
<input> -replace <regular-expression>, <substitute>
Оператор заменяет все или часть значения указанным значением с помощью регулярных выражений. Оператор можно использовать для многих административных задач, таких как переименование файлов. Например, следующая команда изменяет расширения имен файлов всех .txt
файлов на .log
:
Get-ChildItem *.txt | Rename-Item -NewName { $_.name -replace '\.txt$','.log' }
По умолчанию -replace
оператор не учитывает регистр.(?<DomainName>[\w-.]+)\\(?<Username>[\w-.]+)$’
$ReplaceExp = ‘${Username}@${DomainName}’ ‘Contoso.local\John.Doe’ -replace $SearchExp,$ReplaceExp
[email protected]
Предупреждение
Этот $
символ имеет синтатик роли в PowerShell и в регулярных выражениях:
- В PowerShell между двойными кавычками они обозначают переменные и действуют как операторы части выражения.
- В строках поиска регулярных выражений это означает конец строки.
- В строках подстановки Regex он означает захваченные группы. Не забудьте поместить регулярные выражения в одинарные кавычки или вставить
`
символ обратной черты () перед ними.
Например:
$1 = 'Goodbye'
'Hello World' -replace '(\w+) \w+', "$1 Universe"
# Output: Goodbye Universe
'Hello World' -replace '(\w+) \w+', '$1 Universe'
# Output: Hello Universe
$$
в регулярном выражении обозначает литерал $
. $$
В строке подстановки, чтобы включить литерал $
в результирующую замену. Например:
'5.72' -replace '(.+)', '$ $1' # Output: $ 5.72
'5.72' -replace '(.+)', '$$$1' # Output: $5.72
'5.72' -replace '(.+)', '$$1' # Output: $1
Дополнительные сведения см. в разделе about_Regular_Expressions и подстановки в регулярных выражениях.
Подстановка в коллекции
Если <input>
-replace
оператор to является коллекцией, PowerShell применяет замену к каждому значению в коллекции. Например:
"B1","B2","B3","B4","B5" -replace "B", 'a'
a1
a2
a3
a4
a5
Замена блоком сценария
В PowerShell 6 и более поздних версиях -replace
оператор также принимает блок сценария, который выполняет замену. Блок скрипта выполняется один раз для каждого совпадения.
Синтаксис:
<String> -replace <regular-expression>, {<Script-block>}
В блоке скрипта используйте $_
автоматическую переменную для доступа к заменяемому входному тексту и другим полезным сведениям. Тип класса этой переменной — System. Text. RegularExpressions. Match.
В следующем примере каждая последовательность из трех цифр заменяется эквивалентными символами. Блок скрипта выполняется для каждого набора из трех цифр, которые необходимо заменить.
"072101108108111" -replace "\d{3}", {return [char][int]$_.Value}
Hello
Операторы вложения
Операторы вложения ( -contains
, -notcontains
, -in
и -notin
) похожи на операторы равенства, за исключением того, что они всегда возвращают логическое значение, даже если входные данные являются коллекцией. Эти операторы прекращают сравнение, как только они обнаруживают первое совпадение, в то время как операторы равенства оценивают все входные элементы. В очень больших коллекциях эти операторы возвращают более быстрый результат, чем операторы равенства.
Синтаксис:
<Collection> -contains <Test-object>
<Collection> -notcontains <Test-object>
<Test-object> -in <Collection>
<Test-object> -notin <Collection>
-Contains и-notcontains
Эти операторы определяют, включает ли набор определенный элемент. -contains
Возвращает значение true , если правая часть (тестовый объект) соответствует одному из элементов в наборе. -notcontains
Вместо этого возвращает значение false. Если объект теста является коллекцией, эти операторы используют равенство ссылок, т. е. они проверяют, является ли один из элементов набора одним и тем же экземпляром тестового объекта.
Примеры:
"abc", "def" -contains "def" # Output: True
"abc", "def" -notcontains "def" # Output: False
"Windows", "PowerShell" -contains "Shell" # Output: False
"Windows", "PowerShell" -notcontains "Shell" # Output: True
"abc", "def", "ghi" -contains "abc", "def" # Output: False
"abc", "def", "ghi" -notcontains "abc", "def" # Output: True
Более сложные примеры:
$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
"ContosoDHCP","ContosoWSUS"
$thisComputer = "ContosoDC2"
$DomainServers -contains $thisComputer
# Output: True
$a = "abc", "def"
"abc", "def", "ghi" -contains $a # Output: False
$a, "ghi" -contains $a # Output: True
-in и-notin
-in
Операторы и -notin
были введены в PowerShell 3 в качестве синтаксических обратных -contains
операторов и -notcontains
. -in
Возвращает значение true , если левая <test-object>
часть соответствует одному из элементов в наборе. -notin
Вместо этого возвращает значение false . Если тестовый объект является набором, эти операторы используют равенство ссылок для проверки того, является ли один из элементов набора одним и тем же экземпляром тестового объекта.
Следующие примеры выполняют те же действия, что и примеры для -contains
и -notcontains
Do, но они записываются с помощью -in
и -notin
.
"def" -in "abc", "def" # Output: True
"def" -notin "abc", "def" # Output: False
"Shell" -in "Windows", "PowerShell" # Output: False
"Shell" -notin "Windows", "PowerShell" # Output: True
"abc", "def" -in "abc", "def", "ghi" # Output: False
"abc", "def" -notin "abc", "def", "ghi" # Output: True
Более сложные примеры:
$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS",
"ContosoDHCP","ContosoWSUS"
$thisComputer = "ContosoDC2"
$thisComputer -in $DomainServers
# Output: True
$a = "abc", "def"
$a -in "abc", "def", "ghi" # Output: False
$a -in $a, "ghi" # Output: True
Сравнение типов
Операторы сравнения типов ( -is
и -isnot
) используются для определения того, является ли объект конкретным типом.
Синтаксис:
<object> -is <type-reference>
<object> -isnot <type-reference>
Пример:
$a = 1
$b = "1"
$a -is [int] # Output: True
$a -is $b.GetType() # Output: False
$b -isnot [int] # Output: True
$a -isnot $b.GetType() # Output: True
СМ. ТАКЖЕ
Операторы сравнения Powershell | FixMyPC
С помощью операторов сравнения в powershell мы можем выяснить содержит ли значение какую-то строку, равно, больше или меньше какого-то значения и т.д. Обычно мы привыкли использовать <, >, !=, = и другие символы, но в powershell все работает иначе.
У нас есть такие операторы в powershell:
Операторы возвращают True, если утверждение верно и False, если нет
Оператор сравнения Powershell EQ
На примере сравнения дат:
(Get-Date).Day -eq 8
Вернет True, т.к. сегодня 8-ой день месяца и оба значения равны. Даты, за исключением дня месяца, должны быть в специальном формате datetime.
Или иначе:
(Get-Date) -eq ((Get-Date).AddDays(-15))
Вернет False т.к. слева сегодняшняя дата с права 15 дней до.
Так мы можем найти файлы, которые были 7 дней назад:
Get-ChildItem | where {$_.CreationTime -eq ((Get-Date).AddDays(-7))}
Оператор сравнения Powershell LT и LE
Опять же сравним даты powershell:
$today = Get-Date
$next_week = Get-Date -Day 15 -Year 2019 -Month 7
$today -lt $next_week
Вернет False т.к. дата справа меньше чем слева.
$last_year = Get-Date -Year 2018
$today_year = (Get-Date).Year
$last_year.Year -lt $today_year
Вернет True.
Оператор LE в отличие от LT вернет True так же, если значение равно:
2018 -le 2018
Так мы найдем файлы, которые были созданы менее чем 7 дней назад или созданные в 18 день месяца:
Get-ChildItem | where {$_.CreationTime -le ((Get-Date).AddDays(-7)) -or ($_.CreationTime).Day -eq 18 }
Оператор сравнения Powershell GT и GE
Работает аналогично:
1 -GT 2
Вернет False т.к. 1 не больше 2
1 -GE 1
Вернут True т.к. мы проверяем еще и равенство.
"Four".length -GE 4
Тоже вернет True т.к. длина строки Four 4.
На примере поиска процессов:
Get-Process | where {$_.Processname -eq "svchost" -and $_.CPU -gt 5}
Т.е. мы ищем процессы, где имя равно svchost и значение CPU больше 5.
Оператор сравнения Powershell Like и Match
Like от Match отличается в тем, что в Like мы ищем строчки используя Wildcardr *, а в Match мы можем использовать регулярные выражения:
"fixmypc" -like "*fix*"
Вернет True, т.к. * говорит что слева и справа может находиться еще символы.
Если добавить букву c, получится -clike, что значит Case-Sensetive (чувствителен к регистру). В этом случае буква А и а будут разными. По умолчанию, в windows регистр не имеет значение:
"Fixmypc" -clike "fix"
Так мы уберем из вывода все процессы, которые не содержат sv в начале и t в конце строки:
Get-Process | where {$_.Name -notlike "sv*t"}
В этом случае вернется True:
"TestWord" -match "estW"
А в этом только строковые значения:
"Один", 1 ,"два", 2, "три", 3 -match "[А-я]"
В этом только значения, где есть числа от 2 до 9:
"Один1", 1, "два2", 2, "три3", 3 -match "[2-9]"
…
Теги: #powershell
Почему равно » — eq «в PowerShell, а не просто»=»?
Конструкции -ne
, -eq
и -gt
выглядят по меньшей мере странно.
if ($true -eq $true){}
но не
if ($true = $true){}
Каково же объяснение?
powershell syntaxПоделиться Источник Mike Chaliy 23 апреля 2012 в 23:59
3 ответа
- Почему ‘true’ равно $true
Я не совсем уверен, является ли этот точный вопрос дубликатом, но я не смог найти свой конкретный вопрос в stackoverflow, так что, думаю, это не так. $true -это логический тип: ($true).getType() IsPublic IsSerial Name BaseType ——— ——— —- ——— True True Boolean System.ValueType…
- Почему этот маленький фрагмент PowerShell не возвращает false?
как раз в тот момент, когда я думал, что знаю PowerShell, мне стало интересно, что здесь происходит. Compare-Object работает для обоих этих примеров, и второй пример вернет различия, если я не проверю $null,, но у меня самое плохое время для простого сравнения. Почему второй пример не возвращает…
38
В основном ответ заключается в том, что именно так Unix сделал это навсегда. Конечно, если вы напишете несколько сценариев Bash, это то, что вы будете использовать, и на самом деле приятно, когда ваши знания синтаксиса PowerShell передаются один за другим в Bash.
На него подробно дан ответ в книге Брюса Пайетта Windows PowerShell in Action , Второе издание (Kindle Location 3391).
Давайте поговорим о самом спорном дизайнерском решении в мире. PowerShell язык.
И победитель: почему, черт возьми, мы не использовали обычные символы для сравнения, такие как >, >=, <, <=, ==, и !=?
Ответ заключается в том, что символы > и < используются для перенаправления вывода. Потому что PowerShell-это shell, и все shell языка за последние 30 лет использовали > и < для перенаправления ввода-вывода, люди ожидали, что PowerShell должен делать то же самое. Во время первой публичной бета-версии PowerShell эта тема вызвала дискуссии, которые продолжались в течение нескольких месяцев.
Мы посмотрели на разнообразие альтернатив, таких как модальный синтаксический анализ, где иногда > означало больше, чем, а иногда это означало перенаправление. Мы рассмотрели альтернативные последовательности символов для таких операторов, как :> или ->, либо для перенаправления, либо для сравнения. Мы провели юзабилити-тесты, провели фокус-группы и в конце концов остановились на том, с чего начали.
Операторами перенаправления являются > и <,, а операторы сравнения взяты из команды Unix test(1). Мы ожидаем этого, потому что эти операторы имеют 30-летнюю родословную, они адекватны и подходят для использования в PowerShell. (Мы также ожидаем, что люди будут продолжать жаловаться на это решение, хотя, надеюсь, не в течение еще 30 лет.)
Поделиться Andy Arismendi 24 апреля 2012 в 00:43
7
Потому что >
и <
являются операторами перенаправления потока в большинстве оболочек. Ну, за исключением того, что PowerShell не поддерживает перенаправление ввода потока. Кроме того, было бы сложнее проанализировать/интерпретировать >
в некоторых случаях, чтобы перенаправить stdout, а в других случаях greater than
. Кроме того, используя подход -<operator_name>
, вы можете иметь гораздо больше операторов, чем интуитивно понятных символов, например-содержит,- не содержит,- есть,- заменить,- разделить,- сопоставить и т. Д. Выполните man about_operators
в качестве отправной точки для explorer всех операторов, поддерживаемых PowerShell.
Поделиться Keith Hill 24 апреля 2012 в 00:05
2
Оператор = уже является оператором присваивания. Чтобы не путать сравнение и оператор присваивания, они выбирают для другого оператора. В данном случае для-eq, потому что это уже используется в других (UNIX) языках сценариев.
Поделиться Conrad 30 июля 2014 в 08:26
- Поведение PowerShell — eq vs compare-object
Почему Compare-Object работает так, как ожидалось, где -EQ не может точно сравнить массивы строк? У меня был скрипт PowerShell, который заполнял массив строк и использовал оператор -EQ для проверки ожидаемых значений — это всегда было неудачно — я думаю, что следующий код иллюстрирует эти проблемы…
- Почему команда работает в Windows CMD, а не в PowerShell?
У меня есть скрипт, который сохраняет исполняемый файл и .ps1 в список удаленных компьютеров. Затем он запускает исполняемый файл на каждом компьютере. Я должен вызвать исполняемый файл с .ps1 из-за того, как он настроен при бесшумном запуске. Я заметил, что одна из моих команд быстро запускается…
Похожие вопросы:
Почему ‘$true-eq «string» ‘ возвращает $true?
В powerShell вы сравниваете логическое значение со строкой с помощью оператора- eq, он всегда будет возвращать то же самое логическое значение, которое я использовал для сравнения. E.g….
Сравнение свойств в powershell
Я использую powershell для импорта файла csv, содержащего информацию о книгах. Например: название, idnum, автор и т. д… Я пытаюсь сравнить каждое свойство, чтобы увидеть, равно ли оно или null….
PowerShell многомерная логика сбора данных для-eq
Благодаря логике PowerShell я знаком с некоторыми тонкостями работы -eq , когда левый операнд является коллекцией-вместо логического значения -eq вернет массив элементов, равных правому операнду. Из…
Почему ‘true’ равно $true
Я не совсем уверен, является ли этот точный вопрос дубликатом, но я не смог найти свой конкретный вопрос в stackoverflow, так что, думаю, это не так. $true -это логический тип: ($true).getType()…
Почему этот маленький фрагмент PowerShell не возвращает false?
как раз в тот момент, когда я думал, что знаю PowerShell, мне стало интересно, что здесь происходит. Compare-Object работает для обоих этих примеров, и второй пример вернет различия, если я не…
Поведение PowerShell — eq vs compare-object
Почему Compare-Object работает так, как ожидалось, где -EQ не может точно сравнить массивы строк? У меня был скрипт PowerShell, который заполнял массив строк и использовал оператор -EQ для проверки…
Почему команда работает в Windows CMD, а не в PowerShell?
У меня есть скрипт, который сохраняет исполняемый файл и .ps1 в список удаленных компьютеров. Затем он запускает исполняемый файл на каждом компьютере. Я должен вызвать исполняемый файл с .ps1 из-за…
Содержит ли PowerShell Substiture-eq for-contains при сравнении строки и массива
Сравнивая строку с массивом в PowerShell сегодня, я по ошибке использовал -eq, а не-contains, но все равно получил ожидаемый результат. Пример Кода: $arr = Fred,Bob if($arr -eq Bob) { Return $true }…
Почему PowerShell не может соответствовать $env:image в AppVeyor?
Я пытаюсь интегрировать CMake сборок в AppVeyor. Наш проект основан на Visual Studio для Windows, но мы стараемся поддерживать CMake для пользователей, которые предпочитают его. Наш сценарий…
Powershell скрипт просто возвращается без вывода журнала
PSA: в первый раз, когда я использую PowerShell, мой go-to-это Bash или Python, извините, если это выглядит странно. Я создал сценарий Powershell, который, если наш сервер Windows 2019…
Операторы сравнения Powershell — Системный Администратор
В данной статье мы рассмотрим не только операторы сравнения Powershell, но и операторы замены, логические операторы. Сравнивать можно не только данные с типом строка или число, но и дата, булево и т.п.
В Powershell используются операторы сравнения на основе букв, что поначалу не привычно. Очень хочется написать знак > вместо -gt или знак = вместо -eq. Но со временем к такому именованию привыкаешь. Перед оператором сравнения или логическим оператором обязательно нужно ставить знак –
Операторы сравнения
Оператор | Значение | Описание |
---|---|---|
-eq | Equal | Равно |
-ne | Not equal | Не равно |
-gt | Greater than | Больше |
-ge | Greater than or equal | Больше или равно |
-lt | Less than | Меньше |
-le | Less than or equal | Меньше или равно |
-like | Wildcard comparison | Используется подстановка символов для поиска по шаблону |
-notlike | Wildcard comparison | Используется подстановка символов для поиска не соответствия указанному шаблону |
-match | Regular expression comparison | Использование регулярных выражений для поиска по шаблону |
-notmatch | Regular expression comparison | Использование регулярных выражений для поиска не соответствия указанному шаблону |
-contains | Containment operator | Определяет, содержит ли значение слева от оператора значение справа |
-notcontains | Containment operator | Определяет, что значение слева от оператора не содержит значение оператора справа |
-in | Containment operator | Возвращает true если искомое значение содержится в коллекции |
-notin | Containment operator | Возвращает true если искомое значение не содержится в коллекции |
-replace | Replace operator | Заменяет часть или все значение слева от оператора |
-is | Type | Возвращает true если оба объекта одинаковы |
-isnot | Type | Возвращает true если оба объекта разные |
По умолчанию все операторы сравнения нечувствительны к регистру. Чтобы сделать оператор сравнения чувствительным к регистру, перед именем оператора поставьте букву c. К примеру, чувствительной к регистру оператор -eq пишется как -ceq. Чтобы сделать нечувствительность к регистру явной, перед оператором ставится i. К примеру, явно нечувствительная к регистру версия оператора -eq это -ieq.
Когда входные данные для оператора являются скалярным значением (число), операторы сравнения возвращают логическое значение. Если входные данные представляют собой набор значений, операторы сравнения возвращают любые совпадающие значения. Если в коллекции нет совпадений, операторы сравнения возвращают пустой массив. Исключение составляют операторы contains, notcontains, in, notin, is, isnot которые всегда возвращают логическое значение.
1, 2, 4, 8 -eq 2 1, 2, 4, 8 -eq 3
В первом варианте при сравнении набора чисел с 2 такое число есть в массиве. Во втором варианте при сравнении с 3 возвращается пустой массив, такого числа нет.
Операторы равенства
Операторы равенства (-eq, -ne) возвращают значение TRUE или совпадения, когда одно или несколько входных значений идентичны указанному шаблону. Шаблон должен полностью соответствовать значению.
Рассмотрим несколько простых примеров
20 -eq 20 21 -eq 20 "Проверка" -eq "Проверка" "Проверка" -eq "Проверка не прошла" "Test_ne" -ne "Test"
Сравним между собой две даты.
(Get-Date) -eq [datetime]("09.15.2020") (Get-Date).Date -eq [datetime]("09.15.2020")
Давайте посмотрим на окошко вывода и разберемся что произошло. В первой строке я воспользовался командлетом Get-Date для получения текущей даты и времени. И сравнил его со строкой преобразованной в дату. Однако результат сравнения отрицательный т.е. False. Как видно число полностью совпадает, но, не совпадает время. Поэтому я взял командлет Get-Date и вывел из него только текущую дату (в таком случае время устанавливается в 0). И уже второй строкой результат сравнения положительный.
Давайте посмотрим на следующий пример который наверняка пригодится в хозяйстве. Мы будем искать файлы больше определенного размера.
Get-ChildItem -Path c:\ -Recurse|Where-Object {$_.Length -ge 40000000}
Итак, командлетом Get-ChildItem я хочу вывести список всех файлов и папок на диске C включая подпапки. Далее отправляя по конвееру командлету Where-Object я фильтрую вывод, чтобы показывались только файлы больше или равные (оператор -ge) 40 Мбайт. Как видите очень удобный инструмент получается. Особенно в качестве автоматизации чистки логов.
Операторы сопоставления
Операторы сопоставления (-like и -notlike) находят элементы, которые соответствуют или не соответствуют заданному шаблону, используя подстановочные выражения.
Рассмотрим на примере списка запущенных процессов. Получим список запущенных процессов firefox
Get-Process|Where-Object {$_.ProcessName -like "fire*"}
Командлетом Where-Object я выбрал из списка процессов (при помощи оператора -like) все с названием fire и дальше любые символы (*-любое кол-во символов)
Очень удобная конструкция. Всегда её использую для поиска необходимых процессов.
Операторы соответствия
Операторы соответствия (-match и-notmatch) находят элементы, которые соответствуют или не соответствуют заданному шаблону, используя регулярные выражения.
Оператор сопоставляет строку с помощью регулярных выражений. Если данные на входе являются скалярными, они заполняют автоматическую переменную $Matches. Если входными данными является коллекция, операторы -match и -notmatch возвращают соответствующие члены этой коллекции, но при этом, оператор не заполняет переменную $Matches.
Перейдем к примерам
"Вася","Петя","Маша" -match "маш" $Matches "Маша" -match "маш" $Matches
В случае сравнения с одной строкой -match возвращает логическое значение и заполняет автоматическую переменную $Matches. Автоматическая переменная $Matches – это хэш-таблица. Если группировка или захват не используются, заполняется только один ключ. Клавиша 0 представляет весь текст, который был сопоставлен.
Операторы сдерживания
Операторы сдерживания (-contains и -notcontains) аналогичны операторам равенства. Только операторы сдерживания всегда возвращают логическое значение, даже если входными данными является коллекция.
В отличие от операторов равенства, операторы сдерживания возвращают значение, как только они обнаруживают первое совпадение. Операторы равенства оценивают все входные данные, а затем возвращают все совпадения в коллекции.
Посмотрим на практике
"Вася","Петя","Маша" -contains "маш" "Вася","Петя","Маша" -contains "маша"
Как видно из примера, в случае не полного совпадения имени результат False. Если имя совпадает результат True.
Оператор -in указывает, появляется ли тестовое значение в коллекции эталонных значений. Всегда возвращает логическое значение. Возвращает TRUE только в том случае, если тестовое значение точно соответствует хотя бы одному из эталонных значений. Когда тестовое значение является коллекцией, оператор -in использует ссылочное равенство. Он возвращает TRUE только в том случае, если одно из опорных значений является тем же экземпляром объекта. Оператор -in был введен в PowerShell 3.0
Примеры
"Лада" -in "УАЗ", "ЛадаКалина" "Лада" -in "Лада", "ЛадаКалина"
Оператор замены
Оператор замены (-replace) заменяет все или часть значения указанным значением с помощью регулярных выражений. Оператор -replace можно использовать для многих административных задач, таких как переименование файлов, замена текста в файле и прочее.
Рассмотрим пример по массовому переименованию файлов *.log в *.bak
Get-ChildItem *.log | Rename-Item -NewName { $_.name -replace '\.log$','.bak' }
И немного простых примеров с текстом
"Привет" -replace "ив","" "Вася" -ireplace "я", "О" "Насталя заря коммунизма" -replace "заря","эра"
Мы закончили рассматривать операторы сравнения Powershell. Теперь рассмотрим логические операторы.
Логические операторы Powershell
Оператор | Описание |
---|---|
-and | Оба условия должны быть истины, чтобы выражение было истинно |
-or | Одно или оба условия должны быть истины, чтобы выражение было истинно |
-xor | Одно условие должно быть истинно, а второе должно иметь значение ложь, чтобы выражение было истинно |
-not | Указанные условия должны иметь значение ложь, чтобы выражение было истинно |
! | Указанное условие должно иметь значение ложь, чтобы выражение было истинно |
Логические операторы PowerShell соединяют выражения и операторы, позволяя использовать одно выражение для проверки нескольких условий.
Снова обратимся к примеру из жизни. Появилась у меня задача найти файлы определенного размера. А именно чтобы они были больше одного числа но меньше другого. Реализуем на Powershell
Get-ChildItem|Where-Object {$_.length -gt 30000 -and $_.Length -lt 40000}
В данном примере мы получили список файлов в папке Windows объемом больше 30 Кбайт но меньше 40 Кбайт.
Мы рассмотрели все операторы сравнения Powershell. Их более чем достаточно для любых задач.
Рекомендую к прочтению:
Powershell — Операторы сравнения » Pechenek.NET
Уже неоднократно в наших статьях встречались операторы сравнения, например, когда мы разбирали Where-Object. В этой статье мы наконец-то разберем их все, чтобы уже понять окончательно как работают эти операторы. Как ни странно, вас ожидает длиннопост.Powershell – Операторы сравнения
Equal / -eq
Начнем с самого известного и часто встречающегося. Оператор equal. Он проводит сравнение сравнение двух выражений и определяет равны ли они. Давайте попробуем использовать его самым простым способом:
Здесь все просто. Equal в своей сущности эквивалентен оператору = в других языках программирования. Рассмотрим более сложный пример и попробуем сравнить строки:
$a = «123» $b = 123 $a -eq $b True
$a = «123» $b = 123 $a -eq $b True |
Здесь сложнее, казалось бы, переменные имеют разный тип с одинаковым значением. Разве не должно ли вернуться false? Нет, потому что equal ищет совпадения, а не проверяет тип данных. Оператором equal можно пользоваться в циклах. Например:
if ($a -eq $b) { «переменные равны» } else { «переменные неравны» } переменные равны
if ($a -eq $b) { «переменные равны» } else { «переменные неравны» } переменные равны |
В такой ситуации проверяется условие находящееся в скобках. Так как переменные по значениям не отличаются возвращается True и выполняется первый блок кода.
Not equal / -ne
Здесь все работает с точностью, да наоборот. Если переменные не равны, возвращается true, если равны возвращается false. Пример:
Думаю понятно. Применение такое же – любые логические сравнения. Перейдем к следующему оператору.
Greater than or equal / -ge
Этот оператор вычисляет равно или больше левое выражение правому. Здесь важно понимать логику. Если выражение слева равно правому, возвращается True. Если выражение слева больше, возвращает тоже True. Тоже самое работает и в обратную сторону. То есть если выражение слева, меньше возвращается false. Например:
if (3 -ge 2) { «выражение слева больше или равно» } else { «выражение слева меньше» } выражение слева больше или равно if (2 -ge 2) { «выражение слева больше или равно» } else { «выражение слева меньше» } выражение слева больше или равно if (2 -ge 3) { «выражение слева больше или равно» } else { «выражение слева меньше» } выражение слева меньше
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | if (3 -ge 2) { «выражение слева больше или равно» } else { «выражение слева меньше» } выражение слева больше или равно
if (2 -ge 2) { «выражение слева больше или равно» } else { «выражение слева меньше» } выражение слева больше или равно
if (2 -ge 3) { «выражение слева больше или равно» } else { «выражение слева меньше» } выражение слева меньше |
Надеюсь с этим разобрались. Опять же, применение такое же, как и у операторов выше.
Greater Than / -gt
Этот оператор вычисляет больше ли левое выражение, чем правое или нет. Эквивалентен оператору > в других языках программирования. Что интересно, если попробовать выяснить одинаковые ли значения по обе стороны от оператора, то вернется false. Этот оператор не сравнивает, а выясняет больше или нет. Пример:
if (3 -gt 2) { «выражение слева больше» } else { «выражение слева меньше» } выражение слева больше if (3 -gt 4) { «выражение слева больше» } else { «выражение слева меньше» } выражение слева меньше if (3 -gt 3) { «выражение слева больше» } else { «выражение слева меньше» } выражение слева меньше
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | if (3 -gt 2) { «выражение слева больше» } else { «выражение слева меньше» } выражение слева больше
if (3 -gt 4) { «выражение слева больше» } else { «выражение слева меньше» } выражение слева меньше
if (3 -gt 3) { «выражение слева больше» } else { «выражение слева меньше» } выражение слева меньше |
Less Than / -lt
Противоположность Greater Than. Выясняет меньше ли левое значение, чем правое. Возвращает True, если левое выражение меньше, и false, если левое выражение больше. Например:
1 -lt 2 True 3 -lt 2 False
1 -lt 2 True
3 -lt 2 False |
Less than or equal / -le
Меньше или равно. Противоположность оператору Greater than or equal. Возвращает значение True, если левое выражение меньше или равно, чем правое. Возвращает false, если левое выражение больше, чем правое. Пример:
3 -le 2 False 1 -le 2 True 2 -le 2 True
3 -le 2 False
1 -le 2 True
2 -le 2 True |
Все это были простые логические операторы. Теперь перейдем к более сложным.
Wildcard comparison / -like
Допустим у вас есть выборка сервисов, из которых вам нужен только единственный. Из его названия вы знаете только часть. В таком случае на помощь приходит оператор -like. В той же статье, про оператор Where мы использовали его. Like ищет соответствия в исходной строке, и выводит все, которые полностью или частично подходят:
get-service | Where Name -like «search»
get-service | Where Name -like «search» |
Обратите внимание, сейчас вывода никакого не последовало. В такой конструкции like будет искать исключительно точные совпадения. Чтобы найти все неточные, нужно поставить звездочки вокруг целевого имени:
get-service | Where Name -like «*search*» Status Name DisplayName —— —- ———— Running WSearch Windows Search
get-service | Where Name -like «*search*»
Status Name DisplayName —— —- ———— Running WSearch Windows Search |
Еще пример:
ls | Where Name -like «D*» Каталог: C:\Users\Дом Mode LastWriteTime Length Name —- ————- —— —- d-r— 29.01.2020 19:51 Desktop d-r— 18.01.2020 20:38 Documents d-r— 27.01.2020 19:15 Downloads
ls | Where Name -like «D*»
Каталог: C:\Users\Дом
Mode LastWriteTime Length Name —- ————- —— —- d-r— 29.01.2020 19:51 Desktop d-r— 18.01.2020 20:38 Documents d-r— 27.01.2020 19:15 Downloads |
Обратный Wildcard comparison / -notlike
Этот оператор работает наоборот. Ищет все несовпадения. Допустим нам нужны файлы где нет буквы D:
ls | Where Name -notlike «*D*» Каталог: C:\Users\Дом Mode LastWriteTime Length Name —- ————- —— —- d—— 26.08.2019 21:04 .config d—— 26.08.2019 21:38 .nuget d—— 18.01.2020 20:39 .oracle_jre_usage d—— 26.08.2019 18:58 .templateengine d—— 26.08.2019 18:56 .vsts d—— 26.08.2019 20:02 .WebStorm2019.1 d—— 30.11.2019 20:10 ansel d-r— 17.11.2019 11:30 Contacts d-r— 17.11.2019 11:30 Favorites d-r— 17.11.2019 11:30 Links d-r— 17.11.2019 11:30 Music d-r— 17.11.2019 11:30 Pictures d-r— 17.11.2019 11:30 Searches d—— 26.08.2019 21:09 WebstormProjects -a—- 24.09.2019 21:24 121 .yarnrc -a—- 26.08.2019 21:08 90 yarn.lock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ls | Where Name -notlike «*D*»
Каталог: C:\Users\Дом
Mode LastWriteTime Length Name —- ————- —— —- d—— 26.08.2019 21:04 .config d—— 26.08.2019 21:38 .nuget d—— 18.01.2020 20:39 .oracle_jre_usage d—— 26.08.2019 18:58 .templateengine d—— 26.08.2019 18:56 .vsts d—— 26.08.2019 20:02 .WebStorm2019.1 d—— 30.11.2019 20:10 ansel d-r— 17.11.2019 11:30 Contacts d-r— 17.11.2019 11:30 Favorites d-r— 17.11.2019 11:30 Links d-r— 17.11.2019 11:30 Music d-r— 17.11.2019 11:30 Pictures d-r— 17.11.2019 11:30 Searches d—— 26.08.2019 21:09 WebstormProjects -a—- 24.09.2019 21:24 121 .yarnrc -a—- 26.08.2019 21:08 90 yarn.lock |
Получаем соответствующий вывод.
Regular expression comparison / -match
Оператор match может быть использован по-разному. Например так:
«powershell» <strong>-match</strong> «power» True «powershell» <strong>-match</strong> «powerstring» False
«powershell» <strong>-match</strong> «power» True
«powershell» <strong>-match</strong> «powerstring» False |
Или вот так:
$WMI = Get-WmiObject -List | Where-Object {$_.name <strong>-Match</strong> «network»} $WMI NameSpace: ROOT\cimv2 Name Methods Properties —- ——- ———- Win32_NetworkLoginProfile {} {AccountExpires, AuthorizationFlags, BadPasswordCount, Capt… Win32_NetworkAdapterConfiguration {EnableDHCP, Rene… {ArpAlwaysSourceRoute, ArpUseEtherSNAP, Caption, DatabasePa… Win32_NetworkAdapterSetting {} {Element, Setting}
$WMI = Get-WmiObject -List | Where-Object {$_.name <strong>-Match</strong> «network»} $WMI NameSpace: ROOT\cimv2
Name Methods Properties —- ——- ———- Win32_NetworkLoginProfile {} {AccountExpires, AuthorizationFlags, BadPasswordCount, Capt… Win32_NetworkAdapterConfiguration {EnableDHCP, Rene… {ArpAlwaysSourceRoute, ArpUseEtherSNAP, Caption, DatabasePa… Win32_NetworkAdapterSetting {} {Element, Setting} |
Обратный Regular expression comparison / -notmatch
Оператор -notmatch делает все наоборот, если совпадений выводится True и False, если совпадения есть. Пример:
«powershell» -notmatch «powerstring» True
«powershell» -notmatch «powerstring» True |
Есть еще операторы -replace, -contains и -not-contains. Но их мы рассмотрим позднее.
Так же есть операторы проверяющие принадлежность переменной к типу -is, -isnot и -as. Например:
$a=»123″ $b=123 $a -is «Int» False $a -is «String» True $b -is «String» False $b -is «Int» True $b -as «Int» 123 $b -as «Bool» True $b -isnot «Bool» True $b -isnot «String» True $b -isnot «Int» False
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 | $a=»123″ $b=123
$a -is «Int» False
$a -is «String» True
$b -is «String» False
$b -is «Int» True
$b -as «Int» 123
$b -as «Bool» True
$b -isnot «Bool» True
$b -isnot «String» True
$b -isnot «Int» False |
Оператор -as представляет выражение в типе, который вы ему укажете.
$b -as «Int» 123 $b -as «String» 123 $b -as «Boolean» True
$b -as «Int» 123
$b -as «String» 123
$b -as «Boolean» True |
Итог
В данной статье мы рассмотрели все операторы сравнения в powershell. В следующих двух мы выделим для операторов -replace, -contains и -notcontains, а так же -and, -or, -not, xor и !. Надеюсь данная статья была для вас полезной! Если у вас остались вопросы, тогда пишите их в комментариях, ответим на все. Подписывайтесь на нашу группу в ВК, канал на ютубе, а так же канал в телеграме! Благодарим за проявленный интерес.
Сгенерировать список доступных внешних (белых) IP адресов
Пришла в голову задачка, без явного практического применения, скорее как разминка для ума, и воссоздание в памяти и практических навыков в стэке используемых технологий. Задача формулируется следующим образом: написать скрипт, который бы сгенерировал все белые IP адреса. С одной стороны все просто, берем 4 цикла и методом перебора генерируем адреса. Да, в целом почти все так, если не смотреть в документацию. А в документации, есть не мало ньюансов на этот счет, про какие-то знал, но забыл, а о каких-то даже не слышал.Список зарезервированных адресных диапазонов ipv4
Итак, если посмотреть на документацию, то можно увидеть большой список выделенных адресных блоков, которые не могут быть публичными адресами, а имеют специальное предназначение:Блок адресов | Диапазон адресов | Количество адресов | Назначение | RFC | Описание | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0.0.0.0/8 | 0.0.0.0–0.255.255.255 | 16777216 | Software | RFC 6890 | Может использоваться только как исходный адрес | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10.0.0.0/8 | 10.0.0.0–10.255.255.255 | 16777216 | Private network | RFC 1918 | Частная сеть | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
100.64.0.0/10 | 100.64.0.0–100.127.255.255 | 4194304 | Private network | RFC 6598 | Сеть сервис провайдера | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
127.0.0.0/8 | 127.0.0.0–127.255.255.255 | 16777216 | Host | RFC 6890 | Cсылка на себя (loopback) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
169.254.0.0/16 | 169.254.0.0–169.254.255.255 | 65536 | Subnet | RFC 3927 | Немаршрутизируемая сеть | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
172.16.0.0/12 | 172.16.0.0–172.31.255.255 | 1048576 | Private network | RFC 1918 | Частная сеть | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
192.0.0.0/24 | 192.0.0.0–192.0.0.255 | 256 | Private network | RFC 6890 | для протокола IETF | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
192.0.2.0/24 | 192.0.2.0–192.0.2.255 | 256 | Documentation | RFC 5737 | Для документации и примеров | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
192.88.99.0/24 | 192.88.99.0–192.88.99.255 | 256 | Internet | RFC 3068 | сеть трансляции IPv6 в IPv4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
192.168.0.0/16 | 192.168.0.0–192.168.255.255 | 65536 | Private network | RFC 1918 | Частная сеть | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
198.18.0.0/15 | 198.18.0.0–198.19.255.255 | 131072 | Private network | RFC 2544 | Сеть тестирования между подсетями | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
198.51.100.0/24 | 198.51.100.0–198.51.100.255 | 256 | Documentation | RFC 5737 | Для документации и примеров | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
203.0.113.0/24 | 203.0.113.0–203.0.113.255 | 256 | Documentation | RFC 5737 | Для документации и примеров | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
224.0.0.0/4 | 224.0.0.0–239.255.255.255 | 268435456 | Internet | RFC 5771 | Сеть для Многоаресной рассылки (MultiCast) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
240.0.0.0/4 | 240.0.0.0–255.255.255.254 | 268435455 | Internet | RFC 1700 | Зарезервировано | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
255.4=4294967296), 592708864 IPv4 адресов относятся к зарезервированным блокам, остается всего 3702258432 IPv4 адресов, которые различные компании и провайдеры могут использовать по своему усмотрению.
С учетом всех ограничений из RFC, скрипт для генерации всех белых ip адресов, может выглядеть следующим образом: Выполнение скрипта, по последовательному перечислению всех доступных внешних ip адресов, заняло около 8,5 часов.Написание, этого скрипта, явилось лишь первым шагом пришедшей в голову задачке, но позволило освежить знания в области зарезервированных IP диапазонах. Отчет об объектах AWS в PowerShellДля тех кто пользуется Amazon Web Services было бы полезным иметь инструмент для выгрузки списка используемых ресурсов в виде таблицы. Для решения этой задачи я написал скрипт на Powershell. Для того, чтобы воспользоваться скриптом, нужно: Листинг скрипта для получения отчета по объектам EC2 и RDS из консоли AWS: # AWS variables $AWSAccountID = [your AWS account number] $AWSRegion = [AWS region to report] $AWSProfileAccessKey = "service user access key" $AWSProfileSecretKey = "service user secret key" # Registering AWS libraries Add-Type -Path "C:\Program Files (x86)\AWS SDK for .NET\bin\Net45\AWSSDK.Core.dll" Function Write-ScriptLog { Param( [CmdletBinding()] [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] [String]$Message, [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] [String]$LogFile ) Process { $LogMessage = Get-Date -uformat "%d.%m.%Y %H:%M:%S" $LogMessage += "`t" $LogMessage += $Message $LogMessage | Out-File -FilePath $LogFile -Append } }#End Function # --- Start --- # Calculating variables $CurrentDate = Get-Date $ScriptFolder = $MyInvocation.MyCommand.Path.SubString(0,($MyInvocation.MyCommand.Path.Length - $MyInvocation.MyCommand.Name.Length)) # Reset report $EC2Report = @() $RDSReport = @() # Get list of VPCs $VPCs = Get-EC2Vpc -Region $AWSRegion -AccessKey $AWSProfileAccessKey -SecretKey $AWSProfileSecretKey # Get list of instances $EC2Instances = (Get-EC2Instance -Region $AWSRegion -AccessKey $AWSProfileAccessKey -SecretKey $AWSProfileSecretKey).Instances # Create the report per VPC ForEach ($VPC in $VPCs) { $EC2Instances | Where-Object {$_.VpcId -eq $VPC.VpcId} | ForEach { $EC2InstanceProperties = New-Object -TypeName PSObject -Property @{ 'VPC-Id' = $_.VpcId 'VPC-Name' = ($VPC.Tags | Where-Object {$_.Key -eq 'Name'}).Value 'Instance-Id' = $_.InstanceId 'Instance-Name' = ($_.Tags | Where-Object {$_.Key -eq 'Name'}).Value 'Instance-LaunchTime' = $_.LaunchTime 'Instance-Type' = $_.InstanceType 'Instance-PrivateIpAddress' = $_.PrivateIpAddress 'Instance-State' = $_.State.Name 'Instance-Key' = $_.KeyName 'Instance-Description' = ($_.Tags | Where-Object {$_.Key -eq 'Description'}).Value 'Instance-Project' = ($_.Tags | Where-Object {$_.Key -eq 'Project code'}).Value 'Instance-ProjectName' = ($_.Tags | Where-Object {$_.Key -eq 'Project name'}).Value 'Instance-Responsible' = ($_.Tags | Where-Object {$_.Key -eq 'Responsible'}).Value 'Instance-Platform' = $_.Platform } $EC2Report += $EC2InstanceProperties } } $EC2Report | Select 'Instance-Name', 'Instance-Description', 'Instance-Project', 'Instance-Id', 'Instance-Platform', 'Instance-Type', ` 'VPC-Name', 'VPC-Id', 'Instance-PrivateIpAddress', 'Instance-LaunchTime', 'Instance-State', 'Instance-ProjectName', 'Instance-Key', ` 'Instance-Responsible' | Sort -Property ('VPC-Name', 'Instance-Name') | Export-Csv -Path ($ScriptFolder + 'AWS-EC2Instances.csv') ` -Encoding UTF8 -NoTypeInformation $RDSInstances = Get-RDSDBInstance -Region $AWSRegion -AccessKey $AWSProfileAccessKey -SecretKey $AWSProfileSecretKey ForEach ($VPC in $VPCs) { $RDSInstances | Where-Object {$_.DBSubnetGroup.VpcId -eq $VPC.VpcId} | ForEach { $RDSInstanceTags = Get-RDSTagForResource -ResourceName $_.DBInstanceArn -Region $AWSRegion -AccessKey $AWSProfileAccessKey ` -SecretKey $AWSProfileSecretKey $RDSInstanceProperties = New-Object -TypeName PSObject -Property @{ 'VPC-Id' = $_.DBSubnetGroup.VpcId 'VPC-Name' = ($VPC.Tags | Where-Object {$_.Key -eq 'Name'}).Value 'Instance-Name' = $_.DBInstanceIdentifier 'Instance-EndPoint' = $_.Endpoint.Address 'Instance-CreateTime' = $_.InstanceCreateTime 'Instance-Type' = $_.DBInstanceClass 'Instance-StorageSize' = $_.AllocatedStorage 'Instance-AvailabilityZone' = $_.AvailabilityZone 'Instance-State' = $_.DBInstanceStatus 'Instance-Platform' = $_.Engine 'Instance-IOps' = $_.Iops 'Instance-Description' = ($RDSInstanceTags | Where-Object {$_.Key -eq 'Description'}).Value 'Instance-Project' = ($RDSInstanceTags | Where-Object {$_.Key -eq 'Project code'}).Value 'Instance-ProjectName' = ($RDSInstanceTags | Where-Object {$_.Key -eq 'Project name'}).Value 'Instance-Responsible' = ($RDSInstanceTagss | Where-Object {$_.Key -eq 'Responsible'}).Value } $RDSReport += $RDSInstanceProperties } } $RDSReport | Select 'Instance-Name', 'Instance-Description', 'Instance-Project', 'Instance-IOps', 'Instance-Platform', 'Instance-Type', ` 'VPC-Name', 'VPC-Id', 'Instance-EndPoint', 'Instance-CreateTime', 'Instance-State', 'Instance-ProjectName', 'Instance-StorageSize', ` 'Instance-AvailabilityZone', 'Instance-Responsible' | Sort -Property ('VPC-Name', 'Instance-Name') | ` Export-Csv -Path ($ScriptFolder + 'AWS-RDSInstances.csv') -Encoding UTF8 -NoTypeInformation (Get-RDSTagForResource -ResourceName $RDSInstances[1].DBInstanceArn -Region $AWSRegion -AccessKey $AWSProfileAccessKey ` -SecretKey $AWSProfileSecretKey).Key['Projectcode'] # --- Stop--- Листинг прав IAM для служебного пользователя, который используется для выгрузки данных из консоли AWS: { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeRegions", "ec2:DescribeSnapshots", "ec2:StopInstances", "ec2:DescribeSecurityGroups", "ec2:DescribeVolumeAttribute", "ec2:DescribeImages", "ec2:StartInstances", "ec2:DescribeAvailabilityZones", "ec2:DescribeVpcs", "ec2:DescribeVolumes", "ec2:DescribeSubnets", "ec2:DescribeKeyPairs", "ec2:DescribeInstanceStatus", "rds:ListTagsForResource", "rds:DescribeDBInstances" ], "Resource": "*" } ] } Примечание. Здесь для служебного пользователя выданы дополнительные полномочия, чтобы этот пользователь имел возможность перезагружать серверы EC2. Эта опция используется в другом скрипте, предназначенном для быстрого управления серверами без входа в консоль AWS. Пример отчета по серверам EC2 — файл AWS-EC2Instances.csv "Instance-Name","Instance-Description","Instance-Project","Instance-Id","Instance-Platform","Instance-Type","VPC-Name","VPC-Id", "Instance-PrivateIpAddress","Instance-LaunchTime","Instance-State","Instance-ProjectName","Instance-Key","Instance-Responsible" "SERVER1","AWS TEST server","INF","i-08993683117971400",,"t2.xlarge","vpc-i-TST","vpc-43a84000", "192.168.1.12","09.05.2018 13:29:59","running",,,"Ivanov Vladimir" Пример отчета по базам данным RDS — файл AWS-RDSInstances.csv "Instance-Name","Instance-Description","Instance-Project","Instance-IOps","Instance-Platform","Instance-Type","VPC-Name","VPC-Id", "Instance-EndPoint","Instance-CreateTime","Instance-State","Instance-ProjectName","Instance-StorageSize","Instance-AvailabilityZone", "Instance-Responsible" "dbs-i-tst",,,"0","postgres","db.t2.large","vpc-i-TST","vpc-43a84000", "dbs-i-tst.ctpuy7pji400.eu-west-1.rds.amazonaws.com","27.04.2018 16:44:14","available",,"250","eu-west-1a", Пример отчета об объектах AWS, сконвертированный в Excel Общие сведения о Powershell -Eq -Ne и других операторах сравнения Вы изо всех сил пытаетесь понять операторы сравнения PowerShell, такие как Исходя из опыта разработки программного обеспечения, в первый раз у меня возник вопрос «А?» Был момент, когда я впервые увидел операторы сравнения PowerShell Не только синтаксис выглядит совершенно иначе, чем ваш типичный язык программирования, но и ведет себя иначе при сравнении наборов значений. Это то, что меня действительно подвело, когда я узнал о PowerShell, но теперь это похоже на старую пивную пословицу; это приобретенный вкус. Давайте кратко рассмотрим, что такое оператор сравнения, если вы не знакомы, и углубимся в нюансы, которые вводит PowerShell.Вскоре вы сможете без проблем использовать операторы в сценариях PowerShell. Как я уже упоминал, все языки программирования / сценариев имеют операторы сравнения. В самом общем смысле операторы сравнения необходимы для оценки того, как разные вещи сравниваются с другими. Они используются, чтобы взять два объекта и посмотреть, какая разница (если есть) между этими двумя объектами. В случае PowerShell операторы также могут использоваться для поиска элементов внутри коллекций значений. В этом посте я собираюсь рассказать об операторах равенства и о том, как их использует PowerShell. Это PowerShell -EQ и -CEQ Если вам когда-нибудь понадобится проверить, равен ли объект другому объекту, вы должны использовать операторы Когда я впервые начал изучать PowerShell, я постоянно делал что-то вроде этого Вскоре ты будешь достаточно шлепан, чтобы этого не делать. Знак Правильный способ сделать это — определить значение для проверки в левой части выражения и использовать оператор Обратите внимание, как Это все хорошо и хорошо для скалярных (одиночных) значений, но вы также можете найти все экземпляры определенных значений, используя эти операторы.Например, используйте оператор PowerShell -eq для фильтрации элементов в массиве: Использование Eq для поиска по массивам Если у вас есть переменная с набором значений, например массив, вы можете использовать Обратите внимание, что он нашел все экземпляры целого числа 9, с которыми мы пытались сравнить. Я постоянно использую этот удобный метод. -NE и -CNE На противоположной стороне у вас есть Я надеюсь, что это дает хорошее объяснение операторов сравнения равенства. Это действительно заставило меня повесить трубку как новичка, и это никогда не касалось меня, пока я не был просто забит сообщениями об ошибках. Я надеюсь, что этот пост предотвратит то же избиение, которое я получил Операторы сравнения — PowerShell — SS64.comОператоры сравнения — PowerShell — SS64.comВсе следующие операторы по умолчанию нечувствительны к регистру: -eq Равно -ne Не равно -ge Больше или равно -gt Больше чем -lt Меньше чем -le Меньше или равно -подобное сравнение подстановочных знаков -notlike Сравнение подстановочных знаков -match Сравнение регулярных выражений -notmatch Сравнение регулярных выражений -replace Заменить оператор -содержит оператор сдерживания -notcontains Оператор сдерживания -in Как –содержит, но с обратными операндами.(PowerShell 3.0) -notin Аналогично –notcontains, но с перевернутыми операндами (PowerShell 3.0) Чтобы выполнить сравнение с учетом регистра, просто добавьте к любому из вышеперечисленных префиксов «c» Точно так же префикс с «i» явно сделает оператор нечувствительным к регистру. Типы -это типа -isnot Не является типом -as Как тип, нет ошибки при сбое преобразования Логические операторы -и логическое И -или Логический ИЛИ -xor Логический эксклюзив Или -не логично не ! логическое не Побитовые операторы -band Побитовый и -bor Побитовое или -bXor Побитовое ИЛИ (исключающее) -b Не побитовое НЕ -shl Сдвиг бит влево (PowerShell 3.0) -shr Сдвиг бит вправо - сохраняет знак для значений со знаком.(PowerShell 3.0) Оператор формата " format_string " -f Object1 , Object2 , ... Формат_строка имеет вид: {0, -5} {1, -20} {2, -10} При применении к массиву операторы сравнения будут работать как фильтр, возвращающий все совпадающие значения. Фильтры
Примеры $ демо = $ null $ myVar -is «Строка» $ mycmd = ps | выберите идентификатор, ProcessName «Правило 50-50-90: каждый раз, когда у вас есть 50-50 шансов сделать что-то правильно, существует 90% -ная вероятность, что вы сделаете это неправильно» ~ Энди Руни Связанные командлеты PowerShell: if — Условно выполнить команду. Авторские права © 1999-2021 SS64.com Некоторые права защищены. PowerShell -eq, -ceq и -ieq Операторы сравненияЭта статья поможет вам понять операторы сравнения -eq, -ceq, -ieq в Windows PowerShell, которые используются для сравнения. Примеры использования оператора PowerShell -eq в этой статье позволяют лучше понять его использование. РезюмеWindows PowerShell — одна из замечательных оболочек, которые когда-либо проектировала и разрабатывала Microsoft. С помощью PowerShell администраторы и разработчики Windows получают большие преимущества, поскольку он упрощает автоматизацию в операционной системе Windows. Вы можете узнать больше о PowerShell и ее использовании на сайте TechNet. Поскольку цель этой статьи — узнать больше об операторе PowerShell -eq, давайте начнем с него. Оператор сравнения (-eq):PowerShell похож на любой другой язык программирования.При разработке сценариев с использованием PowerShell нам необходимо использовать операторы. Оператор -eq (называемый равным) — один из них. Как видно из названия, цель этого оператора -eq — выполнить сравнение в PowerShell. Мы можем сравнивать строки, числа и символы, используя оператор -eq. Этот оператор используется для сравнения скалярных значений. Результатом этого оператора -eq является логическое значение (True или False), которое указывает, равны ли входные скалярные значения или нет. Примеры:Теперь давайте рассмотрим несколько примеров, чтобы понять, как использовать этот оператор -eq в Windows PowerShell для сравнения. Сравнение строк:Две строки можно сравнить с помощью оператора -eq в PowerShell, чтобы проверить, равны они или нет. «abc» -eq «abc» «abc» -eq «xyz» Приведенный выше код сравнивает одну строку с другой и возвращает True или False в зависимости от того, равны ли строки или нет. Вам придется делать это много раз при написании сценариев PowerShell в соответствии с вашими требованиями. Посмотрите на приведенный ниже пример, где оператор PowerShell -eq используется для определения, правильно ли ввел пользователь ПИН-код или нет. $ UserPIN = Read-Host «Введите свое имя» if ($ UserPIN -eq «Стив») { Write-Host «Добро пожаловать, Стив !!» } остальное { Write-Host «Извините, $ UserPIN, разрешен только Стив» } Этот оператор -eq в PowerShell также может принимать переменные типа коллекций, но вариантов его использования меньше, и я не хочу создавать путаницу, обсуждая его здесь. Числовое сравнение:Подобно тому, как оператор -eq используется для сравнения строк, он также может сравнивать числовые значения.Взгляните на приведенные ниже примеры. 100 -экв. 100 100 -экв. 110 0100 -экв. 100 10,1 -экв 10,1 10,2 -экв 10,1 Он сравнил оба переданных ему операнда и вернул результат. Вы можете задаться вопросом, откуда он знает, являются ли операнды, переданные оператору -eq, строками или числовыми значениями. В этом вся прелесть PowerShell. Он способен понять тип переменной и затем выполнить сравнение. Также вы могли заметить, что -eq также может сравнивать десятичные числа. Сравнение символов:Сравнение символов в PowerShell аналогично строковому или числовому сравнению. Вы можете сравнить два символа, используя оператор -eq, чтобы проверить, равны они или нет. ‘c’ -eq ‘c’ ‘c’ -eq ‘z’ См. Пример выше для сравнения символов. Если оба символа равны, возвращается True, в противном случае — False. С учетом регистра и без учета регистра для сравнения:Пока что все примеры, которые мы видели выше, являются сравнениями без учета регистра.Да, оператор PowerShell -eq предназначен для выполнения операторов сравнения без учета регистра. Но ваши требования к сценарию PowerShell могут потребовать сравнения с учетом регистра, а также для точного сравнения строк. Для решения таких задач в PowerShell есть еще два оператора для сравнения строк.
Этот оператор работает аналогично оператору -eq, но возвращает false, если сравниваемые строки различаются по регистру.Например, он возвращает false, когда вы пытаетесь сравнить Windows с Windows . Потому что в первом члене заглавная буква W. См. Ниже пример, чтобы увидеть, как это работает: «Окна» -экв. «Окна» «Окна» -ceq «окна» Сравнение без учета регистра (-ieq):Несмотря на то, что оператор -eq выполняет сравнение строк без учета регистра, вы все равно хотите обеспечить сравнение без учета регистра, вы можете использовать -ieq.Этот параметр используется гораздо реже, потому что большинство людей используют -eq, который делает то же самое. Если вы знаете какой-либо случай, когда -ieq предпочтительнее -eq, напишите в комментариях к этой статье, чтобы я добавил его сюда. Ниже приведен небольшой пример, показывающий сравнение строк без учета регистра. «Linux» -экв. «Linux» «Linux» -ieq «Linux» «Linux» -ceq «Linux» Сравнение без учета регистра (-ieq) и обычный оператор сравнения (-eq) вернули True в обоих случаях.Но сравнение с учетом регистра (-ceq) вернуло значение False. Этот тип операторов, чувствительных к регистру или чувствительных к регистру, применим только к строкам и символам. Числовые значения не имеют регистра, поэтому достаточно использовать только оператор -eq. У вас есть вопросы по использованию любого из этих операторов -eq, -ceq или -ieq? Не стесняйтесь размещать это в разделе комментариев под этой статьей. Работа с оператором If — Microsoft Certified Professional Magazine OnlineКонвейер PowerShell Основы PowerShell: работа с оператором IfКак и любой хороший инструмент, знание различных способов использования оператора If во многом поможет вашему сценарию. У каждого языка программирования и сценариев был какой-то способ выполнения условной операции с использованием оператора If как части управления потоком в сценарии или программе. PowerShell определенно ничем не отличается, и я собираюсь потратить некоторое время, чтобы охватить основы PowerShell, взглянув на операторы If / Else / ElseIf, которые помогут вам узнать, когда и где их использовать. При работе в PowerShell будет время, когда вам потребуется выполнить какое-то сравнение, чтобы определить, какое действие должно произойти.Для этого можно использовать оператор If, а также оператор Else, который обычно сопровождает его, чтобы обработать результат, которого нет в If. Иногда на основе сравнения будет несколько ожидаемых результатов. В этом случае вы можете использовать несколько операторов ElseIf для обработки каждого из них. Это работает так: вы берете свой элемент, который хотите сравнить с другим, и используете оператор сравнения, такой как –eq (это означает, что вы хотите увидеть, совпадает ли что-то с тем, с чем вы его сравниваете; подробнее об этом позже), который затем возвращает логическое значение True (соответствует сравнению) или False (не соответствует сравнению). Быстрый пример, показывающий это в действии, просто посмотрим, равно ли число 1 или нет 1. Если (1 -экв. 1) { 'Это число 1' Результат того, что произойдет, должен казаться довольно очевидным. Мы всегда будем получать строку, в которой указано, что значение равно 1. Если бы число было чем-то другим, кроме 1, мы бы вернули строку из блока Else, заявив, что значение не равно 1. Помните, что все, что идет в блок сценария после оператора If, всегда должно иметь значение True — если только вы не ожидаете обратного, используя оператор –NOT в операторе If, как показано ниже. If (-NOT (1 -eq 1)) { Добавление –NOT означает, что верно обратное, поэтому теперь блок сценария Else будет запущен, когда мы выполним приведенный выше код. До сих пор мы рассматривали простые операторы If / Else, в которых рассматривалась только одна вещь. Мы можем легко объединить несколько сравнений, а затем предоставить соответствующий блок сценария для обработки того, что происходит, когда результат либо истинный, либо ложный. $ Data1 = 'Apple'Рисунок 1. Пример того, где If будет отображать выходные данные, а также не отображать выходные данные. Здесь мы видим, что если $ Data1 — это Apple, а $ Data2 — красный, что первый пример сценария возвращается с заявлением, что «Это красное яблоко», поскольку оба сравнения верны, а второй пример ничего не выводит, потому что не соответствует требованиям оператора If ($ Data1 не является ‘Banana’), даже если одна из переменных была истинной ($ Data2 ‘красный’).Это важно, когда вы устраняете неполадки в потоке вашего скрипта и задаетесь вопросом, почему правильный блок скрипта не запускается в вашем блоке If / Else. Использование оператора –AND означает, что оба этих значения должны быть $ True с соответствующими сравнениями, прежде чем это позволит мне использовать блок сценария If. Если бы это было не так, вместо этого использовался бы блок сценария для Else. Если мы заботимся только о том, чтобы одно из двух (или оба все еще) сравнения было истинным, мы могли бы заменить –AND на –OR, и пока один из результатов будет истинным, будет выполняться блок сценария для If. Я упоминал об использовании ElseIf ранее, и теперь мы можем взглянуть на его использование, чтобы увидеть, как мы можем использовать его для обработки более чем двух возможных результатов с нашим управлением потоком. $ Data = 'Apple' В этом примере мы знаем, что результатом будет то, что данные принадлежат Apple, но в отличие от ранее, когда у нас было только два варианта, здесь у нас есть несколько вариантов и, наконец, наш Else, который является универсальным, если ни один из других ElseIfs способны обрабатывать сравнения.Последний пример этого ниже: $ Data = 1..7Рисунок 2. Еще один взгляд на использование управления потоком If / ElseIf / Else. Используя ElseIf, мы можем обрабатывать, является ли число больше, меньше или равно тому, что мы ему бросаем, и мы можем обрабатывать его соответствующим образом. Как вы заметили, я исключил –gt (больше чем) и –lt (меньше чем) в качестве возможных операторов сравнения. Фактически, есть несколько операторов, которые мы можем использовать для сравнения.
Сейчас я не собираюсь рассматривать все это с примерами, но я рекомендую вам ознакомиться со справочной документацией по операторам сравнения, чтобы лучше ознакомиться с ними и узнать, где их можно использовать. Get-Help about_Comparison_Operators Теперь, когда вы лучше понимаете управление потоком с помощью If / Else / ElseIf, вы можете применить это к своим скриптам, чтобы лучше обрабатывать данные, которые им отправляются. Об авторе Бо Прокс — специалист по Microsoft MVP в Windows PowerShell и старший системный администратор Windows.Он работает в сфере информационных технологий с 2003 года и поддерживает множество различных платформ. Он является соавтором PowerShell Deep Dives с главами о WSUS и TCP-коммуникациях. Он модератор сайта Hey, Scripting Guy! форум, и он был судьей Scripting Games. Он выступал с докладами на темы WSUS и PowerShell, а также о пространствах выполнения для групп пользователей PowerShell. Он является почетным сценаристом и отправил ряд сообщений в Microsoft’s Hey, Scripting Guy! У него также есть несколько проектов с открытым исходным кодом, доступных на Codeplex и GitHub.Его личный блог находится на http://learn-powershell.net. PowerShell, оператор Not Equal: приложения, примерыОператор PowerShell Not Equal сравнивает два значения. Он возвращает Истинно , если два значения не равны. Кроме того, если сравниваемые значения равны, оператор PowerShell Not Equal (NE) возвращает False . Из этого руководства вы узнаете все, что вам нужно знать об операторе сравнения «Not Equal (NE)».Кроме того, в руководстве много реальных примеров системного администратора. Начнем с синтаксиса Not Equal (NE)… Синтаксис PowerShell, оператор «Не равно»Синтаксис оператора «Не равно (NE)»: .. "п.1" -не "п.2" Если вы хотите сравнить несколько значений, используйте оператор « и» или « или ». Синтаксис для сравнения нескольких значений: ("элемент 1" -ne "элемент 2") -или ("элемент 3" -ne "элемент 4") ("элемент 1" -ne "элемент 2") -and ("элемент 3" -ne "элемент 4") Первый синтаксис оператора PowerShell Not Equal перенастраивает True , если элемент 1 НЕ равен элемент 2 .Более того, во втором синтаксисе команда вернет Истина , если либо сравнений «Не равно» с обеих сторон оператора « Или » равно Истинно . В отличие от второго синтаксиса с оператором « или », третий синтаксис — с оператором «и» — вернет Истина только в том случае, если «Не равно» на сравнивает обе стороны от « и ». оператор Истинный . Наконец, оператор «ne» нечувствителен к регистру (он нечувствителен к регистру).Однако, если вы хотите сделать его чувствительным к регистру, используйте синтаксис ниже: "элемент 1" -cne "элемент 2" Разница между этой последней командой и первой в том, что «c» добавляется после «-». Как использовать оператор PowerShell Not Equal для проверки нулевых или пустых значенийВ сценариях PowerShell есть много причин, по которым вы можете захотеть проверить нулевые или пустые значения. Вы можете использовать «ne», чтобы проверить, является ли значение нулевым. Для проверки нулевого значения используйте автоматическую переменную $ null.Более того, вы также можете использовать тест оператора PowerShell «Не равно» для пустого значения в PowerShell с «» (2 двойные кавычки без чего-либо внутри кавычек). Начнем с простых примеров… Откройте командную строку PowerShell и выполните следующую команду: Get-Process Команда возвращает все процессы, запущенные на вашем локальном компьютере. Я выделил столбец CPU (s) . Для некоторых процессов столбец CPU (s) пуст (ноль, пустой). Чтобы отобразить только результаты, в которых столбец CPU (s) НЕ является пустым или пустым, выполните следующую команду: Get-Process | Где-Объект {$ _. CPU -ne $ null} Если вы теперь посмотрите на столбец CPU (s) , все результаты с нулевым значением были удалены! Вы также можете применить тот же принцип, чтобы вернуть все службы на вашем компьютере со статусом «работает». Вот команда PowerShell: Get-Service | Где-Объект -FilterScript {$ _.status -ne "Остановлен"} Вот результат выполнения команды в PowerShell: Чтобы результат выглядел лучше, мы можем направить вывод в Format-Table , а затем переупорядочить заголовки. Вот измененная команда: Get-Service | Where-Object -FilterScript {$ _. Status -ne "Остановлен"} | Имя форматной таблицы, отображаемое имя, статус А вот результат в PowerShell… Как использовать оператор PowerShell Not Equal для проверки $ True или $ FalseЭто может быть неочевидным, однако каждый раз, когда вы используете в команде оператор PowerShell «Не равно», он возвращает значение $ True или $ False.Затем значение $ True или $ False используется для выполнения любых дальнейших команд. $ True, $ False — автоматические переменные, которые означают True и False соответственно. В качестве примера, в примере Get-Process в последнем разделе оператор « $ _. CPU -ne $ null » в Where-Object просто вернул все процессы, которые вернули True для оператора , « $ _. CPU -ne $ null ». Get-Process | Где-Объект {$ _. CPU -ne $ null} Кроме того, все процессы, которые вернули Ложь для « $ _.CPU -ne $ null »не был возвращен. Чтобы понять, что я хочу, запустите в PowerShell следующую команду: 1 -ne 2 Очевидно, что 1 НЕ равно 2, поэтому мы ожидаем, что результат вернет True. И вот результат в PowerShell… А как насчет… 1 -ne 1 Он вернул Ложь , потому что это утверждение НЕ соответствует действительности. Примеры операторов «Не равно» в PowerShellВ этом разделе я рассмотрю два практических примера оператора PowerShell «Не равно».В первом примере я покажу вам, как использовать оператор «ne» для проверки нескольких значений или условий. Наконец, во втором разделе вы узнаете, как использовать оператор PowerShell «Not Equal» в операторе IF. PowerShell, пример нескольких значений оператора неравенстваЧтобы проиллюстрировать, как использовать оператор «ne» PowerShell для проверки нескольких значений, давайте вернемся к примеру команды Get-Service в предыдущем разделе. Get-Service | Где-Объект -FilterScript {$ _.status -ne "Остановлен"} В этой команде мы использовали оператор PowerShell «Not Equal» для проверки единственного условия. Команда вернула только те службы, которые НЕ имеют статус «Остановлен». Условие проверяется в части команды Where-Object . Вот результат команды: Как и ожидалось, команда вернула ВСЕ службы со статусом «Выполняется». Что делать, если я хочу удалить некоторые службы, даже если их статус «Выполняется»? Я могу добиться этого, добавив несколько значений (или условий) в часть команды Where-Object .Например, допустим, я не хочу возвращать следующие службы — AJRouter , ALG и AppMgmt . Чтобы удалить эти службы из результата, я изменю предыдущую команду, как показано ниже: Get-Service | Where-Object -FilterScript {($ _. Status -ne "Остановлен") -and ($ _. Name -ne " AJRouter ") -and ($ _. Name -ne " ALG ") - и ($ _. Name -ne " AppMgmt ")} Результат измененной команды не включает эти 3 службы! Кроме того, вы можете изменить результат последней команды, используя «или» вместо «и». Например, чтобы вернуть все серверы без имени «AppIDSvc» ИЛИ все службы со статусом НЕ равным «работает», выполните следующую команду: Get-Service | Where-Object -FilterScript {($ _. Status -ne "работает") -or ($ _. Name -ne "AppIDSvc")} К сожалению, результат не очень полезный. Причина, по которой это не очень полезно, заключается в следующем: хотя я хотел исключить службы со статусом НЕ равно остановлен, у меня есть второе условие, связанное с «или» — результат включал обе службы со статусом «Выполняется» и «Остановлен». В любом случае, я просто хотел проиллюстрировать, как тестировать несколько условий с помощью оператора PowerShell «Не равно»! Как использовать PowerShell, НЕ равный заявлению ifВ этом примере я создам сценарий, который создает папки, используя имена в текстовом файле ниже. Вот сценарий, который создает папки, используя имена, показанные в текстовом файле, показанном выше: $ FolderPath = "D: \ PS-Tutorial \ NewFolders" $ TextFilePath = "D: \ PS-Tutorial \ имена-папок.текст" $ folderNames = Get-Content $ TextFilePath ForEach ($ folderName в $ folderNames) { $ checkPath = Test-Path $ FolderPath \ $ имя папки Если ($ checkPath -ne $ true) { New-Item -Path $ FolderPath -Name $ folderName -ItemType "каталог" | Out-Null} } Перед запуском сценария вот папка, сохраненная в переменной FolderPath (строка 1 кода). Папка пуста. Если вы хотите попробовать сценарий, измените следующие переменные на существующий путь на вашем компьютере: $ FolderPath : путь к папке, в которой вы хотите создать новые папки. Наконец, чтобы выполнить сценарий, скопируйте его в PowerShell ISE и запустите. После запуска сценария папки были созданы в папке, указанной в переменной FolderPath . Ниже я объяснил, что делает каждая строка скрипта. Обратите внимание на путь к оператору PowerShell «Не равно» — «$ checkPath -ne $ true», часть — строка 6. $ FolderPath = "D: \ PS-Tutorial \ NewFolders" $ TextFilePath = "D: \ PS-Tutorial \ имена-папок.текст" $ folderNames = Get-Content $ TextFilePath ForEach ($ folderName в $ folderNames) { $ checkPath = Test-Path $ FolderPath \ $ имя папки Если ($ checkPath - ne $ true) { New-Item -Path $ FolderPath -Name $ folderName -ItemType "каталог" | Out-Null} } Вот объяснение каждой строчки скрипта:
$ FolderPath = "D: \ PS-Tutorial \ NewFolders"
$ TextFilePath = "D: \ PS-Tutorial \ folder-names.txt"
$ folderNames = Get-Content $ TextFilePath
ForEach ($ folderName в $ folderNames) {
$ checkPath = Test-Path $ FolderPath \ $ folderName
Если ($ checkPath - ne $ true) {
New-Item -Path $ FolderPath -Name $ folderName -ItemType "directory" | Out-Null } Если вы запустите команду New-Item , не связав ее с командой Out-Null , отобразятся сведения о созданной папке.
} Вот и все! Наше обновленное руководство оператора PowerShell «Не равно» (ne). Надеюсь, это руководство было для вас полезным. Если вы нашли его полезным, проголосуйте за Да на вопрос «Был ли этот пост полезным» ниже. Кроме того, вы можете задать вопрос, оставить комментарий или оставить отзыв с помощью формы «Оставить ответ» в конце этой страницы. Наконец, дополнительные технические Itechguides по PowerShell можно найти на нашей странице практических рекомендаций по Windows PowerShell. Вы также можете найти нашу страницу Работа с домашней страницы очень полезной. Эта статья была полностью переписана и дополнена новыми примерами. Ссылки и дополнительная литература
PowerShell — объяснение условных операторов и операторов сравненияНекоторое время назад мне задали вопрос, что означают операторы ‘-eq’, ’-lt’ и ‘-ne’, что это еще за операторы и что еще я мог о них рассказать.Я думаю, что это хорошая тема для сообщения в блоге, поскольку большинство начинающих сценаристов PowerShell не знают, какие операторы им доступны … и для вашего удобства я привел несколько примеров из реальной жизни Есть два вида: операторы сравнения и логические операторы. Операторы сравнения
Логические операторы
|