windows - hvorfor vil ikke denne variabel blive sat i for-loop mens du bruger ENABLEDELAYEDEXPANSION?

Indlæg af Hanne Mølgaard Plasc

Problem



@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set seed=-1
echo seed init val:\%seed\%

for \%\%f in (*.txt) DO (
    checksum \%\%f \%seed\%
    echo error level: !ERRORLEVEL!
    set seed = !ERRORLEVEL!
    echo new seed val:!seed!
)


Produktion:


C:>returnval
seed init val:-1
Seed in main : FFFFFFFF
The 32-bit checksum for result.txt is 44DD58EE
error level: 1155356910
new seed val:-1 //still -1 ?? should be 1155356910
Seed in main : FFFFFFFF
The 32-bit checksum for test.txt is E245740F
error level: -498764785
new seed val:-1


Linjen der angiver seed=ERRORLEVEL virker ikke.

at ekko ERRORLEVEL jeg havde brug for at bruge '!' ellers ville det ikke udvide og vise korrekt.


Som du kan se, når vi kommer til ny frøværdi: Det er stadig -1


Hvordan indstiller jeg seed til den sidste ERRORVALUE?


(Sidebesked, forløbet ser bare op to tekstfiler, jeg har og fodrer det til en exe, der returnerer et checksum for filen., Det ser ud til at fungere fint, da ERRORLEVEL er resultatet af exe.)


Svar: nødvendigt at bruge/a på sættet for at få frøet til at tage den numeriske værdi af ERRORLEVEl og derefter bruge '!' også for checksumparametrefrø.


@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set seed=-1
echo seed init val:\%seed\%

for \%\%f in (*.txt) DO (
    checksum \%\%f !seed!
    echo error level: !ERRORLEVEL!
    set /a seed = !ERRORLEVEL!
    echo new seed val:!seed!
)

Bedste reference


Du ved allerede, at du skal bruge forsinket ekspansion, for at dette kan fungere korrekt, så det skal være set seed = !ERRORLEVEL!. Og echo seed value: !seed! når du udskriver det. Tommelfingerregel: Hvis det er i en løkke, så skal du forsinke udvidelsen.