Di Windows cmd, bagaimana cara meminta input pengguna dan menggunakan hasilnya di perintah lain?

398

Saya memiliki file Windows .bat yang ingin saya terima input pengguna dan kemudian menggunakan hasil input itu sebagai bagian dari panggilan untuk perintah tambahan.

Sebagai contoh, saya ingin menerima ID proses dari pengguna, dan kemudian menjalankan jstack terhadap ID itu, memasukkan hasil panggilan jstack ke file. Namun, ketika saya mencoba ini, itu tidak berhasil.

Ini contoh file file bat saya:

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

dan inilah yang muncul di jstack.txt:

Masukkan ID: Hentikan pekerjaan batch (Y / T)? 
Nakilon
sumber
2
"Hentikan pekerjaan batch (Y / T)?" biasanya muncul ketika Anda menekan ctrl-c saat .bat Anda berjalan.
Jim Buck
2
Jstack.txt akan berisi output dari jstack dan tidak ada yang terkait dengan file batch Anda dan juga Anda belum mengatakan apa itu Jstack.
sgmoore
1
Apakah tidak ada jawaban yang berhasil? Jika tidak, apakah Anda menemukan solusi? Jika Anda melakukannya, akan sangat membantu jika Anda mempostingnya di sini sebagai jawaban sendiri.
Maslor
1
Jika Anda ingin opsi tetap untuk input yang lebih baik Anda gunakan choicedaripadaset /p
icc97
2
Silakan tandai posting saya sebagai jawabannya, intinya adalah ketika menjalankan program batch yang Anda tekan Enter alih-alih memberikan ID pada prompt, dan karena itu% id% disetel ke Enter ID: beberapa ID yang seharusnya Anda pasok dari keyboard.
pashute

Jawaban:

459

Coba ini:

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

Anda kemudian dapat menggunakan %id%sebagai parameter ke file batch lain seperti jstack %id%.

Sebagai contoh:

set /P id=Enter id: 
jstack %id% > jstack.txt
Instantsoup
sumber
2
Apakah ada cara untuk menyalurkan output dari perintah SET ke NIL :, sehingga Anda dapat menyembunyikan pengetikan? Seperti jika Anda ingin melakukan: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:dan tidak ingin teks kata sandi ditampilkan di jendela, apalagi, tampilkan di buffer perintah "DosKey"? Saya sudah mencoba beberapa cara berbeda, dan belum dapat menemukan cara untuk melakukan ini, di luar penulisan program C kecil untuk mengambil input, dan menugaskannya ke EnvVar, tapi itu curang! :) Saya ingin ini bekerja dengan HANYA Windows CMD.
LarryF
4
Perhatikan tambahan ruang pada akhir "Enter ID: ". Memberi sedikit ruang manis antara prompt dan jawaban pengguna. Delete the internet?No sillyvs Delete the internet? No silly.
icc97
Tidak perlu kutip. Apa yang hilang @Instantsoup adalah '% id% `di barisjstack %id% > jstack.txt
pashute
1
Gunakan SETLOCALdan ENDLOCALjika Anda ingin menyimpan variabel lokal ke batch saat ini. Lihat ss64.com/nt/endlocal.html
endo64
99

Sintaksnya adalah seperti ini: set /p variable=[string]

Lihat http://commandwindows.com/batch.htm atau http://www.robvanderwoude.com/userinput.php untuk melihat masukan pengguna yang lebih dalam dengan berbagai versi file batch OS Windows.

Setelah mengatur variabel, Anda dapat menggunakannya dengan cara berikut.

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

perhatikan %VariableName%sintaksnya

jayfessenden
sumber
Silakan selesaikan kalimat Anda ... apakah Anda akan menyertakan tautan lain? Juga, saya menguji semua hal di atas dalam cmd.exeshell Windows 7 , dan masing-masing - tanpa kecuali - memberikan input pengguna ke variabel yang dinamai secara sewenang-wenang. Bagaimana tanggapan Anda mengenai apa yang sudah disediakan?
chb
3
Ketika saya memposting jawaban saya, itu tidak terlihat seperti pertanyaan awal telah dijawab. Pertanyaan aslinya adalah "Bagaimana Anda meminta input pengguna dan kemudian mengubah haluan dan menggunakannya dalam perintah lain?" Saya percaya jawaban saya dengan sukses menjawab pertanyaan itu. Plus ketika Anda mencari di Google untuk "bagaimana Anda mendapatkan input pengguna dari file batch" pertanyaan ini adalah # 2 dalam hasil sehingga perlu jawaban yang benar yang menurut saya untuk forum ini.
jayfessenden
14
Ruang setelah =itu tidak perlu.
Joey
Mengapa kita membutuhkan ruang? Apa sebenarnya yang terjadi dalam ruang cmdyang tidak memungkinkan?
ytpillai
@ Joey Saya setuju, halaman robvanderderwoude.com tidak memiliki ruangSET /P variable=[promptString]
icc97
31

Saya tidak yakin jika ini adalah kasus untuk semua versi Windows, namun pada mesin XP yang saya miliki, saya perlu menggunakan yang berikut ini:

set /p Var1="Prompt String"

Tanpa string tanda kutip , saya mendapatkan berbagai hasil tergantung pada teks.

Daniel
sumber
+1 untuk "berbagai hasil tergantung pada teks": Saya memiliki masalah yang sama. Sekarang ia mencetak tanda kutip dengan teks, tetapi tidak ada lagi perilaku aneh.
Benj
6
gunakan sintaks ini untuk mendapatkan tanda kutip, tetapi hindari menunjukkannya :set /p "var1=Prompt String"
Stephan
Ini berguna untuk menggunakan tanda kutip dan menyertakan spasi di bagian akhir karena membuat prompt pada baris perintah lebih bagus. Memiliki tanda kutip membuatnya jelas bahwa ada ruang di sana dalam file batch. set /p Var1="Prompt String "Kemudian ketika Anda menjalankan file dan pengguna mengetik sesuatu yang Anda dapatkan Prompt String YesbukannyaPrompt StringYes
icc97
22
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

Ruang setelah =sangat penting.

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

jika saya mendapatkan apa yang Anda inginkan, ini berfungsi dengan baik. Anda dapat menggunakan% input% di perintah lain juga.

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 
fedeb
sumber
8
@echo off
:start
set /p var1="Enter first number: "
pause
Anisha Gupta
sumber
2
Mengapa Anda memulainya :start?
Benj
1
:starthanyalah penanda ... Misalnya, ia mungkin menggunakan :endjuga, yang menyebabkan hal-hal seperti pembersihan variabel terjadi, atau untuk memanggil popd, atau sesuatu seperti itu. Kemudian, Anda juga memiliki opsi untuk menggunakan IF ERRORLEVEL1 GOTO END... atau bahkan GOTO ERR, dan di bawah :errada sesuatu seperti gema Terjadi Kesalahan saat mencoba untuk mendapatkan nomor file. goto: end Mungkin itu kebiasaan, ...
LarryF
8

Tidak ada parameter yang didokumentasikan / diminta untuk SETX karena ada untuk SET.

Jika Anda perlu meminta variabel lingkungan yang akan selamat dari reboot, Anda dapat menggunakan SETX untuk menyimpannya.

Variabel yang dibuat oleh SETX tidak akan dapat digunakan sampai Anda me-restart command prompt. Namun, Anda bisa SETX variabel yang sudah SET, bahkan jika itu memiliki nama yang sama.

Ini berfungsi untuk saya di Windows 8.1 Pro:

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

(Tanda kutip di sekitar variabel yang ada diperlukan.)

Prosedur ini memungkinkan Anda untuk menggunakan variabel yang dibuat SET sementara selama sesi saat ini dan akan memungkinkan Anda untuk menggunakan kembali variabel yang dibuat SETX pada saat reboot komputer atau memulai kembali prompt CMD.

(Diedit untuk memformat paragraf kode dengan benar.)

Timothy J. McGowan
sumber
5

Saya memiliki cmd kecil yang saya gunakan ketika menyiapkan pc untuk klien: ia memanggil pengguna untuk input, dan mengubah nama pc menjadi itu.

@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
Werdna
sumber
Hai lagi skrip yang berguna ini digunakan pada PC Win10 setelah pengaturan awal :-)
Werdna
5

Ada dua kemungkinan.

  1. Anda lupa untuk menempatkan %id%di jstackpanggilan.

    jstack %id% > jstack.txt
    

Jadi keseluruhan file batch yang benar adalah:

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

Dan / Atau 2. Anda memasukkannya ke dalam kode (dan lupa memberi tahu kami dalam pertanyaan) tetapi ketika Anda menjalankan file batch Anda menekan tombol Enter alih-alih mengetikkan ID (misalnya 1234).

Apa yang terjadi adalah hasil dari dua kesalahan ini: jstackseharusnya dipanggil dengan id yang Anda berikan.

Tetapi dalam kasus Anda (sesuai dengan kode yang Anda berikan dalam pertanyaan) Anda menyebutnya tanpa variabel apa pun. Kau menulis:

jstack > jstack.txt

Jadi ketika Anda menjalankan jstacktanpa variabel itu menghasilkan yang berikut:

Terminate batch file Y/N? 

Kesalahan kedua Anda adalah bahwa Anda menekan Enter bukannya memberikan nilai ketika program meminta Anda: Enter ID:. Jika Anda akan memasukkan ID pada titik ini, katakan 1234, %id%variabel akan menjadi nilai itu, dalam kasus kami 1234. Tetapi Anda TIDAK memberikan nilai dan sebaliknya menekan Enter. Ketika Anda tidak memberikan variabel nilai apa pun, dan jika variabel itu tidak disetel ke hal lain sebelumnya, maka variabel %id%tersebut disetel ke prompt setperintah !! Jadi sekarang %id%diatur ke Enter ID:yang digaungkan di layar Anda seperti yang diminta dalam file batch SEBELUM Anda memanggil jstack.

Tapi saya curiga Anda TIDAK memiliki jstack %id% > jstack.txtkode file batch Anda dengan %id(dan dihilangkan karena kesalahan dari pertanyaan), dan Anda menekan enter tanpa mengetikkan id. Program batch kemudian menggemakan id, yang sekarang "Masukkan ID:", dan kemudian jalankanjstack Enter ID: > jstack.txt

Jstack sendiri menggemakan input, menemukan kesalahan dan meminta untuk mengakhiri.
Dan semua ini ditulis dalam file jstack.txt.

pashute
sumber
3

Tanda-tanda dolar di sekitar variabel tidak berfungsi pada mesin Vista saya, tetapi tanda-tanda persen berhasil. Perhatikan juga bahwa spasi tambahan pada baris "set" akan muncul di antara prompt dan input pengguna.

SRE
sumber
ruang tertinggal? win7 x64 rus: C:\>set /p DestPath="Type path:"dan baris berikutnya adalahType path:c:\dddd
Arioch 'The
2
$ sign untuk variabel bash atau unix. Tanda %% untuk variabel windows.
noob
Jika Anda memiliki SETLOCAL ENABLEDELAYEDEXPANSIONdalam file batch Anda, Anda dapat menggunakan !EnvVariable!untuk memperluas ke nilainya selama loop FOR, atau hal-hal lain yang tidak memperluas makro sampai baris benar-benar diproses oleh pengurai Cmd. Lihat cmd /?informasi tentang ini, dan juga help setlocal...
LarryF
2

Baru saja menambahkan

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

urutan ke pekerjaan batch netsh saya. Sekarang menunjukkan kepada saya lokasi saya merespons sebagai titik untuk sampel itu. Saya terus-menerus >> file output jadi saya tahu sekarang "home", "work", "Starbucks", dll. Mencari udara yang jernih, saya dapat meregulasi saluran dengan penggunaan terendah dan apakah ada 5 atau hanya semua WLAN 2,4 MHz di sekitar.

John
sumber
2

Hanya untuk menjaga nilai default variabel. Tekan Enter untuk menggunakan default dari menjalankan .bat baru-baru ini:

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

rem YourApp %Var1%

Dalam menjalankan pertama mengabaikan pesan tentang kurangnya file dengan nilai awal variabel (atau membuat Var1.txt secara manual).

Antoni
sumber
(set /p var=<var1.txt) 2>nulakan menekan errormessage. Anda juga dapat memberi set var1=defaultalih-alih mendapatkan sesuatu dari file
Stephan
Stephan, Bagian kedua dari proposal Anda tidak mempertahankan nilai-nilai antara berjalan !? Bisakah Anda mengembangkannya lebih lanjut?
Antoni
tidak, tidak di antara run. Itu hanya memberikan nilai default. (tidak ada permintaan untuk menyimpan nilai antar proses dalam pertanyaan).
Stephan