
una respuesta auna pregunta previasugiere esta línea FOR. Ahora estoy intentando usar la variable. Mi script por lotes en la actualidad:
@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 %%G
:sub1
echo %%G
set apath=%%~G
echo %apath%
goto :eof
:End
El resultado de este script son siete iteraciones de esto:
%G
%~G
La subrutina parece estar haciéndole algo a la variable. Porque cuando sustituyo estas líneas:
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do (
echo %%G
set apath=%%~G
echo %apath%
)
Obtengo el resultado deseado: seis pares de salida de esta naturaleza:
"3D Objects"
3D Objects
donde la tilde elimina las comillas, como se esperaba.
En el primer ejemplo de código, la producción de siete (no seis) pares de líneas de salida sugiere que la subrutina puede estar ignorando las comillas, representando "3D" y "Objetos" como dos elementos separados, lo cual fue un problema abordado enla pregunta anterior.
Empecé a modificar el enfoque de subrutina porque tenía problemas para lograr un determinado resultado utilizando el enfoque más simple presentado en el segundo ejemplo de código (arriba). Posiblemente una expansión retrasada solucionaría ese problema, pero a costa de una complejidad adicional. No negar que la línea "goto :eof" de la subrutina también es un poco confusa, incluso si funciona.
Mi pregunta específica es, ¿qué está pasando con la variable cuando se usa en la subrutina? Pero si hay una manera mejor, también agradecería al menos un vínculo en esa dirección.
Respuesta1
Estás pasando el valor delparaiteración de bucle a una subrutina usandollamarpor lo que desea encerrar ese (marcador de posición de variable pasada) con una comilla doble y luego hacer referencia a la variable pasada dentro de esa subrutina como %1
o %~1
para eliminar las comillas dobles adjuntas.
El uso de GOTO :EOF
al final de cada subrutina llamada devolverá el control a la subrutina de la persona que llama original para que pueda continuar procesando el resto de su lógica, si corresponde, después del call
comando.
@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 "%%~G"
goto :eof
:sub1
echo %1
set apath=%~1
echo %apath%
goto :eof
:End
Producción
"3D Objects"
3D Objects
"Documents"
Documents
"Downloads"
Downloads
"Music"
Music
"Pictures"
Pictures
"Videos"
Videos
Recursos de apoyo
- PARA
Argumentos de la línea de comando (parámetros)
Los argumentos también se pueden pasar a una subrutina con
CALL:
CALL :my_sub 2468
Puede obtener el valor de cualquier argumento usando un % seguido de su posición numérica en la línea de comando. El primer elemento aprobado es siempre %1, el segundo elemento es siempre
%2
y así sucesivamente.%*
en un script por lotes se refiere a todos los argumentos (por ejemplo%1 %2 %3 %4 %5
...%255
), solo se puede hacer referencia a los argumentos%1
por%9
número.-
Pasando por referencia
Además de pasar valores numéricos o de cadena en la línea de comando, también es posible pasar unvariablenombre y luego use la variable para transferir datos entre scripts o subrutinas. Pasar por referencia es una técnica ligeramente más avanzada, pero puede resultar especialmente útil cuando la cadena contiene caracteres que son delimitadores CMD o comillas.
LLAMAR a una subrutina (:etiqueta)
El
CALL
comando pasará el control a la declaración después de la etiqueta especificada junto con los parámetros especificados.Para salir de la subrutina, especifiqueGOTO :eof
que esto transferirá el control al final de la subrutina actual.. CALL /?
CALL command now accepts labels as the target of the CALL. The syntax is: CALL :label arguments In addition, expansion of batch script argument references (%0, %1, etc.) have been changed as follows: %* in a batch script refers to all the arguments (e.g. %1 %2 %3 %4 %5 ...) Substitution of batch parameters (%n) has been enhanced. You can now use the following optional syntax: %~1 - expands %1 removing any surrounding quotes (")