Windows cmd में, मैं उपयोगकर्ता इनपुट के लिए संकेत कैसे करूं और परिणाम को किसी अन्य कमांड में उपयोग करूं?


397

मेरे पास एक .bat फ़ाइल है जिसे मैं उपयोगकर्ता इनपुट को स्वीकार करना चाहूंगा और फिर कॉल के भाग के रूप में उस इनपुट के परिणामों का उपयोग अतिरिक्त आदेशों तक करूंगा।

उदाहरण के लिए, मैं उपयोगकर्ता से एक प्रक्रिया आईडी स्वीकार करना चाहूंगा, और फिर उस आईडी के खिलाफ jstack चलाऊंगा, jstack कॉल के परिणामों को एक फ़ाइल में डाल दूंगा। हालाँकि, जब मैं यह कोशिश करता हूं, तो यह काम नहीं करता है।

यहाँ मेरा नमूना बैट फ़ाइल सामग्री है:

@echo off
set /p id=Enter ID: 
echo %id%
jstack > jstack.txt

और यहां jstack.txt में क्या दिखाया गया है:

आईडी दर्ज करें: बैच की नौकरी समाप्त करें (Y / N)? 

2
"बैच की नौकरी (वाई / एन) को समाप्त करें?" जब आप अपने .bat को चला रहे होते हैं तो आमतौर पर जब आप ctrl-c को मारते हैं, तब दिखाई देता है।
जिम बक 19

2
Jstack.txt में jstack से आउटपुट होगा और आपकी बैच फ़ाइल से संबंधित कुछ भी नहीं है और आपने यह भी नहीं कहा है कि Jstack क्या है।
sgmoore

1
क्या इनमें से कोई जवाब काम नहीं आया? यदि नहीं, तो क्या आपको कोई समाधान मिला? यदि आपने किया है, तो यदि आप इसे यहां स्व-उत्तर के रूप में पोस्ट करते हैं तो यह उपयोगी होगा।
मासल

1
आप निवेश के लिए तय विकल्प चाहते हैं तो आप का उपयोग कर बेहतर कर रहे हैं choiceकी तुलना मेंset /p
icc97

2
कृपया मेरी पोस्ट को उत्तर के रूप में चिह्नित करें, इसका सार यह है कि बैच प्रोग्राम चलाते समय आप प्रॉम्प्ट पर एक आईडी की आपूर्ति करने के बजाय Enter दर्ज करें, और इसलिए% आईडी% Enter ID: कुछ आईडी के बजाय आप से आपूर्ति करने वाले थे। कुंजीपटल।
पशूट

जवाबों:


458

इसे इस्तेमाल करे:

@echo off
set /p id="Enter ID: "

फिर आप %id%किसी अन्य बैच फ़ाइल जैसे पैरामीटर के रूप में उपयोग कर सकते हैं jstack %id%

उदाहरण के लिए:

set /P id=Enter id: 
jstack %id% > jstack.txt

2
क्या SET कमांड के आउटपुट को NIL में पाइप करने का कोई तरीका है:, ताकि आप टाइपिंग को छिपा सकें? जैसे अगर आप a: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:करना चाहते थे और विंडो में पासवर्ड टेक्स्ट नहीं दिखाना चाहते थे, तो अकेले "DosKey" कमांड बफर में दिखाएं? मैंने कई अलग-अलग तरीकों की कोशिश की है, और ऐसा करने का कोई तरीका नहीं खोज पाया है, इनपुट लेने के लिए थोड़ा सी प्रोग्राम लिखने के बाहर, और इसे एन्वार को असाइन करने के लिए, लेकिन यह धोखा है! :) मैं यह सिर्फ विंडोज सीएमडी के साथ काम करना चाहते हैं।
लैरीफ


4
अंतरिक्ष के अंत में जोड़े गए नॉट को नोट करें "Enter ID: "। प्रॉम्प्ट और उपयोगकर्ता उत्तर के बीच एक छोटा सा स्थान देता है। Delete the internet?No sillyबनाम Delete the internet? No silly
icc97

उद्धरणों की कोई आवश्यकता नहीं है। क्या @Instantsoup गायब था लाइन में '% id%' थाjstack %id% > jstack.txt
रात 10:43

1
का उपयोग करें SETLOCALऔर ENDLOCALयदि आप चाहते हैं कि चर को वर्तमान बैच में रखें। देखें ss64.com/nt/endlocal.html
endo64

99

वाक्य रचना इस प्रकार है: set /p variable=[string]

की जाँच करें http://commandwindows.com/batch.htm या http://www.robvanderwoude.com/userinput.php विंडोज ओएस बैच फ़ाइलों के विभिन्न संस्करणों के साथ उपयोगकर्ता इनपुट में एक और अधिक गहरा गोता के लिए।

एक बार जब आप अपना चर निर्धारित कर लेते हैं, तो आप निम्नलिखित फैशन में इसका उपयोग कर सकते हैं।

@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%

%VariableName%वाक्यविन्यास पर ध्यान दें


कृपया अपना वाक्य पूरा करें ... क्या आप एक और लिंक शामिल करने जा रहे हैं? इसके अलावा, मैंने विंडोज 7 cmd.exeशेल में उपरोक्त सभी का परीक्षण किया , और प्रत्येक - बिना किसी अपवाद के - उपयोगकर्ता इनपुट को एक मनमाने ढंग से नामित चर नाम देता है। आपकी प्रतिक्रिया कैसी है जो पहले से ही प्रदान की गई है?
chb

3
जब मैंने अपना उत्तर पोस्ट किया तो यह वास्तव में ऐसा नहीं लगा जैसे मूल प्रश्न का उत्तर दिया गया था। मूल प्रश्न यह है कि "आप उपयोगकर्ता इनपुट के लिए कैसे पूछेंगे और फिर उसे बदलकर किसी अन्य कमांड में उपयोग कर सकते हैं?" मैं अपने उत्तर पर ध्यान से प्रश्न का उत्तर देता हूं। साथ ही जब आप Google में "आप किसी बैच फ़ाइल से उपयोगकर्ता इनपुट कैसे प्राप्त करते हैं" के लिए खोज करते हैं, तो यह प्रश्न परिणामों में # 2 है, इसलिए इसे सही उत्तर की आवश्यकता है, जो कि हालांकि मैं इस मंच के लिए था।
jayfessenden

14
इसके बाद का स्थान =आवश्यक नहीं है।
जॉय

हमें अंतरिक्ष की आवश्यकता क्यों है? वास्तव में क्या चल रहा है cmdकि अंतरिक्ष की अनुमति नहीं देता है?
ytpillai

@ जॉय मैं सहमत हूँ, robvanderderwoude.com पेज में कोई जगह नहीं हैSET /P variable=[promptString]
icc97

31

मुझे यकीन नहीं है कि यह विंडोज के सभी संस्करणों के लिए मामला है, हालांकि मेरे पास XP मशीन पर, मुझे निम्नलिखित का उपयोग करने की आवश्यकता है:

set /p Var1="Prompt String"

उद्धरण में शीघ्र स्ट्रिंग के बिना , मुझे पाठ के आधार पर विभिन्न परिणाम मिलते हैं।


+1 "पाठ के आधार पर विभिन्न परिणाम" के लिए: मेरे पास एक ही मुद्दा था। अब यह पाठ के साथ उद्धरण छापता है, लेकिन अधिक अजीब व्यवहार नहीं है।
बेंज

6
इस वाक्य विन्यास का उपयोग करने के लिए है उद्धरण, लेकिन से बचने दिखा उन्हें:set /p "var1=Prompt String"
स्टीफ़न

यह उद्धरण का उपयोग करने के लिए उपयोगी है और अंत में एक स्थान शामिल करता है क्योंकि यह कमांड लाइन के अच्छे पर शीघ्र बनाता है। उद्धरण होने से यह स्पष्ट होता है कि बैच फ़ाइल में कोई स्थान है। set /p Var1="Prompt String "फिर जब आप फ़ाइल चलाते हैं और उपयोगकर्ता टाइप करते हैं तो आपको कुछ मिलता Prompt String YesहैPrompt StringYes
icc97


14
@echo off
set /p input="Write something, it will be used in the command "echo""
echo %input%
pause

अगर मुझे वह मिल जाए जो आप चाहते हैं, तो यह ठीक काम करता है। आप अन्य कमांड में भी% इनपुट% का उपयोग कर सकते हैं।

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 

8
@echo off
:start
set /p var1="Enter first number: "
pause

2
आप क्यों शुरू करते हैं :start?
बेंज

1
:startबस एक मार्कर है ... उदाहरण के लिए, वह एक :endअच्छी तरह से उपयोग कर सकता है , जो चर क्लीनअप जैसी चीजों का कारण बनता है, या कॉल करने के लिए popd, या ऐसा कुछ। फिर, आपके पास IF ERRORLEVEL1 GOTO END... या यहां तक ​​कि एक का उपयोग करने का विकल्प है GOTO ERR, और :errफ़ाइल नंबर प्राप्त करने का प्रयास करते समय एक त्रुटि की तरह गूंज है। गोटो: अंत यह शायद आदत है ...
लैरीएफ

8

SETX के लिए कोई प्रलेखित / संकेत पैरामीटर नहीं है क्योंकि SET के लिए है।

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

SETX द्वारा बनाया गया एक वैरिएबल तब तक प्रयोग करने योग्य नहीं होगा जब तक आप कमांड प्रॉम्प्ट को पुनः आरंभ नहीं करते। हालाँकि, आप SETX को एक चर कह सकते हैं जो पहले से ही SET हो चुका है, भले ही उसका नाम एक ही हो।

यह विंडोज 8.1 प्रो में मेरे लिए काम करता है:

set /p UserInfo= "What is your name?  "
setx UserInfo "%UserInfo%"

(मौजूदा चर के आसपास उद्धरण चिह्न आवश्यक हैं।)

यह प्रक्रिया आपको वर्तमान सत्र के दौरान अस्थायी SET- निर्मित चर का उपयोग करने की अनुमति देती है और आपको कंप्यूटर के रिबूट या CMD प्रॉम्प्ट को पुनः आरंभ करने पर SETX- निर्मित चर का पुन: उपयोग करने की अनुमति देगा।

(कोड पैराग्राफ को ठीक से प्रारूपित करने के लिए संपादित।)


5

मेरे पास एक छोटा सीएमडी है जिसका उपयोग मैं ग्राहकों के लिए पीसी तैयार करते समय करता हूं: यह इनपुट के लिए उपयोगकर्ता को कॉल करता है, और पीसी को उस पर फिर से नाम देता है।

@ECHO "remember to run this as admin."
@ECHO OFF
SET /P _inputname= Please enter an computername:
@ECHO Du intastede "%_inputname%"
@ECHO "The pc will restart after this"
pause
@ECHO OFF
wmic computersystem where name="%COMPUTERNAME%" call rename name="%_inputname%"

shutdown -r -f

हाय फिर से यह उपयोगी स्क्रिप्ट Win10 पीसी पर प्रारंभिक सेटअप के बाद प्रयोग किया जाता है :-)
Werdna

5

दो संभावनाएं हैं।

  1. आप लगाना भूल %id%में jstackकॉल।

    jstack %id% > jstack.txt
    

तो पूरी सही बैच फ़ाइल होनी चाहिए:

@echo off
set /p id=Enter ID: 
echo %id%
jstack %id% > jstack.txt

और / या 2. आपने इसे कोड में डाल दिया (और प्रश्न में हमें बताना भूल गया) लेकिन जब आपने बैच फ़ाइल चलाई तो आपने एक आईडी टाइप करने के बजाय Enter कुंजी दबा दी (1234 कहो)।

जो हो रहा है, वह इन दो गलतियों का परिणाम है: jstackमाना जाता है कि उस आईडी से जिसे आप आपूर्ति करते हैं।

लेकिन आपके मामले में (प्रश्न में आपके द्वारा दिए गए कोड के अनुसार) आपने इसे बिना किसी चर के कहा है। आप ने लिखा:

jstack > jstack.txt

इसलिए जब आप jstackबिना किसी चर के साथ चलते हैं तो यह निम्न आउटपुट करता है:

Terminate batch file Y/N? 

आपकी दूसरी गलती यह है कि आपने प्रोग्राम से पूछे जाने पर मान देने के बजाय Enter दबाया Enter ID::। यदि आप इस बिंदु पर एक आईडी डालते हैं, तो 1234 कहो, %id%चर हमारे मूल्य 1234 में वह मूल्य बन जाएगा। लेकिन आपने मूल्य की आपूर्ति नहीं की और इसके बजाय Enter दबाया। जब आप चर को कोई मूल्य नहीं देते हैं, और यदि उस चर को पहले किसी और चीज के लिए सेट नहीं किया गया था, तो चर %id%को setकमांड के संकेत पर सेट किया जाता है !! तो अब %id%सेट है Enter ID:जो कि आपकी स्क्रीन पर गूँज रहा था जैसा कि बैच फ़ाइल में अनुरोध किया गया है उससे पहले आपको jstack कहा जाता है।

लेकिन मुझे संदेह है कि आपके पास DID jstack %id% > jstack.txtआपके बैच फ़ाइल कोड में है %id(और प्रश्न से गलती से इसे छोड़ दिया गया है), और यह कि आपने एक आईडी टाइप किए बिना एंट्री मार दी। बैच प्रोग्राम तब आईडी से गूँजता है, जो अब "एंटर आईडी:" है, और फिर भाग गयाjstack Enter ID: > jstack.txt

Jstack ने स्वयं इनपुट को प्रतिध्वनित किया, एक गलती का सामना किया और समाप्त करने को कहा।
और यह सब jstack.txt फाइल में लिखा गया था।


3

चर के चारों ओर डॉलर के संकेत मेरे विस्टा मशीन पर काम नहीं करते हैं, लेकिन प्रतिशत संकेत करते हैं। यह भी ध्यान दें कि "सेट" लाइन पर एक अनुगामी स्थान शीघ्र और उपयोगकर्ता इनपुट के बीच दिखाई देगा।


अनुगामी स्थान? win7 x64 rus: C:\>set /p DestPath="Type path:"और अगली पंक्ति हैType path:c:\dddd
एरोच 'द

2
$ चिन्ह बैश या यूनिक्स चर के लिए है। %% का चिन्ह विंडोज़ चरों के लिए है।
noob

यदि आपके पास SETLOCAL ENABLEDELAYEDEXPANSIONअपनी बैच फ़ाइल है, तो आप इसका उपयोग !EnvVariable!फ़ोर लूप के दौरान, या अन्य चीज़ों के लिए कर सकते हैं जो मैक्रो का विस्तार नहीं करती हैं जब तक कि लाइन वास्तव में Cmd पार्सर द्वारा संसाधित नहीं होती है। cmd /?इस पर जानकारी के लिए देखें , साथ ही help setlocal...
लैरीएफ

2

बस जोड़ा गया

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

मेरे netsh बैच नौकरी के लिए अनुक्रम। यह अब मुझे उस नमूने के लिए बिंदु के रूप में प्रतिक्रिया देने वाले स्थान को दिखाता है। मैं लगातार >> आउटपुट फ़ाइल तो मैं अब "घर", "काम", "स्टारबक्स", आदि को जानता हूं। स्पष्ट हवा की तलाश में, मैं सबसे कम उपयोग चैनलों को उत्तोलन कर सकता हूं और क्या 5 या सिर्फ सभी 2.4 मेगाहर्ट्ज WLAN हैं।


2

बस चर का एक डिफ़ॉल्ट मान रखने के लिए। अपने .bat के हाल के रन से डिफ़ॉल्ट का उपयोग करने के लिए Enter दबाएं:

@echo off
set /p Var1=<Var1.txt
set /p Var1="Enter new value ("%Var1%") "
echo %Var1%> Var1.txt

rem YourApp %Var1%

पहले रन में केवल चर के प्रारंभिक मूल्य के साथ फ़ाइल की कमी के बारे में संदेश को अनदेखा करें (या मैन्युअल रूप से Var1.txt बनाएं)।


(set /p var=<var1.txt) 2>nulगलतफहमी को दबा देगा। आप set var1=defaultकिसी फ़ाइल से कुछ पाने के बदले भी दे सकते हैं
Stephan

Stephan, आपके प्रस्ताव का दूसरा भाग रनों के बीच के मूल्यों को संरक्षित नहीं करता है !? क्या आप इसे और अधिक विकसित कर सकते हैं?
एंटोनी

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