你真的在這裏測試兩件事情,存在和價值。存在測試是在嚴格模式操作下發出警告的人。所以,分開測試。記住,PowerShell中看到的變量只是另一個提供商(就像一個文件或註冊表提供商),並且所有的PowerShell變量文件根的驅動稱爲文件夾存在「變量:」,顯然你可以使用您通常用於測試其他任何文件存在的相同機制。因此,使用「測試路徑」:
if (!(test-path variable:\var)) {$var = $null} # test for EXISTENCE & create
if (!$var) { $var = "new-value"; } # test the VALUE
注意,電流嚴格模式可以在子作用域改變,而不影響父範圍(例如,在腳本塊)。所以,你可以編寫一個腳本塊來封裝去除嚴格模式並設置變量而不影響周圍程序的嚴格性。由於變量範圍的限制,這有點棘手。兩種可能性,我能想到的:
#1 - 從腳本塊返回值
$var = & { Set-StrictMode -off; switch($var) { $null { "new-value" } default { $var } }}
或#2 - 使用範圍修飾符
& { Set-StrictMode -off; if (!$var) { set-variable -scope 1 var "new-value" }}
大概這種最糟糕的部分是容易出錯,重複使用$ var(包含和不包含前導$)。這似乎很容易出錯。所以,相反,我會使用一個子程序:
function set-Variable-IfMissingOrNull ($name, $value)
{
$isMissingOrNull = !(test-path ('variable:'+$name)) -or ((get-variable $name -value) -eq $null)
if ($isMissingOrNull) { set-variable -scope 1 $name $value }
}
set-alias ?? set-Variable-IfMissingOrNull
#...
## in use, must not have a leading $ or the shell attempts to read the possibly non-existant $var
set-VarIfMissingOrNull var "new-value"
?? varX 1
最後這可能是我的腳本方式。
編輯:考慮一下你的問題後,我想出了一個更簡單的函數,更貼近你的編碼風格。試試這個功能:
function test-variable
{# return $false if variable:\$name is missing or $null
param([string]$name)
$isMissingOrNull = (!(test-path ('variable:'+$name)) -or ((get-variable -name $name -value) -eq $null))
return !$isMissingOrNull
}
set-alias ?-var test-variable
if (!(?-var var)) {$var = "default-value"}
希望有幫助。
請接受這個答案。羅伊在爲你提供答案方面做得非常出色。他值得信任。 – EBGreen 2009-02-05 14:42:10