A variável DelayedExpansion não se expande dentro do loop FOR

0

Eu tenho um loop FOR que faz uma única string de cada linha em um arquivo. A ideia é que, para cada linha, haja uma linha paralela em um arquivo secundário com um valor variável. Eu fiz aqui um loop que ecoa a variável que lê apenas para fins de teste.

for %%a in (!loadstream!) do (
    set /A "linecount=!linecount!+1"
    for /F "skip=!linecount!" %%i in (save\%1\%1.sav) do (
        echo %%i
    )
)

O primeiro FOR funciona bem, mas o primeiro dentro dele não expande a variável. Em vez disso, fica como linecount! e dá !linecount!" was not expected at this time. Ele funciona bem se você colocar %linecount% no lugar, mas eu preciso que a variável conte uma vez toda vez que ele fizer um loop, então não há como ir. setlocal EnableDelayedExpansion está definido, é claro.

Esse bloco de código deve ser chamado dentro de um script sempre que um determinado conjunto de variáveis precisar ser carregado. Eu poderia tentar construir uma solução desajeitada, mas posso dizer que esta é a maneira de fazer isso, e eu simplesmente não entendo o que está errado.

    
por Mathys Oliveira 28.11.2017 / 11:08

1 resposta

1

Parece que cmd não expande o que quer que esteja no campo de opções de for /f ; como uma rodada de trabalho eu tentei usar uma variável de loop for /f "skip=%%n" ... e isso também não consegue expandir.

A única solução que encontrei é fazer você mesmo pular: -

for %%a in (!loadstream!) do (
    set /A linecount=!linecount!+1
    set lineno=0
    for /F "delims=" %%i in (save\%1\%1.sav) do (
        set /A lineno+=1
        if !lineno! == !linecount! echo i: %%i
    )
)

Eu adicionei a opção "delims=" para forçar a leitura de linhas inteiras, já que eu estava testando em arquivos arbitrários com espaços em branco nas linhas; isso não terá efeito se seus arquivos não tiverem espaços em branco, mas omitirão se você quiser apenas o primeiro campo de cada linha, para que os outros campos entrem em %%j , etc.

    
por 28.11.2017 / 14:07