2009-02-04 5 views
14

मैंने अभी कुछ पावरशेल स्क्रिप्टिंग करना शुरू कर दिया है, और मैं किसी मान के लिए परीक्षण परीक्षण चर में चल रहा हूं। मैं गूंगा गलतियों को पकड़ने के लिए, सभी चेतावनियों के साथ सब कुछ चलाने की कोशिश करता हूं, खासकर जब मैं सीख रहा हूं। इसलिए, मैं सीटीपीवी 3 का उपयोग कर रहा हूं और "सेट-सख्तोड-वर्जन नवीनतम" के साथ सख्त मोड सेट कर रहा हूं। लेकिन मैं एक मूल्य के लिए आने वाले चर की जांच के साथ एक रोड ब्लॉक में भाग रहा हूँ। ये चर पहले ही सेट हो सकते हैं या नहीं भी हो सकते हैं।पावरशेल - मैं "सेट-स्ट्रिक्टोड-वर्जन नवीनतम" के साथ एक चर वैल्यू के लिए कैसे परीक्षण करूं?

# 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 का दोहराव उपयोग (अग्रणी $ के साथ और बिना)। ऐसा लगता है कि बहुत त्रुटि प्रवण है। तो, इसके बजाय मैं एक subroutine का उपयोग करना होगा:

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

Set-Variable 

का उपयोग करें क्या यह उत्तर स्वीकार करते हैं। रॉय ने आपको जवाब देने का उत्कृष्ट काम किया है। वह इसके लिए क्रेडिट का हकदार है। – EBGreen

3

सबसे पहले मुझे रॉय का जवाब पसंद है, पूर्ण और संक्षेप में। मैं बस उल्लेख करना चाहता था कि ऐसा लगता है कि आप केवल एक चर सेट करने की कोशिश कर रहे हैं यदि यह पहले से सेट हो चुका है। यह केवल पढ़ने योग्य चर, या स्थिरांक के लिए एक नौकरी की तरह लगता है।

एक चर केवल पढ़ने के लिए, एक निरंतर बनाने के लिए, से 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.