05. marts 2004 - 06:54Der er
9 kommentarer og 1 løsning
for /r %I in, etc
Jeg er interesseret i at eksekvere en kommando i et givet bibliotek på alle de filer, som har ændret sig siden i går kl. 6:00. Hvorfor set batch-kommandoen ud fra DOS?
for /r %I in (G:\*) do if not "%~tI" > "08:00" kommando "%I" ???
Efter ti år i London, Madrid, Paris og Utrecht kommer Sabios AI-fokuserede program af arrangementer om kundeoplevelser, ‘Disrupt’, for første gang til Danmark.
kort og godt: det kan ikke lade sig gøre ! men det er muligt du kan opnå det du ønsker, ved at bruge en anden tilgang til tingene, -hvad er det egentligt du vil ? Det ville være nemmere hvis du bare ville behandle filer ændret siden sidst (og ikke siden et tidspunkt), -beskriv hvad du vil opnå !
Jeg skal foretage en konvertering af alle ændrede filer med DWG2PLT.exe i et bibliotek. Det skulle gerne løses vha. DOS standard. Jeg er helt med på, at det let kan løses med et tilrettet program.
Jeg bruger XP. Resultatet af date /T er 07-03-2004.
hmmm, jeg tænkte blot at hvis du valgte at flytte dine filer til et andet dir efter behandling, så kan du hver gang angribe alle filer i det pågældende dir.....og så er opgaven pludselig meget simpel
Jeg lavede et script der checker alle filer i en mappe for at se om de er nyere end fra i går kl. 06.00.
Du gemmer koden i en .bat-fil.
Mappen der skal gennemsøges kan angives som parameter til scriptet. Hvis du vil søge i undermapper tilføjer du /S til dir kommandoen.
Det udskriver "new filenavn.ext" for alle filer der er nye. Du skal så rette dette til at gøre det du ønsker, der er to linier i bunden der skal rettes (echo New: %~1).
Hvis det er klokken 08.00 du vil checke skal du ændre 6-tallet i linien "if %Hour% GEQ 6 (" til 8.
Men i øvrigt vil jeg give knudemand ret, det er måske lettere at flytte filerne når de er behandlet.
@echo off setlocal
for /F "tokens=1,2,3 delims=- " %%I in ('date /T') do call :ProcessDate %%I %%J %%K
for /F "delims=;" %%I in ('dir /A-D /B %1') do call :ProcessFile "%%I" %%~tI
goto :eof
:ProcessDate
set Day=%1
set Month=%2 set Year=%3 set Today=%Day%-%Month%-%Year:~2,4%
if %Day:~0,1%==0 set Day=%Day:~1,2% if %Month:~0,1%==0 set Month=%Month:~1,2%
if %Day%==1 ( call :GetLastdayOfPreviousMonth ) else ( set /A Day-=1 )
if %Day:~0,1%==%Day% set Day=0%Day% if %Month:~0,1%==%Month% set Month=0%Month%
set Yesterday=%Day%-%Month%-%Year:~2,4% goto :eof
:GetLastdayOfPreviousMonth if %Month%==1 ( set Month=12 set Day=31 set /A Year-=1 goto :eof )
set /A LeapYear="%Year% %%4"
if %Month%==3 if %LeapYear%==0 ( set Month=2 set Day=29 goto :eof )
for /F "tokens=%Month%" %%A in ("0 31 28 31 30 31 30 31 31 30 31 30 31") do set /A Day=%%A set /A Month-=1 goto :eof
:ProcessFile if %2==%ToDay% ( echo New: %~1 goto :eof )
if not %2==%Yesterday% goto :eof
for /F "delims=:" %%I in ("%3") do set Hour=%%I if %Hour:~0,1%==0 set Hour=%Hour:~1,2%
Det var lige præcis, hvad jeg søgte! Der sker imidlertid en fejl i linie 2: for /F "delims=;" %%I in ('dir /A-D /B %1') do call :ProcessFile "%%I" %%~tI idet den ikke forstår %%~tI. Der kommer ingen dato ud ved mig, selvom den har fanget en fejl?!
Kan du hjælpe mig videre, og ellers i øvrigt svare på spørgsmålet, så du kan få dine point?
Jeg havde ikke fået det testet ordentligt med parameter og uden /S, dette problem skulle være løst nu. Hvis du bruger /S switchen på dir kommandoen skal du slette linien "if not [%1]==[] set FilePath=%~dp1"
Jeg forsøger at undgå point.
@echo off setlocal set FilePath= if not [%1]==[] set FilePath=%~dp1
for /F "tokens=1,2,3 delims=- " %%I in ('date /T') do call :ProcessDate %%I %%J %%K
for /F "delims=;" %%I in ('dir /A-D /B %1') do call :ProcessFile "%FilePath%%%I"
goto :eof
:ProcessDate
set Day=%1 set Month=%2 set Year=%3 set Today=%Day%-%Month%-%Year:~2,4%
if %Day:~0,1%==0 set Day=%Day:~1,2% if %Month:~0,1%==0 set Month=%Month:~1,2%
if %Day%==1 ( call :GetLastdayOfPreviousMonth ) else ( set /A Day-=1 )
if %Day:~0,1%==%Day% set Day=0%Day% if %Month:~0,1%==%Month% set Month=0%Month%
set Yesterday=%Day%-%Month%-%Year:~2,4% goto :eof
:GetLastdayOfPreviousMonth if %Month%==1 ( set Month=12 set Day=31 set /A Year-=1 goto :eof )
set /A LeapYear="%Year% %%4"
if %Month%==3 if %LeapYear%==0 ( set Month=2 set Day=29 goto :eof )
for /F "tokens=%Month%" %%A in ("0 31 28 31 30 31 30 31 31 30 31 30 31") do set /A Day=%%A set /A Month-=1 goto :eof
:ProcessFile for /F "tokens=1,2" %%I in ("%~t1") do set FileDate=%%I& set FileTime=%%J
if %FileDate%==%ToDay% ( echo New: %~1 goto :eof )
if not %FileDate%==%Yesterday% goto :eof
for /F "delims=:" %%I in ("%FileTime%") do set Hour=%%I if %Hour:~0,1%==0 set Hour=%Hour:~1,2%
Det er i bund og grund også en principsag for mig, ikke at tage mine egne point ...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.