
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 %1
ou %~1
remover as aspas duplas.
Usar o GOTO :EOF
no 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 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
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 com
CALL:
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
%2
e 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%1
podem%9
ser referenciados por número.-
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
CALL
comando passará o controle para a instrução após o rótulo especificado junto com quaisquer parâmetros especificados.Para sair da sub-rotina especifiqueGOTO :eof
isto 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 (")