Lote: Resultados variables inesperados en subrutina

Lote: Resultados variables inesperados en subrutina

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 %1o %~1para eliminar las comillas dobles adjuntas.

El uso de GOTO :EOFal 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 callcomando.

@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 conCALL:

    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 %2y 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 %1por %9número.

  • LLAMAR

    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 CALLcomando pasará el control a la declaración después de la etiqueta especificada junto con los parámetros especificados.Para salir de la subrutina, especifique GOTO :eofque 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 (")
    

información relacionada