usar variáveis ​​dentro de se e para loop

2

Eu tenho o seguinte código:

echo off
set n=11
set m=12
set /a nme=3
set /a mdiff=nme-1
pause
if %n% NEQ %m% (
    if %mdiff% LEQ 3 (
        for /l %%C in (1,1,3) do (
            if %%C EQU 1 (
                set mon=Apr
            )
set num=1%mon%
        )
    )
)
echo %num%
pause

o que me dá saída 1 ao invés de 1Apr. Porém quando eu coloco set num=1%mon% fora de todos os if e for loops dá resultado correto.

Por favor, me explique o que aconteceu aqui e como obter o resultado correto dentro dos loops.

Além disso, qual é a profundidade máxima de if e for níveis?

Anna
fonte
Você declarou a variável mon=Apr e não concatenar com 1.
avirk

Respostas:

3

O que você precisa fazer é colocar um SetLocal EnableDelayedExpansion no topo do seu script e use ! s em torno de suas variáveis.

A Expansão Atrasada fará com que as variáveis ​​sejam expandidas no tempo de execução, em vez de no tempo de análise, esta opção é ativada com o SETLOCAL comando. Quando a expansão atrasada está em vigor, as variáveis ​​podem ser referenciadas usando !variable_name! (além do normal %variable_name% )

A expansão de variável atrasada é geralmente útil quando se trabalha com FOR Loops, normalmente um inteiro FOR O loop é avaliado como um único comando, mesmo que ele abranja várias linhas de um script em lote.

Basicamente, o for loop é analisado uma vez. Cada iteração do loop, as instruções são executadas. Ao ativar esta opção, as variáveis ​​podem mudar em execução, sem reparos, ou seja, dentro do loop.

@echo off
SetLocal EnableDelayedExpansion

set n=11
set m=12
set /a nme=3
set /a mdiff=nme-1
pause
if %n% NEQ %m% (
    if %mdiff% LEQ 3 (
        for /l %%C in (1,1,3) do (
            if %%C EQU 1 (
                set mon=Apr
                set num=1!mon!
            )
        )
    )
)
echo %num%
pause
Bob
fonte
Obrigado bob! Funciona bem, no entanto, em um código semelhante abaixo, não ajuda. Por favor, ajude a descobrir o que aconteceu. @ Echo off SetLocal EnableDelayedExpansion set ys = 11 conjunto ye = 12 set / a nme = 9 set jan = Jan se% ys% NEQ% ye% (echo in se conjunto de pausa / a mdiff = nme -1 se% mdiff% LEQ 9 (para / l %% B in (1,1,% mdiff%) do (para / 1 %% C in (1,1,31) do (se %% B EQU 1 ( set monthe = Jan echo! monthe!) if %% B EQU 2 (conjunto monthe = Feb echo! monthe!) xcopy REM "C: \ Testes \ conversão \ Dados.% ye% \ Month.% monthe% \ Day.0 %% C ")))) echo% monthe% pause
Anna
@Anna eu não posso ler isso. Por favor, coloque-o Pastebin (e me dê o link em um comentário) ou adicione-o à sua pergunta. Ajudaria se você explicasse o que você quer fazer.
Bob
Bob, o código está aqui pastebin.com/5xisFyGV . É apenas um fregment de um grande script que converte arquivos de um formato para outro. A principal dificuldade é que os arquivos devem ser retirados de pastas específicas por período (por exemplo, 01/02/2011 - 02/04/2012). Além disso, os arquivos de saída devem ser colocados em um diretório separado, mas copiando a hierarquia original. Eu não sou um programador, então meu código é bem longo. Esse código é um núcleo que pesquisa dados por ano-mês-data. E não funciona depois da primeira linha de "pausa", não sei por quê. Por favor ajude
Anna
@Anna Esse tipo de ajuda é melhor feito através de bate-papo (você precisa registrar uma conta do SuperUser, então podemos criar uma sala de chat) ou através de uma nova pergunta, não de comentários. Eu vou dizer que você provavelmente deveria estar usando !nme! na linha 13, mas pode haver outros erros. Além disso, se esta resposta te ajudou com esta questão em particular (variável em loop), por favor aceite a resposta clicando no carrapato à esquerda.
Bob
Eu escrevi este código de forma diferente pastebin.com/WzJffFKh . É executável, mas parece que a variável 'mark' não altera seu valor, mesmo se a condição for verdadeira. Qual o motivo?
Anna