web-dev-qa-db-ja.com

まだ割り当てられていない変数をPowerShellでテストする

変数に変数が割り当てられているかどうかを確認し、そうでない場合はアクションを実行したいと思います。どうすればこれを達成できますか?

次のコードで試してみましたが、エラーが表示されます。「-is」の正しいオペランドは型である必要があります。

この時点では$ ProgramNameは割り当てられていません。

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

割り当てられていない変数の値はnullであり、データ型はnullではありません。だから、これをやってください:

If ($ProgramName -ne $null)

... null以外の値に割り当てられている場合、TRUEを返します。

さらに簡単なチェックは

IF($ProgramName)

これは$nullかどうかをチェックしますが、ロジックは逆なので、次のように使用できます

IF(!$ProgramName)

編集:

Ruffinはstrictmodeについてコメントで良い点を挙げています。この方法も機能します。

たとえば、明示的にグローバルスコープの場合、Test-Path variable:ProgramNameまたはTest-Path variable:global:ProgramName。これは、変数が存在するかどうかに応じて、$trueまたは$falseを返します。

40
JNK

Test-Path variable:\varはあなたがやりたいことをすべきだと思います。

10
David Brabant

JNKとDavidからの(正しい)回答に基づいて、Jwerey Snoverからのこの素晴らしいブログ投稿をチェックして、PoweShellでのブール式のすべての使用例を紹介します。最後に、変数の存在をテストする方法を示します。

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

3
Andy Arismendi

上記の回答に反する

Test-Path variable:ProgramName  

それは変数の存在をテストするだけなので、あなたが探しているものではないかもしれません。変数が$ nullに設定されている場合でも、$ trueを返します。

したがって、strictmodeでは、その存在の有無と空でないかどうかをテストする必要があります。

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

厳密モードは、スクリプトの面白さの一部を取り除きます...

2
Jason Thurston