Necesito pasar un ID y una contraseña a un archivo por lotes en el momento de la ejecución en lugar de codificarlos en el archivo.
Así es como se ve la línea de comando:
test.cmd admin P@55w0rd > test-log.txt
batch-file
arguments
Keng
fuente
fuente

Respuestas:
Otro consejo útil es usar
%*para significar "todos". Por ejemplo:Cuando corres:
se ejecutará el archivo por lotes anterior:
Puede que la sintaxis sea un poco incorrecta, pero esta es la idea general.
fuente
shift"saca" el argumento de la lista. La suposición de OP fue que%*solo generaría los argumentos restantes, pero no funciona de esa manera, como dijo @Joey.fake-command /u admin /p password admin password foo bar. Esto fue señalado por @Joey hace muchos años.Así es como lo hice:
Así es como se ve el comando:
El se
%1aplica al primer parámetro que%2(y aquí está la parte difícil) se aplica al segundo. Puede pasar hasta 9 parámetros de esta manera.fuente
echo %1 %2y fue rechazada por el caso más simple que no se puede cortar y pegar con a@y afake-commandcon params, pensando que obtendríamosfake-command.batel contenido más tarde (en cuyo caso, el demasiado complicadofake-command.batpodría tenerecho %2 %4que ignorar los nombres de los parámetros). Mal, tonto. TL; DR: No seas tan tonto como yo. 1.echo echo %1 %2 > test.bat2test word1 word2.. 3. Ganancias.Si desea manejar de manera inteligente los parámetros que faltan, puede hacer algo como:
fuente
El acceso a los parámetros por lotes puede ser simple con% 1,% 2, ...% 9 o también% *,
pero solo si el contenido es simple.
No hay una manera simple para contenidos complejos como
"&"^&, ya que no es posible acceder a% 1 sin producir un error.Las líneas se expanden a
Y cada línea falla, ya que una de ellas
&está fuera de las comillas.Se puede resolver leyendo un archivo temporal una versión remarcada del parámetro.
El truco es habilitar
echo ony expandir% 1 después de unaremdeclaración (también funciona con%2 .. %*).Entonces, incluso
"&"&podría hacerse eco sin producir un error, como se comenta.Pero para poder redirigir la salida de
echo on, necesitas los dos bucles for.Los caracteres adicionales
* #se usan para estar seguros contra contenidos como/?(mostraría la ayuda paraREM).O un cursor ^ al final de la línea podría funcionar como un carácter multilínea, incluso después de a
rem.Luego, lea la salida del parámetro rem del archivo, pero con cuidado.
El FOR / F debería funcionar con la expansión retrasada desactivada, de lo contrario el contenido con "!" Sería destruido.
Después de eliminar los caracteres adicionales
param1, lo tienes.Y para usar
param1de manera segura, habilite la expansión demorada.fuente
&, su solución solo funciona con contenido simpletest.bat ^&y falla. Solotest.bat "&"funciona, pero ese no era mi punto. No se puede utilizar%*,%1de una manera segura y sin la técnica de REM&y también comillas"Sí, y no olvides usar variables como
%%1cuando usasifyfory la pandilla.Si olvida el doble
%, sustituirá los argumentos de la línea de comandos (posiblemente nulos) y recibirá algunos mensajes de error bastante confusos.fuente
ifyfor?for %%d in (*) do echo %%ddesde la línea de comandos:for %d in (*) do echo %d@for %%2 in (testing) do @echo %%2 %1en un archivo por lotes, producetesting 1cuando se llama con 1 (test 1).%%1no accede a un argumento de línea de comando, y también es incorrecto para elIFcomando. Solo elFORcomando (en archivos por lotes) requiere porcentajes dobles, pero incluso así%%1definiría un parámetro FOR y no accede a los argumentosNo hay necesidad de complicarlo. Es simplemente comando% 1% 2 parámetros, por ejemplo,
La "pausa" muestra lo que ha hecho el archivo por lotes y espera a que pulses CUALQUIER tecla. Guarde eso como xx.bat en la carpeta de Windows.
Para usarlo, escriba, por ejemplo:
Este archivo por lotes se encarga de todos los parámetros necesarios, como copiar solo archivos, que son más nuevos, etc. Lo he usado desde antes de Windows. Si le gusta ver los nombres de los archivos, ya que se están copiando, omita el
Qparámetro.fuente
Un amigo me preguntó sobre este tema recientemente, así que pensé en publicar cómo manejo los argumentos de la línea de comandos en archivos por lotes.
Como verás, esta técnica tiene un poco de sobrecarga, pero hace que mis archivos por lotes sean muy fáciles de entender y rápidos de implementar. Además de soportar las siguientes estructuras:
El jist de que está teniendo los
:init,:parsey:mainfunciones.fuente
Nota: IF
"%1"==""causará problemas si%1se incluye entre comillas.En ese caso, use
IF [%1]==[]o, en NT 4 (SP6) y solo más tarde, en suIF "%~1"==""lugar.fuente
Mantengamos esto simple.
Aquí está el archivo .cmd.
Aquí hay 3 llamadas desde la línea de comando.
fuente
Esto recorre los parámetros del lote (% *), ya sea que estén entre comillas o no, y luego repite cada parámetro.
fuente
test.bat *.txt,test.bat cat^&dogoTest.bat /?Escribí un script simple read_params que se puede llamar como una función (o externa
.bat) y colocará todas las variables en el entorno actual. No modificará los parámetros originales porque la función se estácalleditando con una copia de los parámetros originales.Por ejemplo, dado el siguiente comando:
myscript.batpodría usar las variables después de llamar a la función:Aquí está la función:
Limitaciones
-force. Podría usar,-force=truepero no puedo pensar en una forma de permitir valores en blanco sin conocer una lista de parámetros con anticipación que no tendrá un valor.Registro de cambios
-parámetros anteriores.fuente
En archivo por lotes
Y en la línea de comando, pasa el argumento
La salida será
fuente
Para referirse a una variable establecida en la línea de comando, deberá usarla,
%a%por ejemplo:Nota: Esto funciona para Windows 7 pro.
fuente
Inspirado por una respuesta en otra parte de @Jon, he creado un algoritmo más general para extraer parámetros con nombre, valores opcionales y conmutadores.
Digamos que queremos implementar una utilidad
foobar. Requiere un comando inicial. Tiene un parámetro opcional--fooque toma un valor opcional (que no puede ser otro parámetro, por supuesto); si falta el valor, el valor predeterminado esdefault. También tiene un parámetro opcional--barque toma un valor requerido . Por último, puede tomar una bandera--bazsin valor permitido. Ah, y estos parámetros pueden venir en cualquier orden.En otras palabras, se ve así:
Aquí hay una solución:
SETLOCALpara que las variables no escapen al entorno de llamada.SET FOO=, etc. en caso de que alguien las haya definido en el entorno de llamada.%~1para eliminar comillas.IF "%ARG%" == ""y noIF [%ARG%] == []porque[y]no juegue tendrá valores que terminen en un espacio.SHIFTdentro de unIFbloque, los argumentos actuales como%~1no se actualizan porque se determinan cuandoIFse analiza. Podrías usar%~1y%~2dentro delIFbloque, pero sería confuso porque tenías unSHIFT. Puede poner elSHIFTal final del bloque para mayor claridad, pero eso podría perderse y / o confundir a las personas también. Así que "capturar"%~1y%~1fuera del bloque parece lo mejor.IF NOT "%ARG:~0,2%" == "--".SHIFTcuando use uno de los parámetros.SET FOO=%DEFAULT_FOO%es lamentable, pero la alternativa sería agregar unIF "%FOO%" == "" SET FOO=%DEFAULT_FOO%fuera delIF NOT "%ARG%" == ""bloque. Sin embargo, debido a que todavía está dentro delIF "%PARAM%" == "--foo"bloque, el%FOO%valor se habría evaluado y establecido antes de ingresar al bloque, por lo que nunca detectaría que tanto el--fooparámetro estaba presente como que%FOO%faltaba el valor.ECHO Missing bar value. 1>&2envía el mensaje de error a stderr.ECHO:o una de las variaciones.fuente
Cree un nuevo archivo por lotes (ejemplo: openclass.bat) y escriba esta línea en el archivo:
Luego coloque el archivo por lotes en, digamos, la carpeta system32, vaya a su archivo de clase Java, haga clic derecho, Propiedades, Abrir con ..., luego encuentre su archivo por lotes, selecciónelo y eso es todo ...
Esto funciona para mi.
PD: No puedo encontrar una manera de cerrar la ventana cmd cuando cierro la clase Java. Por ahora...
fuente
start /wait java %~n1Solución simple (aunque la pregunta es antigua)
Test1.bat
CallTest1.bat
salida
Donde YourLocalPath es la ruta actual del directorio.
Para mantener las cosas simples, guarde el comando param en variable y use variable para comparar.
No solo es simple de escribir, sino que también es fácil de mantener, por lo que si más tarde alguna otra persona o usted lee su guión después de un largo período de tiempo, será fácil de entender y mantener.
Para escribir código en línea: vea otras respuestas.
fuente
Obs: Para usar sin:
?*&<>fuente
?*&<>