आप वास्तव में यहां दो चीजों, अस्तित्व और मूल्य के लिए परीक्षण कर रहे हैं। और अस्तित्व परीक्षण सख्त मोड ऑपरेशन के तहत चेतावनियों का कारण बनता है। तो, परीक्षण अलग करें। याद है कि 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"}
आशा है कि मदद करता है।
का उपयोग करें क्या यह उत्तर स्वीकार करते हैं। रॉय ने आपको जवाब देने का उत्कृष्ट काम किया है। वह इसके लिए क्रेडिट का हकदार है। – EBGreen