Windows cmd'de, kullanıcı girdisini nasıl isteyebilirim ve sonucu başka bir komutta nasıl kullanabilirim?


398

Kullanıcı girdisini kabul etmek ve daha sonra bu komutun sonuçlarını ek komutlara çağrı olarak kullanmak istediğiniz bir Windows .bat dosyası var.

Örneğin, kullanıcıdan bir işlem kimliğini kabul etmek ve sonra bu kimliğe karşı jstack çalıştırmak, jstack çağrısının sonuçlarını bir dosyaya koymak istiyorum. Ancak bunu denediğimde işe yaramıyor.

İşte benim örnek bat dosya içeriği:

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

ve işte jstack.txt dosyasında görünen:

Kimlik girin: Toplu işi sonlandır (E / H)? 

2
"Toplu işi sonlandır (E / H)?" genellikle .bat çalışırken ctrl-c tuşlarına bastığınızda görünür.
Jim Buck

2
Jstack.txt, jstack çıktısını ve toplu iş dosyanızla ilgili hiçbir şey içermez ve ayrıca Jstack'un ne olduğunu söylemediniz.
sgmoore

1
Bu cevapların hiçbiri işe yaramadı mı? Değilse, bir çözüm buldunuz mu? Bunu yaptıysanız, burada kendi kendine yanıt olarak yayınlamanız yararlı olacaktır.
Maslor

1
Eğer giriş için sabit seçenekler istiyorsanız kullanmak choicedaha iyidirset /p
icc97

2
Lütfen yazımı yanıt olarak işaretleyin, özü, toplu programı çalıştırırken komut isteminde bir kimlik vermek yerine Enter tuşuna basmanız ve bu nedenle% id% değerinin sağlamanız Enter ID: gereken bazı kimlik yerine ayarlanmış olmasıdır. klavye.
pashute

Yanıtlar:


459

Bunu dene:

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

Daha sonra %id%gibi başka bir toplu iş dosyasına parametre olarak kullanabilirsiniz jstack %id%.

Örneğin:

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

2
SET komutunun çıktısını NIL: ile birleştirmenin bir yolu var mı, böylece yazmayı gizleyebilirsiniz? set /p id=Enter ID:\r\n set /p pw=Enter Passwd:Şunu yapmak istiyorsanız: ve şifre metninin "DosKey" komut arabelleğinde gösterilmesini ister misiniz? Birkaç farklı yol denedim ve bunu yapmanın bir yolunu bulamadım, girişi almak için küçük bir C programı yazmanın dışında ve bir EnvVar'a atadım, ama bu hile yapıyor! :) SADECE Windows CMD'lerle çalışmasını istiyorum.
LarryF


4
Sonundaki alanın eklenen güzelliğine dikkat edin "Enter ID: ". İstem ve kullanıcı yanıtı arasında küçük bir boşluk bırakır. Delete the internet?No sillyvs Delete the internet? No silly.
icc97

Tırnaklara gerek yok. @Instantsoup'un eksik olduğu şey, satırdaki '% id%'jstack %id% > jstack.txt
pashute

1
Değişkeni geçerli toplu iş için yerel tutmak istiyorsanız SETLOCALve kullanın ENDLOCAL. Bkz. Ss64.com/nt/endlocal.html
endo64

99

Sözdizimi aşağıdaki gibidir: set /p variable=[string]

Check out http://commandwindows.com/batch.htm veya http://www.robvanderwoude.com/userinput.php Windows işletim sistemi toplu dosyaların farklı sürümleri ile kullanıcı girişi içine daha derin dalış için.

Değişkeninizi ayarladıktan sonra, bunu aşağıdaki şekilde kullanmaya devam edebilirsiniz.

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

%VariableName%sözdizimini not et


Lütfen cümlenizi bitirin ... başka bir link ekleyecek misiniz? Ayrıca, yukarıdakilerin tümünü bir Windows 7 cmd.exekabuğunda test ettim ve her biri - istisnasız - keyfi olarak adlandırılmış bir değişkene kullanıcı girişi atar. Yanıtınız daha önce verilmiş olanları nasıl süslüyor?
chb

3
Cevabımı gönderdiğimde asıl soru cevaplanmış gibi görünmüyordu. Asıl soru "Kullanıcı girdisini ve ardından geri dönüşü nasıl istersiniz ve başka bir komutta nasıl kullanırsınız?" Cevabımı soruyu kısa ve öz bir şekilde yanıtladı. Ayrıca Google'da "bir toplu iş dosyasından kullanıcı girdisini nasıl alırsınız" araması yaptığınızda, bu soru sonuçların # 2'sidir, bu yüzden bu forumun neden olduğu doğru cevaba ihtiyacı vardır.
jayfessenden

14
Sonra boşluk =gerekli değildir.
Joey

Neden alana ihtiyacımız var? Boşluğa cmdizin vermeyen şeyde tam olarak neler oluyor ?
ytpillai

@Joey Kabul ediyorum, robvanderderwoude.com sayfasında yer yokSET /P variable=[promptString]
icc97

31

Windows'un tüm sürümleri için durumun bu olup olmadığından emin değilim, ancak sahip olduğum XP makinesinde aşağıdakileri kullanmam gerekiyor:

set /p Var1="Prompt String"

Tırnak içinde bilgi istemi dizesi olmadan, metne bağlı olarak çeşitli sonuçlar elde ederim.


+1 "metne bağlı olarak çeşitli sonuçlar" için: Aynı sorunu yaşadım. Şimdi tırnak işaretleri metinle birlikte yazdırılıyor, ancak artık garip bir davranış yok.
Benj

6
Bu sözdizimini kullanın sahip tırnak, ancak kaçının gösteren onları:set /p "var1=Prompt String"
Stephan

Tırnakları kullanmak ve komut satırındaki istemi daha hoş hale getirdiği için sonuna bir boşluk eklemek yararlıdır. Tırnaklara sahip olmak, toplu iş dosyasında bir boşluk olduğunu açıkça gösterir. set /p Var1="Prompt String "Sonra dosyayı çalıştırdığınızda ve kullanıcı Prompt String Yesbunun yerine bir şey Prompt StringYes
yazdığınızda

22
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

Sonraki boşluk =çok önemlidir.


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

eğer istediğini alırsam, bu iyi çalışıyor. % input% komutunu diğer komutlarda da kullanabilirsiniz.

@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
Neden başlıyorsun :start?
Benj

1
:startyalnızca bir işaretleyicidir ... Örneğin, :enddeğişken temizleme gibi şeylerin gerçekleşmesine veya a popdya da bunun gibi bir şeyin çağrılmasına neden olan bir de kullanabilir. Daha sonra, bir IF ERRORLEVEL1 GOTO END... veya hatta a kullanma seçeneğiniz de var GOTO ERRve altında :erryankı gibi bir şey var. Dosya numarasını almaya çalışırken bir Hata oluştu. goto: end Muhtemelen bir alışkanlık materyali ...
LarryF

8

SET için SETX için belgelenmiş / bilgi istemi parametresi yoktur.

Yeniden başlatmalardan kurtulacak bir ortam değişkeni istemeniz gerekiyorsa, saklamak için SETX'i kullanabilirsiniz.

Komut istemini yeniden başlatana kadar SETX tarafından oluşturulan bir değişken kullanılamaz. Bununla birlikte, aynı ada sahip olsa bile, zaten ayarlanmış bir değişkeni SETX olarak düzenleyebilirsiniz.

Windows 8.1 Pro'da benim için çalışıyor:

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

(Mevcut değişkenin etrafındaki tırnak işaretleri gereklidir.)

Bu yordam, geçerli oturum sırasında geçici SET tarafından oluşturulan değişkeni kullanmanıza ve bilgisayarın yeniden başlatılması veya CMD isteminin yeniden başlatılması üzerine SETX tarafından oluşturulan değişkeni yeniden kullanmanıza olanak tanır.

(Kod paragraflarını düzgün biçimlendirmek için düzenlenmiştir.)


5

Ben pc istemcilere hazırlarken kullanmak küçük bir cmd var: bu giriş için kullanıcıyı çağırır ve pc yeniden adlandırın.

@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

Merhaba yine bu yararlı komut :-) ilk kurulumdan sonra Win10 pc kullanılır
Werdna

5

İki olasılık vardır.

  1. Sen koymayı unutmuş %id%içinde jstackçağrı.

    jstack %id% > jstack.txt
    

Yani tüm doğru toplu iş dosyası şöyle olmalıdır:

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

Ve / Veya 2. Kodu koydunuz (ve soruda bize söylemeyi unuttunuz), ancak toplu iş dosyasını çalıştırdığınızda, bir kimlik yazmak yerine Enter tuşuna basın (diyelim 1234).

Olan şey şu iki hatanın sonucudur: jstacksağladığınız kimliğe sahip olması gerekir.

Ancak sizin durumunuzda (soruda verdiğiniz koda göre) herhangi bir değişken olmadan aradınız. Sen yazdın:

jstack > jstack.txt

Yani jstackdeğişken olmadan çalıştırdığınızda aşağıdakileri çıkarır:

Terminate batch file Y/N? 

Sizin ikinci hata yerine programın sorduğumda bir değer verme girin preslenmiş olmasıdır: Enter ID:. Bu noktaya, örneğin 1234'e bir kimlik girseydiniz, %id%değişken bizim durumumuzda 1234 olan bu değer haline gelir. Değişkene herhangi bir değer vermezseniz ve bu değişken daha önce başka bir değere ayarlanmamışsa, değişken komut %id%istemine ayarlanır set!! Yani şimdi %id%ayarlandığında Enter ID:Eğer jstack denilen ÖNCE toplu dosyasında istendiği gibi ekranda yankılandı edildi.

Ancak jstack %id% > jstack.txt, toplu dosya kodunuzda %id(ve sorunun yanlışlıkla atlanmış) olduğunu ve bir kimlik yazmadan enter tuşuna bastığınızdan şüpheleniyorum . Daha sonra, toplu iş programı şimdi "Kimlik Girin:" olan kimliği tekrarladı ve ardındanjstack Enter ID: > jstack.txt

Jstack kendisi girişi tekrarladı, bir hatayla karşılaştı ve sonlandırılmasını istedi.
Ve tüm bunlar jstack.txt dosyasına yazılmıştır.


3

Değişkenin etrafındaki dolar işaretleri Vista makinemde çalışmıyor, ancak yüzde işaretleri çalışıyor. Ayrıca, "set" satırında, bilgi istemi ve kullanıcı girişi arasında bir boşluk gösterileceğini de unutmayın.


boşluk mu? win7 x64 rus: C:\>set /p DestPath="Type path:"ve sonraki satırType path:c:\dddd
Arioch 'The

2
$ işareti bash veya unix değişkenleri içindir. %% sign, Windows değişkenleri içindir.
noob

Eğer bir varsa SETLOCAL ENABLEDELAYEDEXPANSIONtoplu iş dosyasında kullanabileceğiniz !EnvVariable!döngüler veya satır aslında Cmd ayrıştırıcı tarafından işlenir kadar makro 's genişlemez başka şeyler İÇİN sırasında değerine genişletmek için. Bkz cmd /?sıra sıra, bu konuda bilgi almak için help setlocal...
LarryF

2

Yeni ekledim

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

benim netsh toplu iş dizisi. Şimdi bana o örnek için puan olarak cevap verdiğim yeri gösteriyor. Ben sürekli >> çıkış dosyası böylece şimdi "ev", "iş", "Starbucks", vb biliyorum. Temiz hava arıyor, ben en düşük kullanım kanalları ve çevresinde 5 veya sadece 2,4 MHz WLAN olup olmadığını eavulate olabilir.


2

Değişkenin varsayılan değerini korumak için. .Bat'ınızın son çalıştırmasından varsayılanı kullanmak için Enter tuşuna basın:

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

rem YourApp %Var1%

İlk çalıştırmada, değişkenin başlangıç ​​değeri olan dosya eksikliği hakkındaki mesajı yok sayın (veya Var1.txt dosyasını manuel olarak oluşturun).


(set /p var=<var1.txt) 2>nulhata mesajını bastırır. set var1=defaultBir dosyadan bir şey almak yerine de verebilirsiniz
Stephan

Stephan, Teklifinizin ikinci kısmı koşular arasındaki değerleri korumuyor !? Daha fazla geliştirebilir misiniz?
Antoni

hayır, koşular arasında değil. Sadece varsayılan bir değer verir. (değeri sorudaki işlemler arasında saklama isteği yoktu).
Stephan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.