Windows cmd.exe में एक ही कमांड लाइन के भीतर चर सेट करना और उपयोग करना


75

बैश में, मैं कर सकता हूं EDITOR=vim commandऔर सेट के commandसाथ चला EDITORजाऊंगा vim, लेकिन यह EDITORशेल में स्वयं के मूल्य को प्रभावित नहीं करेगा । क्या इसमें ऐसा करना संभव है cmd.exe?

जवाबों:


52

ध्यान दें कि cmd /C "set "EDITOR=vim" && echo %EDITOR%"काम नहीं करेगा।
और न ही होगाcmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

/Vविलम्ब के !रूप में विलंबित पर्यावरण चर विस्तार को सक्षम करने के लिए, विकल्प क्या होगा ।

C:\> cmd /V /C "set EDITOR=vim&& echo !EDITOR!"
vim

के रूप में नीचे का उल्लेख द्वारा maoizm , यह है cmd /V /C, नहीं cmd /C /V (जो होता नहीं काम करते हैं)


मैं किसी भी व्यावहारिक कारण के बारे में नहीं सोच सकता, जिसे आप वास्तव में एकल कमांड के संदर्भ में चाहते हैं

आमतौर पर, आपको इसकी आवश्यकता तब होती है जब आपको एक लंबी कमांड लाइन में कई बार उपयोग किए जाने वाले मान को बदलना पड़ता है।
उदाहरण के लिए, Nexus (पठनीयता के लिए कई पंक्तियों में) के लिए एक फ़ाइल तैनात करने के लिए:

cmd /v /c "set g=com.agroup&& set a=anArtifact&& set v=1.1.0&& \
           mvn deploy:deploy-file -Dfile=C:\path\!a!-!v!.jar \
           -Dpackaging=jar -DgroupId=!g! -DartifactId=!a! -Dversion=!v! \
           -DrepositoryId=nexus 
           -Durl=http://myserver/nexus/content/repositories/my-repo/"

एक लंबी और जटिल कमांड लाइन में समूह, विरूपण साक्ष्य (2 बार उपयोग किया गया) और संस्करण को प्रतिस्थापित करने के बजाय, आप उन्हें उक्त कमांड की शुरुआत में संपादित कर सकते हैं । पैरामीटर मानों में हेरफेर और परिवर्तन करना स्पष्ट / आसान है।


1
विंडोज 10 संस्करण 1607 के साथ मेरी मशीन पर इसका परीक्षण किया, cmd प्रॉम्प्ट क्रैश।
फर्नांडो कोस्टा बर्टोल्डी

ध्यान दें कि EDITOR को सेट नहीं किया जाएगा, 'vim'लेकिन 'vim 'अंतिम कमांड में। अंत में अंतरिक्ष से बचने के लिए आंतरिक उद्धरण जोड़ें।
ज़िट्रैक्स

@Zitrax राइट! मैंने उसी के अनुसार उत्तर संपादित किया है।
VONC

1
नायब: दिलचस्प: इस मामले में स्विच का क्रम मायने रखता है। cmd /v/c "..." काम करता है, लेकिन cmd /c/v "..."विफल रहता है - उम्मीद है कि यह आपको 15 मिनट बचा सकता है
maoizm

1
@DerekGreer "मैं किसी भी व्यावहारिक कारण के बारे में नहीं सोच सकता": ठीक है, मैंने एक व्यावहारिक कारण जोड़ने का उत्तर संपादित किया है।
वॉनसी

50

आप इसे खिड़कियों में कर सकते हैं जैसे कि कुछ भी स्थापित करने की कोई आवश्यकता नहीं है।

cmd /C "set EDITOR=vim && set"

आपको चर की एक सूची दिखाई देगी और आप EDITOR = vim देखेंगे, अब "सेट" फिर से चलाएँ और इसे सूचीबद्ध नहीं किया जाएगा।

अतिरिक्त कमांड जोड़ने के लिए आप कई और & quot; कर सकते हैं:

cmd /C "set EDITOR=vim && do this && do that && otherstuff"

EDIT: / C दौड़ने के तुरंत बाद नए cmd को बाहर निकाल देता है, यदि आप नए के साथ आउटपुट का उत्पादन करते हैं तो यह अभी भी पैरेंट विंडो में दिखाई देगा।

आप उपयोग कर सकते हैं / K जिस स्थिति में नई cmd विंडो रन के अंत में खुली रहती है।


5
सावधान रहे। वेरिएबल को इस तरह सेट करने से परिणामस्वरूप EDITOR: "vim" वेरिएबल में एक ट्रैंगल स्पेस आ जाएगा। अनुगामी स्थान के उपयोग से बचने के लिए: cmd / C "सेट" EDITOR = vim "&& यह करें और यह करें कि"
Gerd K

1
यह "विंडोज सर्वर 2008" पर काम नहीं कर रहा है, उदाहरण के लिए। मैंने यह कोशिश की: सेट नाम = "उपयोगकर्ता नाम" && गूंज% उपयोगकर्ता नाम%। और उपयोगकर्ता नाम खाली है।
एकोझिन

@akozin क्या आपको एहसास है कि आपको कीवल्यू पीछे की ओर मिला है? क्या आपका मतलब था set name=foo&&echo %name%या set username=foo&&echo %username%?
फ्रॉग्ज़ जूल


7

आप envGNWin32 http://gnuwin32.sourceforge.net/ में पैकेज CoreUtils से पोर्ट किए गए उपयोग का उपयोग कर सकते हैं

  1. इसे सेटअप करें
  2. env.exe% PATH% चर में मौजूद निर्देशिका की जाँच करें
  3. उसी तरह का उपयोग करें जैसे लिनक्स संस्करण env EDITOR=vim command

शायद यह कहने लायक हो कि यदि आपके पास git / docker / msys / cygwin है तो आपके पास पहले से ही इसका एक संस्करण होगा।
xenoterracide

3

मैंने एक बैच फ़ाइल खटखटाया है env.cmdजो कमोबेश लिनक्स envकमांड की तरह काम करती है : -

echo off
setlocal
for %%f in (%*) do (
  echo %%f|find "=" >nul:
  if errorlevel 1 goto DoCmd
  set %%f
  shift
)
:DoCmd
%1 %2 %3 %4 %5 %6 %7 %8 %9
endlocal

फर्क सिर्फ इतना है कि, जिस तरह से cmdपर्स के कारण, पर्यावरण असाइनमेंट को उद्धृत करने की आवश्यकता होती है, इसलिए आपकी आज्ञा होगी:

env "EDITOR=vim" command [up to 8 parameters]

बैच फ़ाइल को forलूप के भीतर कमांड स्ट्रिंग का निर्माण करके 8-पैरामीटर प्रतिबंध को हटाने के लिए विस्तृत किया जा सकता है (विलंबित विस्तार की आवश्यकता होगी)।


बहुत लंबे उपयोगकर्ता कमांड के लिए अनुमति देने के लिए सिर्फ %*पेन लाइन के रूप में (यानी :DoCmdलेबल के बाद एक ) का उपयोग क्यों नहीं किया जाता है ?
स्कॉट

@Scott - क्योंकि %*है मूल पैरामीटर सूची: यह से अप्रभावित है shift(विपरीत $*यूनिक्स में)।
AFH
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.