2009-09-14 14 views
41

लिनक्स पर के लिए एक वातावरण चर सेट करना, मैं कर सकते हैं:Powershell: एक ही आदेश केवल

$ FOO=BAR ./myscript 

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

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

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

$ OPTION=1 ./myscript 

और

$ ./myscript 

टाइपिंग सिर्फ बहुत आसान हो जाएगा के बीच वैकल्पिक करने में सक्षम होने।

+0

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

+6

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

उत्तर

-3

आप फ़ंक्शंस और स्क्रिप्ट्स के चर चरमपंथी कर सकते हैं। यदि आप औपचारिक हो सकता है और नए-चर का उपयोग कर अपने चर घोषित करने के लिए चाहते हैं

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

नई चर भी एक -scope पैरामीटर है।

+0

हम्म ... ऐसा नहीं लगता कि यह उत्तर यहां लागू होता है। पावरशेल वैरिएबल पर्यावरण चर नहीं हैं। प्रश्न के आधार पर, पूछताछ पर्यावरण चर का उपयोग स्क्रैच स्पेस के रूप में नहीं कर रहा है (जैसे कि सीएमडी में होगा [यदि वह मामला था, तो यह जवाब लागू होगा]), लेकिन बाहरी कमांड का आह्वान करने से पहले पर्यावरण में हेरफेर करने की आवश्यकता है और फिर पुनर्स्थापित करें पर्यावरण बाद में (या उस प्रभाव के लिए कुछ)। – chwarr

16

आम तौर पर वैश्विक चर के बजाय पैरामीटर के माध्यम से स्क्रिप्ट को जानकारी पास करना बेहतर होगा। लेकिन अगर है कि तुम क्या करने की जरूरत है और आप चर का स्वत: सफाई चाहते हैं तो इसलिए की तरह एक नया गुंजाइश परिचय क्या है:

& { $foo = 'bar'; $env:foo = 'bar'; ./myscript } 

योग्य कुछ बातें इस बारे में ध्यान देने। सबसे पहले, जब दायरा (स्क्रिप्टब्लॉक) बाहर निकलता है, तो $ foo अब मौजूद नहीं है। यह केवल स्क्रिप्टब्लॉक के संदर्भ में मौजूद था। हालांकि पर्यावरण परिवर्तनीय $ env: foo अभी भी मौजूद है क्योंकि यह वास्तव में एक वैश्विक परिवर्तन है। तुम बहुत तरह कि चर को नष्ट कर सकते हैं:

Remove-Item Env:\foo 
+1

बस एक विचार: क्या आप केवल एक नई पावरशेल प्रक्रिया नहीं कर सकते हैं, इसमें स्क्रिप्टब्लॉक को -Command पैरामीटर के माध्यम से सौंपना? इस तरह आपको पर्यावरण को बाद में साफ करने की ज़रूरत नहीं है, क्योंकि यह बाल प्रक्रिया में निहित होगा। हालांकि मैं पावरशेल एमवीपी से बात कर रहा हूं, इसलिए यह संभवतः काम नहीं करता है :-) – Joey

+2

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

+2

जोहान्स, जो भी काम करेगा लेकिन किसी भी तरह धोखाधड़ी की तरह लगता है। :-) पीएससीएक्स पुश/पॉप-एनवायरनब्लॉक (एक * मैं * इस तरह से काम करने के लिए बदल गया) काम करेगा, लेकिन इसमें स्क्रिप्टब्लॉक के स्वचालित क्लीनअप समर्थन नहीं हैं। –

2

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

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 को परिभाषित करके, अब मैं app_master पर्यावरण चर सेट के साथ कमांड लाइन (अन्य पैरामीटर समेत) से cmd_special निष्पादित कर सकता हूं ... और यह आदेश के निष्पादन के बाद रीसेट (या यहां तक ​​कि अनसेट) हो जाता है।

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

& { $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 

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

0

मैं इस समस्या यह है कि मैं आगे चला गया और इसके लिए एक पटकथा लिखी बारे में पर्याप्त प्रेरित किया गया: 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 
संबंधित मुद्दे