2009-02-04 180 views
14

我剛開始做一些PowerShell腳本,並且遇到了測試變量值的問題。我嘗試在所有警告都啓用的情況下運行,特別是在我學習的時候,以便發現愚蠢的錯誤。所以,我正在使用CTPV3並使用「set-strictmode -version latest」設置嚴格模式。但是我正在通過檢查傳入變量來檢查值。這些變量可能已經或可能未被設置。PowerShell - 如何使用「Set-StrictMode -version latest」測試變量值?

# all FAIL if $var is undefined under "Set-StrictMode -version latest" 
if (!$var) { $var = "new-value"; } 
if ($var -eq $null) { $var = "new-value"; } 

我無法找到一個方法來測試一個變量的變量丟失時,除非我關閉嚴格模式不會導致警告的值。我不想爲了測試變量而在所有地方開啓和關閉嚴格的模式。我確信我會忘記把它放回原處,看起來非常混亂。這是不對的。我錯過了什麼?

回答

39

你真的在這裏測試兩件事情,存在和價值。存在測試是在嚴格模式操作下發出警告的人。所以,分開測試。記住,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"} 

希望有幫助。

+2

請接受這個答案。羅伊在爲你提供答案方面做得非常出色。他值得信任。 – EBGreen 2009-02-05 14:42:10

3

首先,我愛羅伊的答案,完整和簡潔。我只是想提一下,看起來你只是想設置一個變量,如果它已經被設置。這看起來像只讀變量或常量的工作。

爲了使變量只讀,常量,使用

Set-Variable 

get-help Set-Variable -full

-- ReadOnly: Cannot be deleted or changed without the Force parameter. 
-- Constant: Cannot be deleted or changed. Constant is valid only when 
creating a new variable. You cannot set the Constant option on an 
existing variable.