PowerShell - Проверьте, является ли переменная нулевой или пустой
Одна из самых распространённых задач при написании скрипта — это проверка, является ли переменная NULL или пустой в PowerShell. Пустые или нулевые значения всегда несколько сложны, потому что что именно считается нулевым?
Проверка, является ли значение нулевым или нет, стала гораздо проще в PowerShell 7 благодаря операторам объединения с Null. Этот оператор исключает необходимость в условных операторах if-else для проверки, является ли значение Null или нет.
В этой статье я объясню, как проверить, является ли значение нулевым, ненулевым или просто пустым. Мы рассмотрим новый оператор объединения нулей и почему важно начинать с переменной $null в сравнении.
Что такое Null
Когда мы говорим о NULL в языках программирования или скриптовых языках, мы можем предположить, что это переменная, у которой нет значения. Однако в PowerShell Null может быть либо пустым значением, либо неизвестным значением.
Значение NULL записывается как $null в PowerShell, и это одна из автоматических переменных. Это объект со значением NULL. Это позволяет использовать $null в качестве заполнителя в коллекциях или присвоить его переменной.
Хороший способ продемонстрировать это - создать коллекцию и подсчитать её длину. Как вы можете увидеть в приведённом ниже примере, объект $null учитывается как один из объектов в коллекции:
$fruits = "Apple", $null, "Pear"
$fruits.count
3NULL против Пустого
Кроме значений $null, в PowerShell могут быть также пустые значения. Разница между ними заключается в том, что пустое значение - это переменная, которая объявлена и присвоено ей фактическое пустое значение.
Если мы посмотрим на пример ниже, то первая переменная равна $null, даже если мы не присвоили ей переменную NULL. Другие переменные не равны null, но являются пустыми.
Null variable
$variableIsNull
Empty string variable
$emptyString = ""
Empty array variable
$emptyArray = @()Проверьте, является ли значение null в PowerShell
Существует несколько способов проверить, является ли переменная или результат NULL в PowerShell. Рекомендуемый способ проверки, является ли значение NULL, — это сравнить $null с этим значением:
if ($null -eq $value) {
Write-Host 'Variable is null';
}Важно отметить, что описанный выше метод возвращает истинное значение в двух случаях. Когда значение равно NULL, как вы могли бы ожидать, но также и когда переменная не определена.
Когда вы хотите проверить, не является ли значение нулевым, вы можете использовать оператор сравнения -ne вместо:
if ($null -ne $value) {
Write-Host 'Variable is not null';
}Другой распространенный способ проверить, является ли значение Null, - это просто использовать оператор if без каких-либо сравнений. Это также работает, но делает больше, чем просто проверка, является ли значение null. Сравнение ниже фактически выполнит следующее:
- не ноль
- не пусто
- не 0
- не массив,
- Длина не равна 0
- не $ложь
if ($value) {
Write-Host 'Variable is not null or empty';
}Нуль с левой стороны
Когда вы используете Visual Studio Code или другой IDE для написания своих скриптов PowerShell, вы получите предупреждение, когда вы разместите переменную $null с правой стороны в сравнении. На это есть хорошая причина.
В некоторых случаях размещение $null на правой стороне может привести к неожиданным результатам. Например, рассмотрим массив ниже. Если мы разместим $null слева, то он проверит, является ли $null неравным нашему $array, чем он и не является, поэтому возвращает true.
Array
$a = 1, 2, $null, 4, $null, 6
Check if the Array is not empty (null)
$null -ne $a # returns true
Return everything from the array that is not Null
$a -ne $null
Returns
1
2
4
6Но когда вы помещаете $null на правую сторону, тогда он вернёт все элементы массива, которые не равны $null.
Оператор слияния с нулем
Если вы используете PowerShell 7, а вы действительно должны это делать, то вы можете использовать один из новых операторов условного доступа, чтобы быстро проверить, является ли переменная или свойство равным null или нет. Таким образом, вам не нужно каждый раз писать операторы if, когда вы хотите только проверить, является ли переменная равной null.
Оператор объединения нулей ?? возвращает значение с левой стороны, если оно не равно нулю. Если же значение слева равно нулю, то он возвращает результат с правой стороны.
$nullableVariable = $null
If $nullableVariable equal NULL, return "Default Value"
$defaultValue = $nullableVariable ?? "Default Value"
Result of $defaultValue
The value is: Default ValueМы также можем использовать этот метод для проверки результата функции и вызова другой функции или команды, если результаты равны null:
function Get-LastUsedDate {
return $null
}
Use null-coalescing operator to handle null return value
$result = (Get-LastUsedDate) ?? (Get-Date).ToShortDateString()Также возможно соединить несколько операторов объединения с нулевыми значениями, чтобы найти или вернуть первую переменную, которая не является нулевой.
Define a chain of variables where one may be null
$firstVariable = $null
$secondVariable = "Value 2"
Use null-coalescing operator to choose the first non-null value
$chosenValue = $firstVariable ?? $secondVariable ?? "No value found"
Output the chosen value
Write-Host "Chosen value: $chosenValue"Оператор присваивания с нулевым объединением
Оператор присваивания с объединением по нулю ??= упрощает проверку того, является ли переменная с левой стороны оператора нулевой или нет, и присваивает ей значение справа, если оно является нулевым.
В приведенном ниже примере мы проверяем, является ли переменная $existingValue нулевой или нет. Если она нулевая, мы устанавливаем переменную равной значению по умолчанию:
Variable that may or may not have a value
$existingValue = "Existing Value"
Assign a new value using the Null-coalescing assignment operator
$existingValue ??= "Default Value"
Result of $existingValue
Existing ValueОператоры условной нулевой проверки ?. и ?[]
Новые операторы в PowerShell 7.1 — это операторы условной проверки на null ?. и ?[]. Эти операторы позволяют безопасно получать доступ к свойствам и элементам объекта, который может быть равен null.
Если вы обращаетесь к свойству или элементу без оператора условного доступа null, вы обычно не получите ошибку. Только если вы используете строгий режим, вы получите ошибку. Поэтому в таких случаях важно проверить, не пытаетесь ли вы обратиться к члену объекта со значением null.
Empty object
$cities = $null
Set strictmode for test
Set-StrictMode -Version 2
Will throw an error
$cities.language
No error with null-conditional operator
${cities}?.languageПроверьте, пусто ли в PowerShell
Кроме проверки, является ли значение Null, ещё одной распространённой практикой является проверка, является ли значение пустым. Вы можете проверить, является ли строка или массив пустыми, только в PowerShell.
Чтобы проверить, пуста ли строка, просто сравните ее с ""
$string = ""
if ($string -eq "") {
write-host "Empty string found"
}Если вы хотите проверить, пустой ли массив, лучше всего проверить его длину:
$array = @()
if ($array.Count -gt 0) {
write-host "Array is not empty"
}ЯвляетсяNullOrEmpty
При работе со строками вы также можете использовать статическую строковую функцию, чтобы проверить, является ли значение либо null, либо пустым. Если вы хотите узнать, что значение не является ни null, ни пустым, то вам нужно просто поставить -not перед ним.
$string = $null
if ([String]::IsNullOrEmpty($string)) {
write-host "Empty string"
}
Check if not empty or null
if (-not [String]::IsNullOrEmpty($string)) {
write-host "Striong is Not empty"
}
Проверка на Null в функции
Когда вы создаете собственные функции в PowerShell, вы можете убедиться, что параметр не равен нулю и не пуст, используя валидатор ValidateNotNullOrEmpty. Таким образом, вам не придется делать дополнительные проверки в функции.
function Test-Input {
param(
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$input
)
Write-Host "Input received: $input"
}
Test the function
Test-Input -input "Hello"Завершение
Проверка на нулевые значения делает ваш скрипт более надежным и приводит к меньшему количеству ошибок в вашем скрипте. Обязательно попробуйте новые операторы объединения с нулем в PowerShell, так как они довольно удобны в работе.
Также убедитесь, что вы всегда оставляете значения $null с левой стороны сравнения.
Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже!
