Tengo un archivo .bat de Windows que me gustaría aceptar la entrada del usuario y luego usar los resultados de esa entrada como parte de la llamada a comandos adicionales.
Por ejemplo, me gustaría aceptar una ID de proceso del usuario y luego ejecutar jstack contra esa ID, colocando los resultados de la llamada de jstack en un archivo. Sin embargo, cuando intento esto, no funciona.
Aquí está mi muestra del contenido del archivo bat:
@echo off
set /p id=Enter ID:
echo %id%
jstack > jstack.txt
y esto es lo que aparece en jstack.txt:
Ingresar ID: ¿Terminar trabajo por lotes (S / N)?
windows
batch-file
prompt
Nakilon
fuente
fuente
choice
set /p
Enter ID:
lugar de alguna ID desde la que se suponía que debía proporcionar el teclado.Respuestas:
Prueba esto:
Luego puede usarlo
%id%
como parámetro para otro archivo por lotes comojstack %id%
.Por ejemplo:
fuente
set /p id=Enter ID:\r\n set /p pw=Enter Passwd:
y no quisieras que el texto de la contraseña se muestre en la ventana, y mucho menos, que se muestre en el búfer de comando "DosKey"? He intentado varias formas diferentes, y no he podido encontrar una manera de hacerlo, aparte de escribir un pequeño programa en C para tomar la entrada y asignarla a un EnvVar, ¡pero eso es trampa! :) Quiero que funcione con SOLO CMD de Windows."Enter ID: "
. Da un pequeño espacio dulce entre la solicitud y la respuesta del usuario.Delete the internet?No silly
vsDelete the internet? No silly
.jstack %id% > jstack.txt
SETLOCAL
yENDLOCAL
si desea mantener la variable local en el lote actual. Ver ss64.com/nt/endlocal.htmlLa sintaxis es como tal:
set /p variable=[string]
Visite http://commandwindows.com/batch.htm o http://www.robvanderwoude.com/userinput.php para una inmersión más profunda en la entrada del usuario con las diferentes versiones de los archivos por lotes del sistema operativo Windows.
Una vez que haya configurado su variable, puede continuar usándola de la siguiente manera.
tenga en cuenta la
%VariableName%
sintaxisfuente
cmd.exe
shell de Windows 7 , y cada uno, sin excepción, asigna la entrada del usuario a una variable nombrada arbitrariamente. ¿Cómo se embellece su respuesta sobre lo que ya se ha proporcionado?=
no es necesario.cmd
que no deja espacio?SET /P variable=[promptString]
No estoy seguro de si este es el caso para todas las versiones de Windows, sin embargo, en la máquina XP que tengo, necesito usar lo siguiente:
Sin la cadena de solicitud entre comillas , obtengo varios resultados dependiendo del texto.
fuente
set /p "var1=Prompt String"
set /p Var1="Prompt String "
Luego, cuando ejecuta el archivo y el usuario escribe algo que obtiene enPrompt String Yes
lugar dePrompt StringYes
El espacio después
=
es muy importante.fuente
si consigo lo que quieres, esto funciona bien. también puede usar% input% en otros comandos.
fuente
fuente
:start
?:start
es solo un marcador ... Por ejemplo, también podría usar un:end
, que hace que sucedan cosas como la limpieza de variables, o llamar apopd
, o algo así. Luego, también tiene la opción de usar unIF ERRORLEVEL1 GOTO END
... o incluso unGOTO ERR
, y debajo:err
tiene algo como eco. Ocurrió un error al intentar obtener el número de archivo. goto: end Es probablemente unaNo hay ningún parámetro documentado / rápido para SETX como lo hay para SET.
Si necesita solicitar una variable de entorno que sobrevivirá a los reinicios, puede usar SETX para almacenarla.
Una variable creada por SETX no será utilizable hasta que reinicie el símbolo del sistema. Sin embargo, puede configurar SETX una variable que ya ha sido SET, incluso si tiene el mismo nombre.
Esto funciona para mí en Windows 8.1 Pro:
(Las comillas alrededor de la variable existente son necesarias).
Este procedimiento le permite usar la variable temporal creada por SET durante la sesión actual y le permitirá reutilizar la variable creada por SETX al reiniciar la computadora o reiniciar el indicador CMD.
(Editado para formatear párrafos de código correctamente).
fuente
Tengo un pequeño cmd que uso cuando preparo la PC para los clientes: llama al usuario para que ingrese y le cambia el nombre a la PC.
fuente
Hay dos posibilidades
Olvidó poner el
%id%
en lajstack
llamada.Entonces, todo el archivo por lotes correcto debe ser:
Y / o 2. Lo colocó en el código (y olvidó decirnos en la pregunta) pero cuando ejecutó el archivo por lotes presionó la tecla Intro en lugar de escribir una ID (digamos 1234).
Lo que está sucediendo es el resultado de estos dos errores:
jstack
se supone que debe llamarse con la identificación que usted proporciona.Pero en su caso (de acuerdo con el código que proporcionó en la pregunta) lo llamó sin ninguna variable. Tu escribiste:
Entonces, cuando ejecuta
jstack
sin variable, genera lo siguiente:Su segundo error es que haya pulsado Intro en lugar de dar un valor cuando el programa le preguntó:
Enter ID:
. Si hubiera puesto una ID en este punto, digamos 1234, la%id%
variable se convertiría en ese valor, en nuestro caso 1234. Pero NO proporcionó un valor y en su lugar presionó Enter. Cuando no le das ningún valor a la variable, y si esa variable no se configuró en otra cosa antes, ¡entonces la variable%id%
se configura según el indicador delset
comando! Así que ahora%id%
está configurado paraEnter ID:
que se repita en su pantalla como se solicitó en el archivo por lotes ANTES de llamar al jstack.Pero sospecho que TENÍA el
jstack %id% > jstack.txt
código de su archivo por lotes con el%id
(y lo omitió por error de la pregunta), y que presionó enter sin escribir una identificación. El programa por lotes se hizo eco de la identificación, que ahora es "Ingresar ID:", y luego ejecutójstack Enter ID: > jstack.txt
Jstack se hizo eco de la entrada, encontró un error y le pidió que terminara.
Y todo esto fue escrito en el archivo jstack.txt.
fuente
Los signos de dólar alrededor de la variable no funcionan en mi máquina Vista, pero los signos de porcentaje sí. También tenga en cuenta que se mostrará un espacio final en la línea "set" entre la solicitud y la entrada del usuario.
fuente
C:\>set /p DestPath="Type path:"
y la siguiente línea esType path:c:\dddd
SETLOCAL ENABLEDELAYEDEXPANSION
archivo por lotes, puede usarlo!EnvVariable!
para expandirlo a su valor durante los bucles FOR u otras cosas que no expanden las macros hasta que el analizador Cmd procese realmente la línea. Consultecmd /?
para obtener información sobre esto, así comohelp setlocal
...Acabo de agregar el
secuencia a mi trabajo por lotes netsh. Ahora me muestra la ubicación a la que respondo como el punto para esa muestra. Continuamente >> el archivo de salida, así que ahora sé "casa", "trabajo", "Starbucks", etc. Buscando aire limpio, puedo eavular los canales de menor uso y si hay 5 o solo todas las WLAN de 2.4 MHz.
fuente
Solo para mantener un valor predeterminado de la variable. Presione Entrar para usar el valor predeterminado de la ejecución reciente de su .bat:
En la primera ejecución, simplemente ignore el mensaje sobre la falta de archivo con el valor inicial de la variable (o cree el Var1.txt manualmente).
fuente
(set /p var=<var1.txt) 2>nul
suprimirá el mensaje de error. También puede dar enset var1=default
lugar de obtener algo de un archivo