In Windows cmd, come posso richiedere l'input dell'utente e utilizzare il risultato in un altro comando?


398

Ho un file .bat di Windows che vorrei accettare l'input dell'utente e quindi utilizzare i risultati di tale input come parte della chiamata a comandi aggiuntivi.

Ad esempio, vorrei accettare un ID processo dall'utente, quindi eseguire jstack su tale ID, inserendo i risultati della chiamata jstack in un file. Tuttavia, quando provo questo, non funziona.

Ecco il contenuto del mio file bat di esempio:

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

ed ecco cosa appare in jstack.txt:

Inserisci ID: termina processo batch (S / N)? 

2
"Termina processo batch (S / N)?" in genere viene visualizzato quando si preme ctrl-c mentre il .bat è in esecuzione.
Jim Buck,

2
Jstack.txt conterrà l' output di jstack e nulla relativo al file batch e inoltre non hai detto cos'è Jstack.
sgmoore,

1
Nessuna di queste risposte ha funzionato? In caso contrario, hai trovato una soluzione? Se lo facessi, sarebbe utile se lo avessi pubblicato qui come risposta automatica.
Maslor,

1
Se vuoi opzioni fisse per l'input, è meglio usare choicethanset /p
icc97

2
Si prega di contrassegnare il mio post come risposta, la cui essenza è che quando si esegue il programma batch si preme Invio invece di fornire un ID al prompt, e quindi l'ID%% è stato impostato su Enter ID: piuttosto che un ID da cui si supponeva di fornire la tastiera.
pashute,

Risposte:


459

Prova questo:

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

È quindi possibile utilizzare %id%come parametro per un altro file batch come jstack %id%.

Per esempio:

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

2
C'è un modo per reindirizzare l'output del comando SET su NIL :, in modo da poter nascondere la digitazione? Come se volessi fare un: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:e non volessi mostrare il testo della password nella finestra, figuriamoci, mostrare nel buffer dei comandi "DosKey"? Ho provato diversi modi e non sono stato in grado di trovare un modo per farlo, oltre a scrivere un piccolo programma C per prendere l'input e assegnarlo a un EnvVar, ma questo è barare! :) Voglio che funzioni con JUST Windows CMD.
LarryF,


4
Nota la finezza aggiunta dello spazio alla fine di "Enter ID: ". Dà un piccolo spazio dolce tra il prompt e la risposta dell'utente. Delete the internet?No sillyvs Delete the internet? No silly.
icc97,

Non c'è bisogno di preventivi. Quello che mancava a @Instantsoup era "% id%" nella rigajstack %id% > jstack.txt
pashute

1
Utilizzare SETLOCALe ENDLOCALse si desidera mantenere la variabile locale nel batch corrente. Vedi ss64.com/nt/endlocal.html
endo64

99

La sintassi è come tale: set /p variable=[string]

Dai un'occhiata a http://commandwindows.com/batch.htm o http://www.robvanderwoude.com/userinput.php per un'analisi più approfondita dell'input dell'utente con le diverse versioni dei file batch del sistema operativo Windows.

Dopo aver impostato la variabile, puoi quindi usarla nel modo seguente.

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

notare la %VariableName%sintassi


Per favore, finisci la frase ... hai intenzione di includere un altro link? Inoltre, ho testato tutto quanto sopra in una cmd.exeshell di Windows 7 e ciascuno, senza eccezioni, assegna l'input dell'utente a una variabile denominata arbitrariamente. In che modo la tua risposta si arricchisce di ciò che è già stato fornito?
chb

3
Quando ho pubblicato la mia risposta, non sembrava proprio che fosse stata data una risposta alla domanda originale. La domanda originale è "Come si fa a chiedere l'input dell'utente, quindi il turnaround e usarlo in un altro comando?" Credo che la mia risposta abbia risposto con successo alla domanda. Inoltre, quando cerchi su Google "come si ottiene l'input dell'utente da un file batch", questa domanda è n. 2 nei risultati, quindi ha bisogno della risposta corretta che pensavo fosse questo forum.
jayfessenden,

14
Lo spazio dopo il =non è necessario.
Joey,

Perché abbiamo bisogno dello spazio? Cosa succede esattamente nel cmdche non consente lo spazio?
ytpillai,

@Joey sono d'accordo, la pagina robvanderderwoude.com non ha spazioSET /P variable=[promptString]
icc97

31

Non sono sicuro se questo è il caso per tutte le versioni di Windows, tuttavia sulla macchina XP che ho, devo usare quanto segue:

set /p Var1="Prompt String"

Senza la stringa di prompt tra virgolette , ottengo vari risultati a seconda del testo.


+1 per "vari risultati a seconda del testo": ho avuto lo stesso problema. Ora stampa le virgolette con il testo, ma non c'è più un comportamento strano.
Benj,

6
usa questa sintassi per avere le virgolette, ma evita di mostrarle :set /p "var1=Prompt String"
Stephan,

È utile usare le virgolette e includere uno spazio alla fine in quanto rende più gradevole il prompt sulla riga di comando. Avere le virgolette rende ovvio che c'è uno spazio nel file batch. set /p Var1="Prompt String "Quindi quando esegui il file e l'utente digita qualcosa che ricevi Prompt String Yesinvece diPrompt StringYes
icc97

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

Lo spazio dopo =è molto importante.


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

se ottengo quello che vuoi, funziona benissimo. puoi usare% input% anche in altri comandi.

@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
Perché inizi :start?
Benj,

1
:startè solo un marcatore ... Ad esempio, potrebbe usare anche un :end, che fa accadere cose come la pulizia variabile, o per chiamare un popd, o qualcosa del genere. Quindi, hai anche la possibilità di usare un IF ERRORLEVEL1 GOTO END... o anche un GOTO ERR, e sotto :errhai qualcosa come echo Si è verificato un errore durante il tentativo di ottenere il numero di file. goto: end Probabilmente è una questione di abitudine ...
LarryF

8

Non esiste un parametro documentato / prompt per SETX come per SET.

Se è necessario richiedere una variabile di ambiente che sopravviverà al riavvio, è possibile utilizzare SETX per memorizzarla.

Una variabile creata da SETX non sarà utilizzabile fino al riavvio del prompt dei comandi. Ordinariamente, tuttavia, è possibile impostare una variabile che è già stata impostata su SETX, anche se ha lo stesso nome.

Questo funziona per me in Windows 8.1 Pro:

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

(Sono necessarie le virgolette attorno alla variabile esistente.)

Questa procedura consente di utilizzare la variabile temporanea creata da SET durante la sessione corrente e di riutilizzare la variabile creata da SETX al riavvio del computer o al riavvio del prompt CMD.

(Modificato per formattare correttamente i paragrafi di codice.)


5

Ho un po 'di cmd che uso quando preparo il pc ai client: chiama l'utente per l'input e lo rinomina al PC.

@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

Ciao di nuovo questo utile script viene utilizzato sul PC Win10 dopo l'installazione iniziale :-)
Werdna,

5

Vi sono due possibilità.

  1. Hai dimenticato di inserire %id%la jstackchiamata.

    jstack %id% > jstack.txt
    

Quindi l'intero file batch corretto dovrebbe essere:

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

E / o 2. L'hai inserito nel codice (e hai dimenticato di comunicarcelo nella domanda) ma quando hai eseguito il file batch hai premuto il tasto Invio invece di digitare un ID (ad esempio 1234).

Quello che sta succedendo è il risultato di questi due errori: jstack dovrebbe essere chiamato con l'id che gli viene fornito.

Ma nel tuo caso (in base al codice che hai fornito nella domanda) l'hai chiamato senza alcuna variabile. Hai scritto:

jstack > jstack.txt

Pertanto, quando si esegue jstacksenza variabili, viene visualizzato quanto segue:

Terminate batch file Y/N? 

Il tuo secondo errore è che è stato premuto Invio invece di dare un valore quando il programma ti ha chiesto: Enter ID:. Se a questo punto avessi inserito un ID, diciamo 1234, la %id%variabile diventerebbe quel valore, nel nostro caso 1234. Ma NON hai fornito un valore e invece hai premuto Invio. Quando non si assegna alcun valore alla variabile e se quella variabile non era stata impostata prima per nessun altro, la variabile %id%viene impostata al prompt del setcomando !! Quindi ora %id%è impostato su Enter ID:quale è stato fatto eco sullo schermo come richiesto nel file batch PRIMA di aver chiamato jstack.

Ma ho il sospetto che tu abbia DID jstack %id% > jstack.txtnel codice del file batch con %id(e lo abbia omesso per errore dalla domanda), e che premi Invio senza digitare un ID. Il programma batch ha quindi fatto eco all'ID, che ora è "Immetti ID:", quindi eseguitojstack Enter ID: > jstack.txt

Jstack stesso ha fatto eco all'input, ha riscontrato un errore e ha chiesto di terminare.
E tutto questo è stato scritto nel file jstack.txt.


3

I segni di dollaro attorno alla variabile non funzionano sulla mia macchina Vista, ma i segni di percentuale funzionano. Si noti inoltre che verrà visualizzato uno spazio finale sulla riga "set" tra il prompt e l'input dell'utente.


spazio finale? win7 x64 rus: C:\>set /p DestPath="Type path:"e la riga successiva èType path:c:\dddd
Arioch 'The

2
$ sign è per le variabili bash o unix. Il segno %% è per le variabili di Windows.
noob,

Se hai un SETLOCAL ENABLEDELAYEDEXPANSION nel file batch è presente un file, è possibile utilizzarlo !EnvVariable!per espanderlo al valore durante i cicli FOR o altre cose che non espandono le macro fino a quando la riga non viene effettivamente elaborata dal parser Cmd. Vedi cmd /?per informazioni su questo, così come help setlocal...
LarryF

2

Ho appena aggiunto il

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

sequenza al mio lavoro batch netsh. Ora mi mostra la posizione in cui rispondo come punto per quel campione. Continuo a >> il file di output, quindi ora so "casa", "lavoro", "Starbucks", ecc. In cerca di aria pulita, posso cercare i canali di utilizzo più bassi e se ci sono 5 o solo tutte le WLAN da 2,4 MHz in circolazione.


2

Solo per mantenere un valore predefinito della variabile. Premi Invio per utilizzare le impostazioni predefinite della recente esecuzione di .bat:

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

rem YourApp %Var1%

Nella prima esecuzione basta ignorare il messaggio sulla mancanza di file con il valore iniziale della variabile (o creare manualmente Var1.txt).


(set /p var=<var1.txt) 2>nulsuppres l'errore. Puoi anche dare set var1=defaultinvece di ottenere qualcosa da un file
Stephan,

Stephan, La seconda parte della proposta non conserva i valori tra le esecuzioni !? Puoi svilupparlo di più?
Antoni,

no, non tra una corsa e l'altra. Fornisce solo un valore predefinito. (non è stata richiesta la memorizzazione del valore tra le esecuzioni nella domanda).
Stephan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.