ใน Windows cmd ฉันจะแจ้งให้ผู้ใช้ป้อนข้อมูลและใช้ผลลัพธ์ในคำสั่งอื่นได้อย่างไร


397

ฉันมีไฟล์. bat ของ Windows ซึ่งฉันต้องการรับอินพุตผู้ใช้จากนั้นใช้ผลลัพธ์ของอินพุตนั้นเป็นส่วนหนึ่งของการเรียกไปยังคำสั่งเพิ่มเติม

ตัวอย่างเช่นฉันต้องการยอมรับ ID กระบวนการจากผู้ใช้จากนั้นเรียกใช้ jstack เทียบกับ ID นั้นโดยวางผลลัพธ์ของการเรียก jstack ลงในไฟล์ อย่างไรก็ตามเมื่อฉันลองสิ่งนี้มันไม่ทำงาน

นี่คือเนื้อหาไฟล์ค้างคาวตัวอย่างของฉัน:

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

และนี่คือสิ่งที่ปรากฏใน jstack.txt:

ป้อน ID: ยกเลิกงานแบ็ตช์ (Y / N)? 

2
"ยกเลิกชุดงาน (Y / N) หรือไม่" โดยทั่วไปจะปรากฏขึ้นเมื่อคุณกด ctrl-c ขณะที่. bat กำลังทำงาน
Jim Buck

2
Jstack.txt จะมีเอาต์พุตจาก jstack และไม่มีอะไรเกี่ยวข้องกับแบตช์ไฟล์ของคุณและคุณยังไม่ได้พูดว่า Jstack คืออะไร
sgmoore

1
คำตอบใด ๆ เหล่านี้ไม่ทำงานใช่ไหม ถ้าไม่คุณพบทางออกหรือไม่? ถ้าคุณทำมันจะมีประโยชน์ถ้าคุณโพสต์ไว้ที่นี่เพื่อตอบคำถามด้วยตนเอง
Maslor

1
หากคุณต้องการตัวเลือกคงที่สำหรับอินพุตคุณควรใช้choiceมากกว่าset /p
icc97

2
โปรดทำเครื่องหมายการโพสต์ของฉันเป็นคำตอบสาระสำคัญคือเมื่อใช้งานโปรแกรมแบทช์ที่คุณกด Enter แทนการระบุ ID ที่พรอมต์ดังนั้น% id% จึงถูกตั้งค่าEnter ID: เป็นมากกว่า ID ที่คุณควรจะจัดหาจาก คีย์บอร์ด.
pashute

คำตอบ:


458

ลองสิ่งนี้:

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

จากนั้นคุณสามารถใช้เป็นพารามิเตอร์ไปยังแฟ้มชุดอื่นเช่น%id%jstack %id%

ตัวอย่างเช่น:

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

2
มีวิธีการไพพ์เอาต์พุตของคำสั่ง SET ไปที่ NIL หรือไม่ดังนั้นคุณสามารถซ่อนการพิมพ์ได้ เช่นถ้าคุณต้องการที่จะทำ: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:และไม่ต้องการให้ข้อความรหัสผ่านแสดงในหน้าต่างให้อยู่คนเดียวแสดงในบัฟเฟอร์คำสั่ง "DosKey" ฉันได้ลองหลายวิธีแล้วและไม่สามารถหาวิธีทำได้นอกเหนือจากการเขียนโปรแกรม C เล็กน้อยเพื่อรับอินพุตและกำหนดให้กับ EnvVar แต่นั่นเป็นการโกง! :) ฉันต้องการให้ทำงานกับ JUST Windows CMD
LarryF


4
"Enter ID: "หมายเหตุความสวยงามเพิ่มพื้นที่ในตอนท้ายของ ให้ช่องว่างเล็ก ๆ น้อย ๆ ระหว่างข้อความแจ้งและคำตอบของผู้ใช้ VSDelete the internet?No silly Delete the internet? No silly
icc97

ไม่จำเป็นต้องพูด สิ่งที่ @Instantsoup หายไปคือ '% id% `ในบรรทัดjstack %id% > jstack.txt
pashute

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สำหรับการดำน้ำลึกยิ่งขึ้นในการป้อนข้อมูลผู้ใช้ด้วยไฟล์ชุดงาน Windows OS รุ่นต่างๆ

เมื่อคุณตั้งค่าตัวแปรของคุณแล้วคุณสามารถใช้มันในแบบต่อไปนี้

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

สังเกต%VariableName%ไวยากรณ์


โปรดจบประโยคของคุณ ... คุณจะใส่ลิงค์อื่นหรือไม่? นอกจากนี้ฉันทดสอบทั้งหมดข้างต้นในcmd.exeเชลล์Windows 7 และแต่ละรายการโดยไม่มีข้อยกเว้นจะกำหนดอินพุตของผู้ใช้ให้กับตัวแปรที่ตั้งชื่อตามอำเภอใจ การตอบสนองของคุณเป็นอย่างไรต่อการจัดเตรียมสิ่งที่มีอยู่แล้ว
chb

3
เมื่อฉันโพสต์คำตอบของฉันมันก็ดูไม่เหมือนคำถามเดิมที่ได้รับคำตอบ คำถามเดิมคือ "คุณจะขอข้อมูลผู้ใช้จากนั้นตอบสนองและใช้ในคำสั่งอื่นได้อย่างไร" ฉันเชื่อคำตอบของฉันตอบคำถามโดยไม่ตั้งใจ นอกจากนี้เมื่อคุณค้นหาคำว่า "คุณจะได้รับข้อมูลผู้ใช้จากไฟล์แบตช์" ใน Google ได้อย่างไรคำถามนี้คือ # 2 ในผลลัพธ์ดังนั้นจึงต้องการคำตอบที่ถูกต้องซึ่งฉันคิดว่าเป็นฟอรัมนี้
jayfessenden

14
ช่องว่างหลังจาก=นั้นไม่จำเป็น
Joey

ทำไมเราต้องการพื้นที่ สิ่งที่เกิดขึ้นในcmdที่ไม่อนุญาตให้มีพื้นที่?
ytpillai

@Joey ฉันเห็นด้วยหน้า robvanderderwoude.comไม่มีที่ว่างSET /P variable=[promptString]
icc97

31

ฉันไม่แน่ใจว่าเป็นกรณีนี้สำหรับ Windows ทุกรุ่นหรือไม่อย่างไรก็ตามในเครื่อง XP ที่ฉันมีฉันต้องใช้สิ่งต่อไปนี้:

set /p Var1="Prompt String"

โดยไม่ต้องสตริงพรอมต์ในคำพูดที่ผมได้รับผลต่างๆขึ้นอยู่กับข้อความ


+1 สำหรับ "ผลลัพธ์ต่างๆขึ้นอยู่กับข้อความ": ฉันมีปัญหาเดียวกัน ตอนนี้มันพิมพ์คำพูดพร้อมข้อความ แต่ไม่มีพฤติกรรมแปลก ๆ
Benj

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

ถ้าฉันได้สิ่งที่คุณต้องการมันใช้งานได้ดี คุณสามารถใช้% input% ในคำสั่งอื่นได้เช่นกัน

@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?
Benj

1
:startเป็นเพียงเครื่องหมาย ... ตัวอย่างเช่นเขาอาจใช้ a :endเช่นกันซึ่งทำให้สิ่งต่าง ๆ เช่นการล้างข้อมูลตัวแปรเกิดขึ้นหรือเรียก a popdหรืออะไรทำนองนั้น จากนั้นคุณยังมีตัวเลือกในการใช้ IF ERRORLEVEL1 GOTO END... หรือแม้กระทั่ง a GOTO ERRและภายใต้:errมีบางสิ่งบางอย่างเช่น echo An Error เกิดขึ้นขณะพยายามรับหมายเลขไฟล์ goto: สิ้นสุดมันอาจเป็นนิสัย ...
LarryF

8

ไม่มีพารามิเตอร์ที่เป็นเอกสาร / พรอมต์สำหรับ SETX เนื่องจากมีไว้สำหรับ SET

หากคุณต้องการให้พรอมต์ของตัวแปรสภาพแวดล้อมที่จะอยู่รอดได้ในการรีบูตคุณสามารถใช้ SETX เพื่อเก็บมันได้

ตัวแปรที่สร้างโดย SETX จะไม่สามารถใช้งานได้จนกว่าคุณจะรีสตาร์ทพร้อมท์คำสั่ง อย่างไรก็ตามคุณสามารถตั้งค่าตัวแปร SETX ที่มีอยู่แล้วแม้ว่าจะมีชื่อเหมือนกัน

สิ่งนี้ใช้ได้กับฉันใน Windows 8.1 Pro:

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

(จำเป็นต้องใช้เครื่องหมายคำพูดรอบตัวแปรที่มีอยู่)

ขั้นตอนนี้ช่วยให้คุณใช้ตัวแปร SET ชั่วคราวที่สร้างขึ้นในช่วงเซสชั่นปัจจุบันและจะช่วยให้คุณสามารถใช้ตัวแปรที่สร้าง SETX ใหม่เมื่อรีบูตเครื่องคอมพิวเตอร์หรือรีสตาร์ทพร้อมท์ CMD

(แก้ไขเพื่อจัดรูปแบบย่อหน้ารหัสอย่างถูกต้อง)


5

ฉันมี cmd เล็ก ๆ น้อย ๆ ที่ฉันใช้เมื่อเตรียมพีซีให้กับลูกค้า: มันเรียกผู้ใช้สำหรับอินพุตและเปลี่ยนชื่อพีซีเป็นอย่างนั้น

@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 แทนที่จะพิมพ์ ID (เช่น 1234)

สิ่งที่เกิดขึ้นคือผลลัพธ์ของข้อผิดพลาดสองข้อjstackนี้: ควรจะถูกเรียกด้วยรหัสที่คุณให้

แต่ในกรณีของคุณ (ตามรหัสที่คุณระบุในคำถาม) คุณเรียกมันว่าไม่มีตัวแปรใด ๆ คุณเขียน:

jstack > jstack.txt

ดังนั้นเมื่อคุณรันjstackโดยไม่มีตัวแปรมันจะแสดงผลดังนี้:

Terminate batch file Y/N? 

ความผิดพลาดที่สองของคุณคือการที่คุณกด Enter Enter ID:แทนการให้ค่าเมื่อโปรแกรมถามคุณ: ถ้าคุณจะใส่รหัสในจุดนี้พูด 1234 %id%ตัวแปรจะกลายเป็นค่านั้นในกรณีของเรา 1234 แต่คุณไม่ได้ให้ค่าและกด Enter แทน เมื่อคุณไม่ให้ค่าตัวแปรใด ๆ และหากตัวแปรนั้นไม่ได้ถูกตั้งค่าเป็นอย่างอื่นมาก่อนตัวแปร%id%จะถูกตั้งค่าเป็นพรอมต์ของsetคำสั่ง !! ดังนั้นตอนนี้%id%ถูกตั้งค่าEnter ID:ที่ถูก echoed บนหน้าจอของคุณตามที่ร้องขอในแฟ้มแบตช์ก่อนที่คุณเรียกว่า jstack

แต่ฉันสงสัยว่าคุณมีรหัสjstack %id% > jstack.txtในแบทช์ไฟล์ของคุณด้วย%id(และละเว้นโดยไม่ได้ตั้งใจจากคำถาม) และคุณกด Enter โดยไม่ต้องพิมพ์รหัส จากนั้นโปรแกรมแบตช์จะแสดง id ซึ่งตอนนี้คือ "Enter ID:" แล้วรันjstack Enter ID: > jstack.txt

Jstack ตัวเองสะท้อนอินพุตพบข้อผิดพลาดและขอให้ยุติ
และทั้งหมดนี้เขียนลงในไฟล์ jstack.txt


3

ดอลลาร์สัญญาณรอบตัวแปรไม่ทำงานบนเครื่อง Vista ของฉัน แต่เครื่องหมายเปอร์เซ็นต์ทำ นอกจากนี้โปรดทราบว่าช่องว่างต่อท้ายบนบรรทัด "set" จะปรากฏขึ้นระหว่างการแจ้งและการป้อนข้อมูลของผู้ใช้


พื้นที่ต่อท้าย? win7 x64 rus: C:\>set /p DestPath="Type path:"และบรรทัดถัดไปคือType path:c:\dddd
Arioch 'The

2
$ sign ใช้สำหรับตัวแปร bash หรือ unix เครื่องหมาย %% ใช้สำหรับตัวแปร windows
noob

หากคุณมีSETLOCAL ENABLEDELAYEDEXPANSIONไฟล์แบตช์ของคุณคุณสามารถใช้!EnvVariable!เพื่อขยายเป็นค่าระหว่าง FOR ลูปหรือสิ่งอื่น ๆ ที่ไม่ขยายแมโครจนกว่าบรรทัดจะถูกประมวลผลโดย Cmd parser ดูcmd /?ข้อมูลเกี่ยวกับสิ่งนี้รวมถึงhelp setlocal...
LarryF

2

เพิ่งเพิ่ม

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

ลำดับงานแบตช์ของฉัน ตอนนี้แสดงตำแหน่งที่ฉันตอบเป็นจุดสำหรับตัวอย่างนั้น ฉัน >> ไฟล์เอาต์พุตอย่างต่อเนื่องดังนั้นฉันจึงรู้ว่าตอนนี้ "บ้าน", "งาน", "สตาร์บัคส์" ฯลฯ มองหาอากาศที่ชัดเจนฉันสามารถกำจัดช่องทางที่ใช้น้อยที่สุด


2

เพียงเพื่อให้ค่าเริ่มต้นของตัวแปร กด Enter เพื่อใช้ค่าเริ่มต้นจาก .bat ล่าสุดของคุณ:

@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 ส่วนที่สองของข้อเสนอของคุณไม่รักษาค่าระหว่างการรัน! คุณสามารถพัฒนาเพิ่มเติมได้หรือไม่
Antoni

ไม่ไม่ใช่ระหว่างการวิ่ง มันแค่ให้ค่าเริ่มต้น (ไม่มีการร้องขอให้เก็บค่าระหว่างการรันในคำถาม)
เตฟาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.