2009-08-03 67 views
241

Tôi có tệp .bat trên Windows 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ư là một phần của lệnh gọi đến các lệnh bổ sung.Trong Windows cmd, làm cách nào để nhắc người dùng nhập và sử dụng kết quả trong một lệnh khác?

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 cuộc 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.

Dưới đây là mẫu nội dung file bat của tôi:

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

và đây là những gì xuất hiện trong jstack.txt:

 
Enter ID: Terminate batch job (Y/N)? 
+1

"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. –

+2

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

+1

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

Trả lời

285

Hãy thử điều này:

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

Sau đó, bạn có thể sử dụng% id% dưới dạng tham số cho một tệp lô khác. Ví dụ:

jstack %id% 

CHỈNH SỬA: Điều này chỉ phù hợp với tôi. Xin lỗi tôi không thể giúp nhiều hơn.

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

Có cách nào để dẫn đầu ra của lệnh SET thành NIL :, để bạn có thể ẩn đánh máy? Giống như nếu bạn muốn thực hiện: 'set/p id = Nhập ID: \ r \ n set/p pw = Nhập mật khẩu:' 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 số cách khác nhau, và không thể tìm ra cách để 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 một EnvVar, nhưng đó là gian lận! :) Tôi muốn nó hoạt động với JUST Windows CMD. – LarryF

+0

@LarryF kiểm tra http://stackoverflow.com/questions/19950620/how-to-hide-password-in-command-line-with-and-get-the-value-into-bat-file và http: //stackoverflow.com/questions/664957/can-i-mask-an-input-text-in-a-bat-file – Instantsoup

+2

Lưu ý mức độ bổ sung của khoảng trống ở cuối '" Nhập ID: "'. Cung cấp một không gian nhỏ ngọt ngào giữa dấu nhắc và câu trả lời của người dùng. 'Xóa internet? Không ngớ ngẩn' so với 'Xóa internet? Không ngớ ngẩn. – icc97

26

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

set /p Var1="Prompt String" 

Nếu không có chuỗi nhắc trong báo giá, tôi nhận được các kết quả khác nhau tùy thuộc vào văn bản.

+0

+1 cho "các 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 dấu ngoặc kép với văn bản, nhưng không có hành vi kỳ lạ hơn. – Benj

+6

sử dụng cú pháp này để * có * dấu ngoặc kép, nhưng tránh * hiển thị * chúng: 'set/p 'var1 = Chuỗi nhắc" ' – Stephan

+0

Thật hữu ích khi sử dụng dấu ngoặc kép và bao gồm dấu cách ở cuối vì nó làm dấu nhắc trên dòng lệnh đẹp hơn. Có dấu ngoặc kép làm cho nó rõ ràng rằng có một không gian có trong tập tin thực thi. 'set/p Var1 =" Chuỗi Prompt "' Sau đó, khi bạn chạy tập tin và người dùng gõ một cái gì đó bạn nhận được 'Prompt String Yes' thay vì' Prompt StringYes' – icc97

78

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

Check-out http://commandwindows.com/batch.htm hoặc http://www.robvanderwoude.com/userinput.php cho một lặn sâu hơn vào người dùng nhập vào với các phiên bản khác nhau của các tập tin batch Hệ điều hành Windows.

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

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

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

+0

Hãy 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 đã kiểm tra tất cả những điều trên trong một vỏ Windows 7 'cmd.exe', và mỗ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 ý. Câu trả lời của bạn tôn trọng những gì đã được cung cấp? – chb

+3

Khi tôi đăng câu trả lời của tôi, nó không thực sự trông 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 đầu vào của người dùng và sau đó quay vòng và sử dụng nó trong một lệnh khác?" Tôi beleve câu trả lời của tôi succintly trả lời câu hỏi. Ngoài ra khi bạn tìm kiếm trong Google "làm thế nào để bạn nhận được dữ liệu nhập từ người dùng từ một tập tin thực thi", câu hỏi này là # 2 trong kết quả vì vậy nó cần câu trả lời chính xác mà tôi cho rằng diễn đàn này là dành cho. – jayfessenden

+13

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

1

dấu hiệu Dollar xung quanh biến không làm việc trên máy tính Vista của tôi, nhưng dấu phần trăm làm. Cũng lưu ý rằng dấu cách trên dòng "set" sẽ hiển thị giữa dấu nhắc người dùng và đầu vào.

+0

dấu cách? win7 x64 rus: 'C: \> set/p DestPath =" Kiểu đường dẫn: "' và dòng tiếp theo là 'Đường dẫn loại: c: \ dddd' –

+2

$ ký hiệu là cho các biến bash hoặc unix. Dấu %% dành cho các biến windows. – noob

+0

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

6
@echo off 
:start 
set /p var1="Enter first number: " 
pause 
+2

Tại sao bạn bắt đầu bằng': start'? – Benj

+1

': start' chỉ là một dấu ... Ví dụ, anh ta cũng có thể sử dụng': end', làm cho những thứ như dọn dẹp biến xảy ra, hoặc gọi 'popd', hay cái gì đó tương tự. Sau đó, bạn cũng có tùy chọn sử dụng một số 'IF ERRORLEVEL1 GOTO END' ... hoặc thậm chí là' GOTO ERR' và dưới ': err' có thông tin như sau: echo Đã xảy ra lỗi khi cố gắng lấy số tệp. goto: end Nó có thể là một mater của thói quen ... – LarryF

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

nếu tôi nhận đượ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 
0

Chỉ cần thêm chuỗi

set /p NetworkLocation= Enter name for network? 

echo %NetworkLocation% >> netlist.txt 

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

6

Không có tham số được ghi lại/nhắc cho SETX vì có SET.

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

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 lời nhắc lệnh. Tuy nhiên, gọn gàng, bạn có thể SETX một biến đã được SET, ngay cả khi nó có cùng tên.

này làm việc cho tôi trong Windows 8.1 Pro: (. Các dấu ngoặc kép quanh biến hiện có là cần thiết)

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

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

(Đã chỉnh sửa các đoạn mã định dạng chính xác.)

0

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

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

rem YourApp %Var1% 

Trong chạy đầu tiên chỉ cần bỏ qua thông điệp về sự thiếu tập tin với giá trị ban đầu của biến (hoặc làm tạo Var1.txt bằng tay) .

+0

'(set/p var = nul' sẽ suppres errormessage.Bạn cũng có thể cung cấp cho' đặt var1 = mặc định' thay vì nhận được một cái gì đó từ một tập tin – Stephan

+0

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

+0

không, không phải giữa các lần chạy. Nó chỉ cung cấp 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

2
set /p choice= "Please Select one of the above options :" 

echo '% lựa chọn%' không gian sau khi '=' là rất quan trọng

1

Tôi có một cmd chút tôi sử dụng khi chuẩn bị máy cho khách hàng: nó gọi người sử dụng cho đầu vào, và đổi tên máy tí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 
+0

Hi một lần nữa kịch bản hữu ích này được sử dụng trên Win10 pc sau khi thiết lập ban đầu :-) – Werdna

Các vấn đề liên quan