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
%1
aplica 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 %2
y fue rechazada por el caso más simple que no se puede cortar y pegar con a@
y afake-command
con params, pensando que obtendríamosfake-command.bat
el contenido más tarde (en cuyo caso, el demasiado complicadofake-command.bat
podría tenerecho %2 %4
que ignorar los nombres de los parámetros). Mal, tonto. TL; DR: No seas tan tonto como yo. 1.echo echo %1 %2 > test.bat
2test 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 on
y expandir% 1 después de unarem
declaració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
param1
de 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%*
,%1
de una manera segura y sin la técnica de REM&
y también comillas"
Sí, y no olvides usar variables como
%%1
cuando usasif
yfor
y 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
if
yfor
?for %%d in (*) do echo %%d
desde la línea de comandos:for %d in (*) do echo %d
@for %%2 in (testing) do @echo %%2 %1
en un archivo por lotes, producetesting 1
cuando se llama con 1 (test 1
).%%1
no accede a un argumento de línea de comando, y también es incorrecto para elIF
comando. Solo elFOR
comando (en archivos por lotes) requiere porcentajes dobles, pero incluso así%%1
definirí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
Q
pará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
,:parse
y:main
funciones.fuente
Nota: IF
"%1"==""
causará problemas si%1
se 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^&dog
oTest.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ácall
editando con una copia de los parámetros originales.Por ejemplo, dado el siguiente comando:
myscript.bat
podría usar las variables después de llamar a la función:Aquí está la función:
Limitaciones
-force
. Podría usar,-force=true
pero 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--foo
que 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--bar
que toma un valor requerido . Por último, puede tomar una bandera--baz
sin valor permitido. Ah, y estos parámetros pueden venir en cualquier orden.En otras palabras, se ve así:
Aquí hay una solución:
SETLOCAL
para 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.%~1
para eliminar comillas.IF "%ARG%" == ""
y noIF [%ARG%] == []
porque[
y]
no juegue tendrá valores que terminen en un espacio.SHIFT
dentro de unIF
bloque, los argumentos actuales como%~1
no se actualizan porque se determinan cuandoIF
se analiza. Podrías usar%~1
y%~2
dentro delIF
bloque, pero sería confuso porque tenías unSHIFT
. Puede poner elSHIFT
al final del bloque para mayor claridad, pero eso podría perderse y / o confundir a las personas también. Así que "capturar"%~1
y%~1
fuera del bloque parece lo mejor.IF NOT "%ARG:~0,2%" == "--"
.SHIFT
cuando 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--foo
parámetro estaba presente como que%FOO%
faltaba el valor.ECHO Missing bar value. 1>&2
enví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 %~n1
Solució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
?*&<>