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)?
windows
batch-file
prompt
Nakilon
la source
la source
choice
queset /p
Enter ID:
plutôt que sur un ID que vous étiez censé fournir le clavier.Réponses:
Essaye ça:
Vous pouvez ensuite utiliser
%id%
comme paramètre un autre fichier de commandes commejstack %id%
.Par exemple:
la source
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."Enter ID: "
. Donne un petit espace doux entre l'invite et la réponse de l'utilisateur.Delete the internet?No silly
vsDelete the internet? No silly
.jstack %id% > jstack.txt
SETLOCAL
etENDLOCAL
si vous souhaitez conserver la variable locale dans le lot en cours. Voir ss64.com/nt/endlocal.htmlLa 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.
noter la
%VariableName%
syntaxela source
cmd.exe
shell 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?=
n'est pas nécessaire.cmd
qui ne laisse pas d'espace?SET /P variable=[promptString]
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:
Sans la chaîne d'invite entre guillemets , j'obtiens divers résultats selon le texte.
la source
set /p "var1=Prompt String"
set /p Var1="Prompt String "
Ensuite, lorsque vous exécutez le fichier et que l'utilisateur tape quelque chose que vous obtenezPrompt String Yes
au lieu dePrompt StringYes
L'espace après
=
est très important.la source
si j'obtiens ce que tu veux, ça marche bien. vous pouvez également utiliser% input% dans d'autres commandes.
la source
la source
:start
?:start
n'est qu'un marqueur ... Par exemple, il pourrait également utiliser un:end
, qui provoque des choses comme le nettoyage des variables, ou pour appeler unpopd
, ou quelque chose comme ça. Ensuite, vous avez également la possibilité d'utiliser unIF ERRORLEVEL1 GOTO END
... ou même unGOTO ERR
, et sous:err
quelque 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 ...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:
(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.)
la source
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.
la source
Il y a deux possibilités.
Vous avez oublié de mettre
%id%
l'jstack
appel dans l' appel.Le fichier de commandes correct devrait donc être:
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:
jstack
est 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:
Ainsi, lorsque vous exécutez
jstack
sans variable, il génère les éléments suivants: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 laset
commande !! Il%id%
est donc maintenant défini surEnter 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.txt
code 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.
la source
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.
la source
C:\>set /p DestPath="Type path:"
et la ligne suivante estType path:c:\dddd
SETLOCAL ENABLEDELAYEDEXPANSION
fichier 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. Voircmd /?
pour plus d'informations à ce sujet, ainsi quehelp setlocal
...Je viens d'ajouter le
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.
la source
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:
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).
la source
(set /p var=<var1.txt) 2>nul
supprime le message d'erreur. Vous pouvez également donnerset var1=default
au lieu d'obtenir quelque chose d'un fichier