PowerShell: केवल एक आदेश के लिए एक पर्यावरण चर सेट करना


99

लिनक्स पर, मैं कर सकता हूँ:

$ FOO=BAR ./myscript

कॉल करने के लिए "myscript" पर्यावरण चर FOO सेट किया जा रहा है।

क्या PowerShell में ऐसा कुछ संभव है, यानी पहले चर को सेट किए बिना, कमांड को कॉल करें, और फिर चर को फिर से अनसेट करें?

मेरे उपयोग के मामले के बारे में अधिक स्पष्ट होने के लिए - मैं इसे स्क्रिप्ट के भाग के रूप में उपयोग नहीं करना चाहता। बल्कि, मेरे पास एक तृतीय-पक्ष स्क्रिप्ट है जिसका व्यवहार मैं पर्यावरण चर का उपयोग करके नियंत्रित कर सकता हूं, लेकिन, इस मामले में, कमांड लाइन तर्क नहीं। इसलिए टाइपिंग के बीच वैकल्पिक करने में सक्षम है

$ OPTION=1 ./myscript

तथा

$ ./myscript

बस बहुत काम आएगा।


मुझे लगता है कि मेरा सवाल यह होगा कि आपको ऐसा करने की आवश्यकता क्यों होगी? मुझे लगता है कि एक बेहतर उपाय है।
ईबीग्रीन

20
यह आमतौर पर एक सहायक सवाल नहीं है, @EBGreen। तथ्य यह है कि क्षमता UNIX के गोले में है, यह सुझाव देता है कि इसके लिए एक उपयोग है। मेरे सिर के ऊपर से: उपयोगकर्ता नाम और ईमेल पते को नियंत्रित करने के लिए कमिट का उपयोग करता है। उन लोगों के लिए कोई कमांड-लाइन विकल्प नहीं है - आपको उन्हें या तो ~ / .itconfig, .it / config में प्रत्येक रिपॉजिटरी में सेट करना होगा, या एन्वार करना होगा। उन विकल्पों में से, envars स्पष्ट रूप से ऑन-द-फ्लाई (और फ़ाइलों में मान को आसानी से ओवरराइड करना) सेट करना आसान है। इसलिए अगर मैं अपने लेखक का नाम "git कमिट" के लिए शब्‍दशिल्‍प में बदलना चाहता हूं, तो यह कैसे करना है?
मार्क रीड रीड

2
पूरी तरह से सहमत हूं कि यह पूछना कि यह क्यों व्यर्थ है। यह लिनक्स पर कमांड लाइन पर निष्पादित करते समय बोर्स्क के रूप में आम है और हम में से जिन लोगों को अब शक्तियां (एक कृत्रिम दुःस्वप्न अगर कभी अस्तित्व में थी) के साथ पीड़ित होने के लिए मजबूर किया जाता है, तो उन्हें स्पष्ट तकनीकों के जवाबों की तलाश करनी होती है। जब तक आप तुच्छ चीजें करने के लिए लंबी स्क्रिप्ट लिखने की गिनती नहीं करते हैं, तब तक अधिकांश समय, वे शक्तियां में भी मौजूद नहीं होते हैं। मुझे उस खोल से गहराई से गिनो ...
किम


1
लिंक के लिए धन्यवाद, @FranklinYu, लेकिन इस बिंदु पर यह v7.0 के बाद भी नहीं-दूर के भविष्य के संस्करण में एक उम्मीद है
mklement0

जवाबों:


55

आमतौर पर, वैश्विक (पर्यावरण) चर के बजाय पैरामीटर के माध्यम से स्क्रिप्ट को जानकारी देना बेहतर होगा। लेकिन अगर वह है जो आपको करने की आवश्यकता है तो आप इसे इस तरह से कर सकते हैं:

$env:FOO = 'BAR'; ./myscript

पर्यावरण चर $ env: FOO को बाद में इस तरह हटाया जा सकता है:

Remove-Item Env:\FOO

2
बस एक विचार: क्या आप सिर्फ एक नई पॉवरशेल प्रक्रिया नहीं कर सकते हैं, स्क्रिप्ट-इन को -कमांड पैरामीटर के माध्यम से सौंप दें? इस तरह आपको बाद में पर्यावरण को साफ करने की आवश्यकता नहीं है, क्योंकि यह बाल प्रक्रिया में निहित होगा। हालाँकि मैं एक PowerShell MVP से बात कर रहा हूँ, इसलिए यह शायद काम नहीं करता है :-)
जॉय

2
कीथ, हमारे पास इस परिदृश्य के लिए Pscx में एक पुश-एनवायरब्लॉक और पॉप-एनवायरब्लॉक है ;-)
x0n

2
जोहान्स, कि के रूप में अच्छी तरह से काम करेगा, लेकिन किसी तरह धोखा दे रहा है। :-) PSCX पुश / पॉप-एनवायरब्लॉक (एक जिसे मैंने इस तरह से काम करने के लिए बदल दिया है) काम करेगा, लेकिन इसमें स्वचालित सफाई समर्थन नहीं है जो एक स्क्रिप्टब्लॉक है।
कीथ हिल

1
क्या आपको env:fooइसे हटाने के बजाय इसके पुराने मूल्य (शायद परेशान) पर वापस सेट करने की आवश्यकता नहीं है?
चावर

1
के रूप में @Joey उल्लेख किया है, अगर आप env सफाई से वार्स क्या करना चाहते हैं, तो आप कर सकते हैं: & {$pre = $env:foo; $env:foo = 'bar'; ./myscript; if ($pre) {$env:foo = $pre} else {Remove-Item env:\foo}... कुछ लोग कह सकते बोझल , लेकिन साइड इफेक्ट से बचने होगा ...
लुकास

13

मुझे इस समस्या के बारे में पर्याप्त प्रेरणा मिली कि मैं आगे बढ़ा और इसके लिए एक स्क्रिप्ट लिखी: with-env.ps1

उपयोग:

with-env.ps1 FOO=foo BAR=bar your command here

# Supports dot-env files as well
with-env.ps1 .\.env OTHER_ENV=env command here

दूसरी ओर, यदि आप Gow स्थापित करते हैं तो आप उपयोग कर सकते हैं env.exeजो कि मेरे द्वारा लिखी गई त्वरित स्क्रिप्ट की तुलना में थोड़ा अधिक मजबूत हो सकता है।

उपयोग:

env.exe FOO=foo BAR=bar your command here

# To use it with dot-env files
env.exe $(cat .env | grep.exe -v '^#') SOME_OTHER_ENV=val your command

5

एक लाइन में करने के 2 आसान तरीके:

$env:FOO='BAR'; .\myscript; $env:FOO=''
$env:FOO='BAR'; .\myscript; Remove-Item Env:\FOO

बस अन्य उत्तरों से जानकारी संक्षेप में लीजिये (आप लोगों का धन्यवाद) जिसमें किसी कारणवश शुद्ध वन-लाइनर्स नहीं हैं।


4

यूनिक्स सिंटैक्स के बराबर को पूरा करने के लिए, आपको न केवल पर्यावरण चर सेट करना होगा, बल्कि कमांड निष्पादित करने के बाद आपको इसे अपने पूर्व मूल्य पर रीसेट करना होगा। मैंने इसे अपने PowerShell प्रोफ़ाइल के समान कार्यों को जोड़कर उपयोग किए जाने वाले सामान्य आदेशों के लिए पूरा किया है।

function cmd_special()
{
  $orig_master = $env:app_master
  $env:app_master = 'http://host.example.com'
  mycmd $args
  $env:app_master = $orig_master
}

तो mycmdकुछ निष्पादन योग्य है जो पर्यावरण चर के मूल्य के आधार पर अलग-अलग संचालित होता है app_master। परिभाषित करने से cmd_special, मैं अब पर्यावरण चर सेट के cmd_specialसाथ कमांड लाइन (अन्य मापदंडों सहित) से निष्पादित कर सकता हूं app_master... और यह कमांड के निष्पादन के बाद रीसेट (या यहां तक ​​कि परेशान) हो जाता है।

संभवतया, आप एकल आह्वान के लिए भी इस विज्ञापन को कर सकते हैं।

& { $orig_master = $env:appmaster; $env:app_master = 'http://host.example.com'; mycmd $args; $env:app_master = $orig_master }

यह वास्तव में इससे आसान होना चाहिए, लेकिन जाहिर तौर पर यह एक ऐसा उपयोग-मामला नहीं है जो पावरशेल द्वारा आसानी से समर्थित है। शायद भविष्य का संस्करण (या तृतीय-पक्ष फ़ंक्शन) इस उपयोग-मामले को सुविधाजनक बनाएगा। यह अच्छा होगा यदि PowerShell में एक cmdlet था जो यह करेगा, जैसे:

with-env app_master='http://host.example.com' mycmd

शायद एक PowerShell गुरु सुझाव दे सकता है कि कोई ऐसे cmdlet कैसे लिख सकता है।


0

यह देखते हुए कि सीएमडी विंडोज कर्नेल पर देशी सीएलआई है (और अभी भी बहुत सारे टूल के लिए ऑटोमेशन इंटरफेस है), आप powershell.exeसीएमडी प्रॉम्प्ट या सीएमडी कंसोल स्टेटमेंट को स्वीकार करने वाले इंटरफेस से अपनी पॉवरशेल स्क्रिप्ट निष्पादित कर सकते हैं ।

यदि आप -Fileअपनी स्क्रिप्ट को पास करने के लिए पैरामीटर का उपयोग कर रहे हैं powershell.exe, तो स्क्रिप्ट तक पहुंचने के लिए पर्यावरण चर सेट करने के लिए कोई अन्य PowerShell कोड का उपयोग नहीं किया जा सकता है, इसलिए इसके बजाय आप कॉल करने से पहले अपने पर्यावरण चर को CMD वातावरण में सेट कर सकते हैं powershell.exe:

> set foo=bar && powershell.exe -File .\script.ps1

एक एकल &भी काम करेगा, लेकिन अगर setकिसी कारण से विफल हो गया तो कमांड को जारी रखने की अनुमति देगा । (क्या यह भी संभव है? मुझे कोई पता नहीं है।)

इसके अलावा, इसे "foo=bar"उद्धरणों में लपेटने के लिए सुरक्षित हो सकता है ताकि निम्नलिखित कुछ भी setचर सामग्री के रूप में पारित न हो ।



-5

आप वेरिएबल्स को फंक्शन्स और स्क्रिप्ट्स में स्कोप कर सकते हैं।

$script:foo = "foo"
$foo
$function:functionVariable = "v"
$functionVariable

यदि आप औपचारिक होना चाहते हैं और नए-चर का उपयोग करके अपने चर की घोषणा करना चाहते हैं तो नए-परिवर्तनीय में एक -स्कोप पैरामीटर भी है।


1
हम्म् ... नहीं लगता कि यह उत्तर यहां लागू होता है। PowerShell चर पर्यावरण चर नहीं हैं। प्रश्न के आधार पर, पूछनेवाला पर्यावरण चर का उपयोग स्क्रैच स्पेस के रूप में नहीं कर रहा है (जैसे कि सीएमडी में एक होगा [यदि ऐसा होता तो यह उत्तर लागू होता]], लेकिन बाहरी आदेश लागू करने से पहले पर्यावरण में हेरफेर करने की आवश्यकता है और फिर बहाल करें पर्यावरण बाद में (या उस प्रभाव के लिए कुछ)।
चावर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.