PowerShell тестирует переменную, которую еще не присваивают - PullRequest
18 голосов
/ 07 февраля 2012

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

Я попытался сделать это с помощью следующего кода, но получил сообщение об ошибке: Правый операнд -is должен иметь тип.

$ ProgramName не назначено на этом этапе.

If ($ProgramName -isnot $null) {
    $ProgramName = $ProgramName + ', ' + $cncPrograms
}
Else {
    If ($cncPrograms -isnot $null) {
    $ProgramName = $cncPrograms 
    }
}

Ответы [ 4 ]

38 голосов
/ 07 февраля 2012

Любая неназначенная переменная будет иметь значение null, а не тип данных null.Итак, просто сделайте это:

If ($ProgramName -ne $null)

... который вернет TRUE, если ему присвоено ненулевое значение.

Еще более простая проверка -

IF($ProgramName)

Который проверит, является ли это $null или нет, хотя логика обратная, поэтому вы можете использовать

IF(!$ProgramName)

Редактировать:

Раффин поднимает хороший вопрос о строгом режиме в комментариях.Этот метод также будет работать:

Test-Path variable:ProgramName или Test-Path variable:global:ProgramName, если он, например, явно глобально ограничен.Это вернет $true или $false в зависимости от того, существует ли переменная.

9 голосов
/ 07 февраля 2012

Test-Path variable:\var должен делать то, что вы хотите, я думаю.

3 голосов
/ 08 февраля 2012

Чтобы опираться на (правильные) ответы от JNK и Дэвида, ознакомьтесь с этим замечательным сообщением в блоге от Джеффри Сновера, в котором рассказывается обо всех случаях использования логических выражений в PoweShell. В заключение рассказывается, как проверить наличие переменной.

http://blogs.msdn.com/b/powershell/archive/2006/12/24/boolean-values-and-operators.aspx

1 голос
/ 25 апреля 2018

Вопреки ответам выше

Test-Path variable:ProgramName  

Возможно, это не то, что вы ищете, потому что оно проверяет только наличие переменной. Если переменная установлена ​​в $ null, она все равно вернет $ true.

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

Set-StrictMode -version Latest
#TODO Add a scope parameter
Function IsEmpty([string]$varname){
   if (Test-path "variable:$varname"){ 
      $val=(gi "variable:$varname").value
      if ($val -is [bool]) {$false}
      else {$val -eq '' -or $val -eq $null} }
   else{ $true }
}

#TEST:
if (test-path variable:foobar){remove-variable foobar} ; IsEmpty foobar
$foobar=$null; IsEmpty foobar
$foobar='';  IsEmpty foobar;
$foobar=$false;  IsEmpty foobar

#Results:
True
True
True
False

Строгий режим немного увлекает скрипты ...

...