Trong cmd Windows, làm cách nào để nhắc người dùng nhập và sử dụng kết quả trong lệnh khác?


398

Tôi có một tệp Windows .bat mà tôi muốn chấp nhận đầu vào của người dùng và sau đó sử dụng kết quả của đầu vào đó như một phần của lệnh gọi đến các lệnh bổ sung.

Ví dụ: tôi muốn chấp nhận ID tiến trình từ người dùng và sau đó chạy jstack với ID đó, đưa kết quả của lệnh gọi jstack vào một tệp. Tuy nhiên, khi tôi thử điều này, nó không hoạt động.

Đây là nội dung tập tin bat mẫu của tôi:

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

và đây là những gì hiển thị trong jstack.txt:

Nhập ID: Chấm dứt công việc hàng loạt (Y / N)? 

2
"Chấm dứt công việc hàng loạt (Y / N)?" thường xuất hiện khi bạn nhấn ctrl-c trong khi .bat của bạn đang chạy.
Jim Buck

2
Jstack.txt sẽ chứa đầu ra từ jstack và không có gì liên quan đến tệp bó của bạn và bạn cũng chưa nói Jstack là gì.
sgmoore

1
Không có bất kỳ câu trả lời trong số này làm việc? Nếu không, bạn đã tìm thấy một giải pháp? Nếu bạn đã làm, nó sẽ hữu ích nếu bạn đăng nó ở đây như là một câu trả lời tự.
Maslor

1
Nếu bạn muốn các tùy chọn cố định cho đầu vào, bạn nên sử dụng choicetốt hơnset /p
icc97

2
Vui lòng đánh dấu bài đăng của tôi là câu trả lời, điều cốt lõi là khi chạy chương trình hàng loạt, bạn nhấn Enter thay vì cung cấp ID tại dấu nhắc, và do đó% id% được đặt thành Enter ID: thay vì một số ID bạn phải cung cấp từ bàn phím.
pashute

Câu trả lời:


459

Thử cái này:

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

Sau đó, bạn có thể sử dụng %id%làm tham số cho tệp bó khác như thế nào jstack %id%.

Ví dụ:

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

2
Có cách nào để chuyển đầu ra của lệnh SET sang NIL:, để bạn có thể ẩn việc gõ không? Giống như nếu bạn muốn thực hiện: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:và không muốn văn bản mật khẩu hiển thị trong cửa sổ, hãy để một mình, hiển thị trong bộ đệm lệnh "DosKey"? Tôi đã thử một vài cách khác nhau và không thể tìm ra cách nào để làm điều này, ngoài việc viết một chương trình C nhỏ để lấy đầu vào và gán nó cho EnvVar, nhưng đó là gian lận! :) Tôi muốn nó hoạt động với CHỈ Windows Windows.
LarryF


4
Lưu ý sự độc đáo của không gian ở cuối "Enter ID: ". Cung cấp một không gian nhỏ ngọt ngào giữa lời nhắc và câu trả lời của người dùng. Delete the internet?No sillyvs Delete the internet? No silly.
icc97

Không cần báo giá. Cái mà @Instantsoup đã thiếu là '% id% `trong dòngjstack %id% > jstack.txt
pashute

1
Sử dụng SETLOCALENDLOCALnếu bạn muốn giữ biến cục bộ cho lô hiện tại. Xem ss64.com/nt/endlocal.html
endo64

99

Cú pháp là như vậy: set /p variable=[string]

Hãy xem http://commandwindows.com/batch.htm hoặc http://www.robvanderwoude.com/userinput.php để tìm hiểu sâu hơn về đầu vào của người dùng với các phiên bản khác nhau của các tệp bó Windows OS.

Khi bạn đã đặt biến của mình, bạn có thể sử dụng biến đó theo cách sau.

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

lưu ý %VariableName%cú pháp


Vui lòng kết thúc câu của bạn ... bạn sẽ bao gồm một liên kết khác? Ngoài ra, tôi đã thử nghiệm tất cả những điều trên trong một cmd.exevỏ Windows 7 và mỗi cái - không có ngoại lệ - gán đầu vào của người dùng cho một biến được đặt tên tùy ý. Làm thế nào là phản ứng của bạn tôn tạo những gì đã được cung cấp?
chb

3
Khi tôi đăng câu trả lời của mình, nó không thực sự giống như câu hỏi ban đầu đã được trả lời. Câu hỏi ban đầu là "Làm thế nào để bạn yêu cầu người dùng nhập liệu và sau đó quay vòng và sử dụng nó trong một lệnh khác?" Tôi tin rằng câu trả lời của tôi không trả lời được câu hỏi. Ngoài ra, khi bạn tìm kiếm trong Google "làm thế nào để bạn có được đầu vào của người dùng từ một tệp bó" thì câu hỏi này là kết quả số 2 vì vậy nó cần câu trả lời chính xác mà tôi nghĩ rằng diễn đàn này là dành cho.
jayfessenden

14
Không gian sau =là không cần thiết.
Joey

Tại sao chúng ta cần không gian? Chính xác những gì diễn ra trong cmdđó không cho phép không gian?
ytpillai

@ Tôi đồng ý, trang robvanderderwoude.com không có chỗ trốngSET /P variable=[promptString]
icc97

31

Tôi không chắc đây có phải là trường hợp của tất cả các phiên bản Windows hay không, tuy nhiên trên máy XP tôi có, tôi cần sử dụng như sau:

set /p Var1="Prompt String"

Không có chuỗi dấu nhắc trong dấu ngoặc kép , tôi nhận được các kết quả khác nhau tùy thuộc vào văn bản.


+1 cho "kết quả khác nhau tùy thuộc vào văn bản": Tôi có cùng một vấn đề. Bây giờ nó in các trích dẫn với văn bản, nhưng không có hành vi lạ hơn.
Ngày

6
sử dụng cú pháp này để dấu ngoặc kép, nhưng tránh hiển thị chúng:set /p "var1=Prompt String"
Stephan

Thật hữu ích khi sử dụng dấu ngoặc kép và bao gồm một khoảng trắng ở cuối vì nó làm cho dấu nhắc trên dòng lệnh đẹp hơn. Có dấu ngoặc kép làm cho rõ ràng rằng có một khoảng trống trong tệp bó. set /p Var1="Prompt String "Sau đó, khi bạn chạy tệp và người dùng nhập nội dung bạn nhận được Prompt String Yesthay vìPrompt StringYes
icc97


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

Nếu tôi có được những gì bạn muốn, điều này hoạt động tốt. bạn cũng có thể sử dụng% input% trong các lệnh khác.

@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
Tại sao bạn bắt đầu với :start?
Ngày

1
:startchỉ là một điểm đánh dấu ... Ví dụ, anh ta cũng có thể sử dụng một :endnguyên nhân, điều này khiến cho những việc như dọn dẹp biến xảy ra hoặc gọi một popdhoặc một cái gì đó tương tự. Sau đó, bạn cũng có tùy chọn sử dụng IF ERRORLEVEL1 GOTO END... hoặc thậm chí là a GOTO ERR, và bên dưới :errcó tiếng vang như Lỗi xảy ra khi cố lấy số tệp. goto: kết thúc Có lẽ đó là một thói quen ...
LarryF

8

Không có tham số tài liệu / dấu nhắc cho SETX như có cho SET.

Nếu bạn cần nhắc một biến môi trường sẽ tồn tại khi khởi động lại, bạn có thể sử dụng SETX để lưu trữ nó.

Một biến được tạo bởi SETX sẽ không thể sử dụng được cho đến khi bạn khởi động lại dấu nhắc lệnh. Tuy nhiên, gọn gàng, bạn có thể SETX một biến đã được đặt, ngay cả khi nó có cùng tên.

Điều này hoạt động với tôi trong Windows 8.1 Pro:

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

(Các dấu ngoặc kép xung quanh biến hiện có là cần thiết.)

Quy trình này cho phép bạn sử dụng biến tạm thời do SET tạo trong phiên hiện tại và sẽ cho phép bạn sử dụng lại biến do SETX tạo khi khởi động lại máy tính hoặc khởi động lại dấu nhắc CMD.

(Được chỉnh sửa để định dạng các đoạn mã đúng.)


5

Tôi có một ít cmd tôi sử dụng khi chuẩn bị pc cho khách hàng: nó gọi người dùng để nhập liệu và đổi tên máy tính thành đó.

@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

Xin chào lần nữa, tập lệnh hữu ích này được sử dụng trên pc Win10 sau khi thiết lập ban đầu :-)
Werdna

5

Có hai khả năng.

  1. Bạn đã quên đặt những %id%trong jstackcuộc gọi.

    jstack %id% > jstack.txt
    

Vì vậy, toàn bộ tập tin lô chính xác phải là:

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

Và / Hoặc 2. Bạn đã đặt mã vào mã (và quên cho chúng tôi biết trong câu hỏi) nhưng khi bạn chạy tệp bó, bạn nhấn phím Enter thay vì nhập ID (giả sử 1234).

Điều gì đang xảy ra là kết quả của hai sai lầm này: jstackđược cho là được gọi với id mà bạn cung cấp.

Nhưng trong trường hợp của bạn (theo mã bạn cung cấp trong câu hỏi) bạn đã gọi nó mà không có bất kỳ biến nào. Bạn đã viết:

jstack > jstack.txt

Vì vậy, khi bạn chạy jstackkhông có biến, nó xuất ra như sau:

Terminate batch file Y/N? 

Lỗi thứ hai của bạn là bạn đã nhấn Enter thay vì đưa ra một giá trị khi chương trình hỏi bạn : Enter ID:. Nếu bạn đã đặt ID vào thời điểm này, giả sử 1234, %id%biến sẽ trở thành giá trị đó, trong trường hợp của chúng tôi là 1234. Nhưng bạn KHÔNG cung cấp giá trị và thay vào đó nhấn Enter. Khi bạn không cung cấp cho biến bất kỳ giá trị nào và nếu biến đó không được đặt thành bất kỳ giá trị nào khác trước đó, thì biến đó %id%được đặt thành dấu nhắc của setlệnh !! Vì vậy, bây giờ %id%được đặt thành tiếng Enter ID:vang trên màn hình của bạn như được yêu cầu trong tệp bó TRƯỚC KHI bạn gọi là jstack.

Nhưng tôi nghi ngờ bạn DID có jstack %id% > jstack.txtmã tệp trong lô của bạn với %id(và bỏ qua nó do nhầm lẫn với câu hỏi) và rằng bạn nhấn enter mà không cần nhập id. Chương trình bó sau đó lặp lại id, hiện là "Enter ID:", rồi chạyjstack Enter ID: > jstack.txt

Jstack tự lặp lại đầu vào, gặp lỗi và yêu cầu chấm dứt.
Và tất cả điều này đã được ghi vào tệp jstack.txt.


3

Dấu đô la xung quanh biến không hoạt động trên máy Vista của tôi, nhưng dấu phần trăm thì có. Cũng lưu ý rằng một khoảng trắng ở dòng "set" sẽ hiển thị giữa dấu nhắc và đầu vào của người dùng.


đằng sau không gian? win7 x64 rus: C:\>set /p DestPath="Type path:"và dòng tiếp theo làType path:c:\dddd
Arioch '

2
Dấu $ là cho các biến bash hoặc unix. Dấu %% dành cho các biến windows.
noob

Nếu bạn có một SETLOCAL ENABLEDELAYEDEXPANSIONtệp trong tệp bó của mình, bạn có thể sử dụng !EnvVariable!để mở rộng nó thành giá trị của nó trong các vòng lặp FOR hoặc những thứ khác không mở rộng macro cho đến khi dòng thực sự được xử lý bởi trình phân tích cú pháp Cmd. Xem cmd /?để biết thông tin về điều này, cũng như help setlocal...
LarryF

2

Chỉ cần thêm

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

trình tự cho công việc hàng loạt Netsh của tôi. Bây giờ nó cho tôi thấy vị trí tôi trả lời làm điểm cho mẫu đó. Tôi liên tục >> tệp đầu ra để bây giờ tôi biết "nhà", "công việc", "Starbucks", v.v. Tìm kiếm không khí trong lành, tôi có thể sử dụng các kênh sử dụng thấp nhất và có 5 hoặc chỉ tất cả các mạng WLAN 2,4 MHz xung quanh.


2

Chỉ để giữ một giá trị mặc định của biến. Nhấn Enter để sử dụng mặc định từ lần chạy gần đây của .bat:

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

rem YourApp %Var1%

Trong lần chạy đầu tiên, chỉ cần bỏ qua thông báo về việc thiếu tệp có giá trị ban đầu của biến (hoặc tạo thủ công Var1.txt).


(set /p var=<var1.txt) 2>nulsẽ hỗ trợ các lỗi. Bạn cũng có thể cung cấp set var1=defaultthay vì nhận được một cái gì đó từ một tập tin
Stephan

Stephan, Phần thứ hai trong đề xuất của bạn không bảo tồn các giá trị giữa các lần chạy!? Bạn có thể phát triển nó nhiều hơn?
Antoni

không, không phải giữa các lần chạy Nó chỉ đưa ra một giá trị mặc định. (không có yêu cầu lưu trữ giá trị giữa các lần chạy trong câu hỏi).
Stephan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.