web-dev-qa-db-fra.com

Dans Windows cmd, comment demander des entrées à l'utilisateur et utiliser le résultat dans une autre commande?

J'ai un fichier Windows .bat dans lequel j'aimerais accepter les entrées utilisateur, puis utiliser les résultats de ces entrées 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 sur cet ID, en plaçant les résultats de l'appel de jstack dans un fichier. Cependant, quand j'essaye ça, ça ne marche pas.

Voici mon exemple de contenu du fichier bat:

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

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

 Entrer ID: Terminer le travail par lots (O/N)? 
329
marc

Essayez ceci:

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

Vous pouvez ensuite utiliser %id% en tant que paramètre dans un autre fichier de commandes, tel que jstack %id%.

Par exemple:

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

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 en profondeur dans la saisie de l'utilisateur avec les différentes versions des fichiers batch Windows OS.

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

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

notez la syntaxe %VariableName%

92
jayfessenden

Je ne suis pas sûr que ce soit le cas pour toutes les versions de Windows. Toutefois, sur la machine XP dont je dispose, je dois utiliser les éléments suivants:

set /p Var1="Prompt String"

Sans la chaîne d'invite dans guillemets, j'obtiens divers résultats en fonction du texte.

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

si j'obtiens ce que vous voulez, cela fonctionne bien. vous pouvez aussi 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 
13
fedeb
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

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

12
hannad rehman
@echo off
:start
set /p var1="Enter first number: "
pause
7
Anisha Gupta

Il n'y a pas de paramètre documenté/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 utilisable que si vous relancez la commande Invite. Cependant, vous pouvez régler SETX une variable qui a déjà été SET, même si elle porte 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 permettra de réutiliser la variable créée par SETX lors du redémarrage de l'ordinateur ou du redémarrage de l'invite CMD.

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

7
Timothy J. McGowan

J'ai un petit cmd que j'emploie en préparant le PC aux clients: il appelle l'utilisateur pour l'entrée, et renomme le PC à 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
4
Werdna

Il y a deux possibilités.

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

    jstack %id% > jstack.txt
    

Donc, le fichier de commandes correct doit être:

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

And/Or 2. Vous l'avez entré dans le code (et vous avez oublié de nous l'indiquer dans la question), mais lorsque vous avez exécuté le fichier de traitement par lots, vous avez appuyé sur la touche Entrée au lieu de saisir un identifiant (par exemple 1234).

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

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 jstack sans variable, les éléments suivants sont générés:

Terminate batch file Y/N? 

Votre deuxième erreur est que vous avez appuyé sur Entrée au lieu de donner une valeur lorsque le programme vous a demandé: Enter ID:. Si vous auriez entré un identifiant à ce stade, par exemple 1234, la variable %id% deviendrait cette valeur, dans notre cas 1234. Mais vous n'avez PAS fourni de valeur et avez à la place appuyé sur Entrée. Si vous ne donnez aucune valeur à la variable et si cette variable n'a pas été définie auparavant, la variable %id% est définie sur l'invite de la commande set !! Donc maintenant %id% est défini sur Enter ID: qui a été répercuté sur votre écran comme demandé dans le fichier de commandes AVANT que vous ayez appelé le jstack.

Mais je suppose que vous DID avez le jstack %id% > jstack.txt dans votre code de fichier de commandes avec le %id (et vous l'avez omis par erreur de la question), et que vous appuyez sur entrée sans saisir d'identifiant. Le programme batch a ensuite répercuté l'id, qui est maintenant "Enter ID:", puis a exécuté jstack Enter ID: > jstack.txt.

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

3
pashute

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

2
SRE

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. J'ai continuellement >> le fichier de sortie pour que je sache maintenant "maison", "travail", "Starbucks", etc. À la recherche d'air pur, je peux utiliser les canaux les plus faibles et savoir s'il existe 5 ou seulement tous les WLAN de 2,4 MHz.

1
John

Juste pour garder une valeur par défaut de la variable. Appuyez sur Entrée pour utiliser les valeurs par défaut de l'exécution récente 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 relatif à l'absence de fichier avec la valeur initiale de la variable (ou créez manuellement le Var1.txt).

1
Antoni