Dans Windows cmd, comment puis-je demander une entrée utilisateur et utiliser le résultat dans une autre commande?

398

J'ai un fichier .bat Windows que j'aimerais accepter l'entrée utilisateur et puis utiliser les résultats de cette entrée dans le cadre de l'appel à des commandes supplémentaires.

Par exemple, j'aimerais accepter un ID de processus de l'utilisateur, puis exécuter jstack par rapport à cet ID, en plaçant les résultats de l'appel jstack dans un fichier. Cependant, lorsque j'essaie, cela ne fonctionne pas.

Voici mon exemple de contenu de fichier bat:

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

et voici ce qui apparaît dans jstack.txt:

Entrez l'ID: Terminer le travail par lots (O / N)? 
Nakilon
la source
2
"Mettre fin au travail par lots (O / N)?" s'affiche généralement lorsque vous appuyez sur ctrl-c pendant que votre .bat est en cours d'exécution.
Jim Buck
2
Jstack.txt contiendra la sortie de jstack et rien concernant votre fichier batch et vous n'avez pas dit ce qu'est Jstack.
sgmoore
1
Aucune de ces réponses n'a fonctionné? Sinon, avez-vous trouvé une solution? Si vous l'avez fait, il serait utile de le publier ici comme réponse automatique.
Maslor
1
Si vous voulez des options fixes pour l'entrée, vous feriez mieux d'utiliser choicequeset /p
icc97
2
Veuillez marquer mon message comme réponse, dont l'essence est que lorsque vous exécutez le programme batch, vous appuyez sur Entrée au lieu de fournir un ID à l'invite, et donc le% id% a été défini sur Enter ID: plutôt que sur un ID que vous étiez censé fournir le clavier.
pashute

Réponses:

459

Essaye ça:

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

Vous pouvez ensuite utiliser %id%comme paramètre un autre fichier de commandes comme jstack %id%.

Par exemple:

set /P id=Enter id: 
jstack %id% > jstack.txt
Instantsoup
la source
2
Existe-t-il un moyen de diriger la sortie de la commande SET vers NIL:, afin que vous puissiez masquer la saisie? Comme si vous vouliez faire un: set /p id=Enter ID:\r\n set /p pw=Enter Passwd:et que vous ne vouliez pas que le texte du mot de passe s'affiche dans la fenêtre, et encore moins dans le tampon de commande "DosKey"? J'ai essayé plusieurs façons différentes, et je n'ai pas réussi à trouver un moyen de le faire, à part écrire un petit programme C pour prendre l'entrée et l'assigner à un EnvVar, mais c'est de la triche! :) Je veux que cela fonctionne avec les JUST Windows CMD.
LarryF
4
Notez la finesse supplémentaire de l'espace à la fin de "Enter ID: ". Donne un petit espace doux entre l'invite et la réponse de l'utilisateur. Delete the internet?No sillyvs Delete the internet? No silly.
icc97
Pas besoin de devis. Ce qui manquait à @Instantsoup était le '% id% `dans la lignejstack %id% > jstack.txt
pashute
1
Utilisez SETLOCALet ENDLOCALsi vous souhaitez conserver la variable locale dans le lot en cours. Voir ss64.com/nt/endlocal.html
endo64
99

La syntaxe est la suivante: set /p variable=[string]

Consultez http://commandwindows.com/batch.htm ou http://www.robvanderwoude.com/userinput.php pour une plongée plus approfondie dans l'entrée utilisateur avec les différentes versions des fichiers de commandes du système d'exploitation Windows.

Une fois que vous avez défini votre variable, vous pouvez ensuite l'utiliser à la manière suivante.

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

noter la %VariableName%syntaxe

jayfessenden
la source
Veuillez terminer votre phrase ... allez-vous inclure un autre lien? En outre, j'ai testé tout ce qui précède dans un cmd.exeshell Windows 7 , et chacun - sans exception - attribue une entrée utilisateur à une variable nommée arbitrairement. Comment votre réponse embellit-elle ce qui a déjà été fourni?
chb
3
Lorsque j'ai posté ma réponse, cela ne ressemblait pas vraiment à la question d'origine. La question d'origine est "Comment demandez-vous une entrée utilisateur, puis une rotation et l'utiliser dans une autre commande?" Je crois que ma réponse a répondu succinctement à la question. De plus, lorsque vous effectuez une recherche dans Google pour "comment obtenir des informations utilisateur à partir d'un fichier de commandes", cette question est n ° 2 dans les résultats, elle a donc besoin de la bonne réponse, à laquelle je pensais que ce forum était destiné.
jayfessenden
14
L'espace après le =n'est pas nécessaire.
Joey
Pourquoi avons-nous besoin d'espace? Que se passe-t-il exactement dans le cmdqui ne laisse pas d'espace?
ytpillai
@Joey Je suis d'accord, la page robvanderderwoude.com n'a pas d'espaceSET /P variable=[promptString]
icc97
31

Je ne sais pas si c'est le cas pour toutes les versions de Windows, mais sur la machine XP que j'ai, je dois utiliser les éléments suivants:

set /p Var1="Prompt String"

Sans la chaîne d'invite entre guillemets , j'obtiens divers résultats selon le texte.

Daniel
la source
+1 pour "différents résultats selon le texte": j'ai eu le même problème. Maintenant, il imprime les citations avec le texte, mais il n'y a plus de comportement étrange.
Benj
6
utilisez cette syntaxe pour avoir les guillemets, mais évitez de les montrer :set /p "var1=Prompt String"
Stephan
Il est utile d'utiliser les guillemets et d'inclure un espace à la fin car cela rend l'invite sur la ligne de commande plus agréable. La présence de guillemets indique clairement qu'il y a un espace dans le fichier de commandes. set /p Var1="Prompt String "Ensuite, lorsque vous exécutez le fichier et que l'utilisateur tape quelque chose que vous obtenez Prompt String Yesau lieu dePrompt StringYes
icc97
22
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

L'espace après =est très important.

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

si j'obtiens ce que tu veux, ça marche bien. vous pouvez également utiliser% input% dans d'autres commandes.

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 
fedeb
la source
8
@echo off
:start
set /p var1="Enter first number: "
pause
Anisha Gupta
la source
2
Pourquoi commencez-vous :start?
Benj
1
:startn'est qu'un marqueur ... Par exemple, il pourrait également utiliser un :end, qui provoque des choses comme le nettoyage des variables, ou pour appeler un popd, ou quelque chose comme ça. Ensuite, vous avez également la possibilité d'utiliser un IF ERRORLEVEL1 GOTO END... ou même un GOTO ERR, et sous :errquelque chose comme écho Une erreur s'est produite lors de la tentative d'obtention du numéro de fichier. goto: end C'est probablement une question d'habitude ...
LarryF
8

Il n'y a pas de paramètre documenté / d'invite pour SETX comme pour SET.

Si vous devez demander une variable d'environnement qui survivra aux redémarrages, vous pouvez utiliser SETX pour la stocker.

Une variable créée par SETX ne sera pas utilisable tant que vous n'aurez pas redémarré l'invite de commande. Cependant, vous pouvez parfaitement SETX une variable qui a déjà été SET, même si elle a le même nom.

Cela fonctionne pour moi dans Windows 8.1 Pro:

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

(Les guillemets autour de la variable existante sont nécessaires.)

Cette procédure vous permet d'utiliser la variable temporaire créée par SET pendant la session en cours et vous permet de réutiliser la variable créée par SETX au redémarrage de l'ordinateur ou au redémarrage de l'invite CMD.

(Modifié pour formater correctement les paragraphes de code.)

Timothy J. McGowan
la source
5

J'ai un petit cmd que j'utilise lors de la préparation du PC aux clients: il appelle l'utilisateur pour la saisie, et le renomme le PC en cela.

@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
la source
Salut encore ce script utile est utilisé sur PC Win10 après la configuration initiale :-)
Werdna
5

Il y a deux possibilités.

  1. Vous avez oublié de mettre %id%l' jstackappel dans l' appel.

    jstack %id% > jstack.txt
    

Le fichier de commandes correct devrait donc être:

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

Et / Ou 2. Vous l'avez mis dans le code (et vous avez oublié de nous le dire dans la question) mais lorsque vous avez exécuté le fichier de commandes, vous avez appuyé sur la touche Entrée au lieu de taper un ID (par exemple 1234).

Ce qui se passe est le résultat de ces deux erreurs: jstackest censé être appelé avec l'identifiant que vous lui fournissez.

Mais dans votre cas (selon le code que vous avez fourni dans la question), vous l'avez appelé sans aucune variable. Tu as écrit:

jstack > jstack.txt

Ainsi, lorsque vous exécutez jstacksans variable, il génère les éléments suivants:

Terminate batch file Y/N? 

Votre deuxième erreur est que vous appuyez sur Entrée au lieu de donner une valeur lorsque le programme vous a demandé: Enter ID:. Si vous aviez %id%entré un ID à ce stade, par exemple 1234, la variable deviendrait cette valeur, dans notre cas 1234. Mais vous n'avez PAS fourni de valeur et vous avez plutôt appuyé sur Entrée. Lorsque vous ne donnez aucune valeur à la variable, et si cette variable n'a pas été définie sur autre chose auparavant, la variable %id%est définie à l'invite de la setcommande !! Il %id%est donc maintenant défini sur Enter ID:lequel a été répercuté sur votre écran comme demandé dans le fichier de commandes AVANT d'appeler le jstack.

Mais je soupçonne que vous aviez le jstack %id% > jstack.txtcode de votre fichier de commandes avec le %id(et l'avez omis par erreur de la question), et que vous appuyez sur Entrée sans taper un identifiant. Le programme par lots a ensuite fait écho à l'id, qui est maintenant "Enter ID:", puis a exécutéjstack Enter ID: > jstack.txt

Jstack lui-même a fait écho à l'entrée, a rencontré une erreur et a demandé de terminer.
Et tout cela a été écrit dans le fichier jstack.txt.

pashute
la source
3

Les signes dollar autour de la variable ne fonctionnent pas sur ma machine Vista, mais les signes pourcentage le font. Notez également qu'un espace de fin sur la ligne "set" apparaîtra entre l'invite et l'entrée utilisateur.

SRE
la source
espace de fuite? win7 x64 rus: C:\>set /p DestPath="Type path:"et la ligne suivante estType path:c:\dddd
Arioch 'Le
2
$ sign est pour les variables bash ou unix. Le signe %% est pour les variables Windows.
Noob
Si vous avez un SETLOCAL ENABLEDELAYEDEXPANSIONfichier dans votre fichier de commandes, vous pouvez l'utiliser !EnvVariable!pour le développer à sa valeur pendant les boucles FOR, ou d'autres choses qui ne développent pas les macros jusqu'à ce que la ligne soit réellement traitée par l'analyseur Cmd. Voir cmd /?pour plus d'informations à ce sujet, ainsi que help setlocal...
LarryF
2

Je viens d'ajouter le

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

séquence à mon travail par lots netsh. Il me montre maintenant l'emplacement auquel je réponds comme point pour cet échantillon. Je >> continuellement le fichier de sortie, donc je sais maintenant "maison", "travail", "Starbucks", etc.

John
la source
2

Juste pour garder une valeur par défaut de la variable. Appuyez sur Entrée pour utiliser la valeur par défaut de la dernière exécution de votre .bat:

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

rem YourApp %Var1%

Lors de la première exécution, ignorez simplement le message sur le manque de fichier avec la valeur initiale de la variable (ou créez manuellement Var1.txt).

Antoni
la source
(set /p var=<var1.txt) 2>nulsupprime le message d'erreur. Vous pouvez également donner set var1=defaultau lieu d'obtenir quelque chose d'un fichier
Stephan
Stephan, La deuxième partie de votre proposition ne conserve pas les valeurs entre les runs!? Pouvez-vous le développer davantage?
Antoni
non, pas entre les runs. Il donne juste une valeur par défaut. (il n'y a eu aucune demande de stockage de la valeur entre les exécutions dans la question).
Stephan