windows - Forstå ikke returneringskoden fra en forfiles kommando indlejret i en for

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at cykle gennem en liste over brugere (office\_id\_list\_\%YY\_MM\_DD\%\%\%), som jeg har for hvert kontor (office\_list.txt) og oprette en fil, når filer der nyere er en dato (\%3) findes. Under kode var det ikke, så jeg besluttede at ekko fejlfeltet og fandt ud af at det altid var -1073741510 (arbejder på en Windows 2003-maskine). I sidste ende forsøger jeg at identificere brugernes hjemmekataloger (organiseret på kontoret), der ikke er blevet ændret siden en given dato.
Eventuelle tanker ville blive meget værdsat.





for /f "tokens=1 delims= " \%\%i in (U:sysmonu\_cleanupoffice\_list.txt) do (
  if not exist u:sysmonu\_cleanup
esults\%\%i mkdir u:sysmonu\_cleanup
esults\%\%i
  for /f "tokens=1 delims= " \%\%j in (U:sysmonu\_cleanup
esultsoffice\_lists\_\%YY\_MM\_DD\%\%\%i\_dir\_list\_\%YY\_MM\_DD\%\_final.txt) do (
    forfiles /P \%1\%\%i\%\%j /S /D +\%3 /C "cmd /c if \%errorlevel\% == 0 echo ** Do not Archive - Found files modified after \%3 > U:sysmonu\_cleanup
esults\%\%i\%\%j\_\%YY\_MM\_DD\%.txt"
  )
)

Bedste reference


Tilføj /V:on til cmd og brug !errorlevel! i stedet for \%errorlevel\%, der tænder for forsinket ekspansion.

Andre referencer 1


Sandsynligvis er hovedproblemet del cmd /c if \%errorlevel\% == 0, det udvider fejlniveauet, før nogen af ​​dine kommandoer udføres.


Normalt forsinket ekspansion er valget, men her virker det ikke (eller som Joey nævnte med/V: on), fordi den er i en ny cmd-kontekst.


Her kan du bruge den på denne måde cmd /c if \%\%errorlevel\%\% == 0, så hvis den komplette blok bliver analyseret første gang, bliver delen udvidet til cmd /c if \%errorlevel\% == 0, og dette udvides en anden gang, da cmd /c udføres.


Og du kunne forskønne koden lidt


set "officePath=U:sysmonu\_cleanup"
set "officeDatePath=\%officePath\%
esultsoffice\_lists\_\%YY\_MM\_DD\%"
for /f "tokens=1 delims= " \%\%i in ("\%officePath\%office\_list.txt") do (
    if not exist "\%officePath\%
esults\%\%i" (
        mkdir "\%officePath\%
esults\%\%i"
    )
    for /f "tokens=1 delims= " \%\%j in ("\%officeDatePath\%\%\%i\_dir\_list\_\%YY\_MM\_DD\%\_final.txt") do (
        forfiles /P \%1\%\%i\%\%j /S /D +\%3 /C "cmd /c if \%\%errorlevel\%\% == 0 echo ** Do not Archive - Found files modified after \%3 > \%officePath\%
esults\%\%i\%\%j\_\%YY\_MM\_DD\%.txt"
    )
)