Lote: resultados variáveis ​​inesperados na sub-rotina

Lote: resultados variáveis ​​inesperados na sub-rotina

Uma resposta parauma pergunta anteriorsugere esta linha FOR. Agora estou tentando usar a variável. Meu script em lote atualmente:

@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

A saída deste script são sete iterações disto:

%G
%~G

A sub-rotina parece estar fazendo algo com a variável. Porque quando eu substituo essas linhas:

for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do (
echo %%G
set apath=%%~G
echo %apath%
)

Obtenho o resultado desejado: seis pares de saída desta natureza:

"3D Objects"
3D Objects

onde o til remove as aspas, conforme esperado.

No primeiro exemplo de código, a produção de sete (não seis) pares de linhas de saída sugere que a sub-rotina pode estar desconsiderando as aspas, renderizando "3D" e "Objetos" como dois itens separados - o que foi um problema abordado ema pergunta anterior.

Comecei a mexer na abordagem de sub-rotina porque estava tendo problemas para alcançar um determinado resultado usando a abordagem mais simples apresentada no segundo exemplo de código (acima). Possivelmente a expansão atrasada resolveria isso, mas ao custo de complexidade adicional. Não podemos negar que a linha "goto :eof" da sub-rotina também é um pouco confusa, mesmo que funcione.

Minha pergunta específica é: o que há de errado com a variável quando usada na sub-rotina? Mas se houver uma maneira melhor, eu também apreciaria pelo menos um link nessa direção.

Responder1

Você está passando o valor doparaiteração de loop para uma sub-rotina usandochamarentão você deseja colocar isso (espaço reservado para variável passada) entre aspas duplas e, em seguida, referenciar a variável passada dentro dessa sub-rotina como %1ou %~1remover as aspas duplas.

Usar o GOTO :EOFno final de cada sub-rotina chamada passará o controle de volta para a sub-rotina chamadora original para que ela possa continuar a processar o restante de sua lógica, se aplicável, após o 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

Saída

"3D Objects"
3D Objects
"Documents"
Documents
"Downloads"
Downloads
"Music"
Music
"Pictures"
Pictures
"Videos"
Videos

Recursos de apoio

  • PARA
  • Argumentos de linha de comando (parâmetros)

    Argumentos também podem ser passados ​​para uma sub-rotina comCALL:

    CALL :my_sub 2468

    Você pode obter o valor de qualquer argumento usando% seguido de sua posição numérica na linha de comando. O primeiro item passado é sempre % 1 o segundo item é sempre %2e assim por diante

    %*em um script em lote refere-se a todos os argumentos (por exemplo %1 %2 %3 %4 %5 ...%255), apenas os argumentos %1podem %9ser referenciados por número.

  • CHAMAR

    Passando por Referência

    Além de passar valores numéricos ou string na linha de comando, também é possível passar umvariávelnome e, em seguida, use a variável para transferir dados entre scripts ou sub-rotinas. A passagem por referência é uma técnica um pouco mais avançada, mas pode ser particularmente útil quando a string contém caracteres que são delimitadores ou aspas CMD.


    CHAMAR uma sub-rotina (:label)

    O CALLcomando passará o controle para a instrução após o rótulo especificado junto com quaisquer parâmetros especificados.Para sair da sub-rotina especifique GOTO :eofisto irá transferir o controle para o final da sub-rotina atual.

  • 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 (")
    

informação relacionada