windows - Batch script variabel fungerer ikke rigtigt

Indlæg af Hanne Mølgaard Plasc

Problem



Nå ... Jeg prøver at dabble i batch så lidt som muligt, og jeg er hovedsagelig en C/C #/C ++ mand. Mit problem er, at mit script gør to indlejrede FOR-sløjfer, hvor jeg løber gennem mappen 'Brugere' først og snag brugernavnene og derefter gennem andre mapper:


 set BaseDir=\%CD\%
 cd C:Users
 for /F \%\%I in ('DIR *.* /B /O:-D') do (
     set UserName=\%\%I
     echo \%UserName\%
 )
 cd \%BaseDir\%


Dette viser stort set problemet. Måske er det min C ++-stilformatering? Måske er jeg dum, når det kommer til batch? Forudsat at jeg har 3 brugere på mit system (Admin, User1, User2; i den rækkefølge) vil dette udskrive:


 Admin
 Admin
 Admin


Totes forkert. Hvis man skulle kalde ekko på \%\% I, ville alt gå efter planen:


 Admin
 User1
 User2


Mangler jeg noget her, så vidt variabler går, eller hvad er aftalen? DOS synes ikke om en variabel omdeling?
Thnx på forhånd. (specs: Windows 7, notesblok, cmd som administrator)

Bedste reference


Da du ændrer en variabel inden for FOR -sløjfen, skal du aktivere forsinkede udvidelser:


SETLOCAL ENABLEDELAYEDEXPANSION
cd C:Users
for /F \%\%I in ('DIR *.* /B /O:-D') do (
 set UserName=\%\%I
 echo \%UserName\%
)


REDIGERE
En pæn måde at tildele variablerne separat for at få adgang til hver forekomst uden for sløjfen


SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
    cd C:Users
    for /F \%\%I in ('DIR *.* /B /O:-D') do (
     set UserName!count!=\%\%I
     echo \%UserName!count!\%
     set count=!count!+1
    )

Andre referencer 1


En anden mulighed er at bruge en subrutine:


 pushd C:Users
 for /F \%\%I in ('DIR *.* /B /O:-D') do call :perfile \%\%I
 popd
 goto :eof

 :perfile
 set UserName=\%*
 echo \%UserName\%
 goto :eof


Bemærk også brug af pushd og popd for at undgå at skulle gemme den oprindelige mappe i en miljøvariabel.