Avatar billede stig3 Mester
27. september 2005 - 09:20 Der er 11 kommentarer og
1 løsning

bat fil

Hejsa

Jeg ville høre om man kan lave en bat-fil der sletter alle filer der er over en måned gammel i en given mappe.

Derudover ville jeg gerne lære at skrive bat-filer, men kan ikke rigtig finde noget godt sted på internettet
Avatar billede stig3 Mester
27. september 2005 - 12:24 #1
Har fundet denne som gør det samme bare med 15 minutter i stedet for 30 dage, men da jeg ikke er særlig god til batch programmering er jeg ikke sikker på hvad det gør, samt hvodan man tilretter det....

xxcopy er måske bedre, men hvordan bruger man så det til at slette filer der er over 30 dage....
Avatar billede stig3 Mester
27. september 2005 - 12:24 #2
Avatar billede bertelbrander Novice
28. september 2005 - 19:53 #3
Sidste linie i bat-scriptet på siden du linker til er:
if %Diff% GTR 15 echo %1 is to old: %Diff% del %1

Du skal bare ændre 15 til 30 dage omregnet til minutter (43200)

Men det er lettere at lave den slags i et script sprog som f.ex python, se f.ex:
http://home20.inet.tele.dk/midgaard/tipmisc20050111.html
Avatar billede stig3 Mester
28. oktober 2005 - 14:31 #5
Undskyld den sene tilbagemelding.

Jeg er nok lidt tungnem, men hvordan kører man scriptet ?
Der er nogle input variable %1 %2 %3

Skal man dermed selv indskrive dag, måned og år ?

Så man kører den sådan her:
filnavn.bat 28 10 2005

Når jeg kører den får jeg følgende fejl (jeg har navngivet filen sletfiler.bat):
-----------------------------------------------------------------------
U:\test>sletfiler
Manglende operator.
0 var ikke ventet på dette tidspunkt.

U:\test>sletfiler 28 10 2005
Manglende operator.
0 var ikke ventet på dette tidspunkt.
----------------------------------------------------

Så der er noget jeg gør galt......men hvad ?
Avatar billede bertelbrander Novice
28. oktober 2005 - 20:43 #6
Er det mit script fra 19/01-2004 23:22:15 du har brugt?
Du behøver ikke nogen parametre.
Hvis du kører XP skal det lige justeres lidt.
Avatar billede stig3 Mester
29. oktober 2005 - 10:41 #7
bertel>>
Ja, det er det script jeg prøver

Det er winXP jeg tester på, men hvis det lykkes skal det ligge på en win2003 som scheduleret job.......ved ikke om der er forskel på de 2's kommando prompter
Avatar billede bertelbrander Novice
29. oktober 2005 - 14:28 #8
Dato formatet er lidt anderledes på XP, der er f.ex. ikke ugedag på %date% i XP
Jeg har ændret scriptet så det kan køre på XP

I bunden står der "if %Diff% GTR 15 ("
15 er det antal minutter filerne skal være gamle inden de bliver slettet.
Senere står der:
  echo del %1
Dette vil udskrive delete kommandoen, du fjerner echo når du er færdig med at teste.

@echo off
setlocal
for /F "tokens=1,2,3 delims=- " %%A in ("%date%") do @call :GetDays %%A %%B %%C
for /F "tokens=1,2 delims=:" %%A in ("%time%") do call :GetMins %%A %%B
set /A Now=%Mins% + %Days%*60*24

for /F "delims=;" %%A in ('dir /B *.txt') do call :Process "%%A" "%%~tA"
goto :eof


:GetDays
set Month=%2
if %Month:~0,1%==0 set Month=%Month:~1,2%
set Days=%1
if %Days:~0,1%==0 set Days=%Days:~1,2%
set /A Days-=1
set Year=%3
set /A M=%2 - 1
for /L %%A in (1,1,%M%) do call :MonthDays %%A
set /A Year-=2000
set /A Days+= "%Year%*365 + %Year% %%4"

goto :eof

:MonthDays
for /F "tokens=%1" %%A in ("31 28 31 30 31 30 31 31 30 31 30 31") do set /A Days+=%%A
set /A LeapYear="%Year% %%4"
if %LeapYear% NEQ 0 goto :eof
if %1==1 goto :eof
set /A Days+=1

goto :eof
:GetMins
set Mins=%2
if %Mins:~0,1%==0 set Mins=%Mins:~1,2%
set Hour=%1
if %Hour:~0,1%==0 set Hour=%Hour:~1,2%
set /A Mins+=%Hour%*60
goto :eof

:Process
set Mins=0
set Days=0
for /F "tokens=1,2,3 delims=- " %%A in (%2) do @call :GetDays %%A %%B %%C
for /F "tokens=2,3 delims=: " %%A in (%2) do call :GetMins %%A %%B
Set /A FileTime=%Mins% + %Days%*60*24
Set /A Diff=%NOW%-%FileTime%

if %Diff% GTR 15 (
  echo %1 is to old: %Diff%
  echo del %1
)
Avatar billede stig3 Mester
31. oktober 2005 - 11:34 #9
Hej igen

Det ser ud til at fungere fint, men jeg var lidt usikker på at smide det ind på serveren, da jeg ikke forstår hvordan det virker.

Derfor lavede jeg et vbscript i stedet, da det åbenbart ikke er så simpelt at programmere bat filer, som jeg troede.

Men det virker som det skal så du skal have dine points.
Skriv et svar så tildeler jeg points.
Avatar billede bertelbrander Novice
31. oktober 2005 - 19:48 #10
Ja, det er ret besværligt at lave den slags i bat-filer, og det er ikke ret let at gennemskue hvordan det virker, jeg foretrækker normalt at gøre det med python.

Jeg samler ikke på point.
Avatar billede stig3 Mester
31. oktober 2005 - 21:06 #11
Ja, Python er sikkert også enklere, det kender jeg bare heller ikke :-)

Skomager bliv ved din hest......eller noget i den stil.
VBScriptet blev en del kortere end det ovenstående og det ville det sikkert også blive i Python.

Du skal i hvert fald have tak for hjælpen, selvom du ikke samler på points.
Avatar billede bauerdata Nybegynder
22. april 2007 - 19:57 #12
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
USAGE: delete_files [-h <arg>]|[-d <arg>]
-h <int> : default 24. Angiver filens mindste alder i timer.
-d <int> : default  0. Angiver filens mindste alder i dage.
Filer i aktuelt bibliotek bliver slettet hvis de er ældre end angivet
ved summen af argumenterne.
Eks.
    delete_files      # uden argumenter sletter alle filer over 24 timer
    delete_files -d 3 # sletter filer som er mere end 3 x 24 timer gamle
    delete_files -h 2 # sletter filer som er mere end 2 timer gamle
"""
import getopt, os, sys, datetime
##############################
# Fetch and validate Options #
##############################
try:
    Options = getopt.getopt(sys.argv[1:], 'h:d:')
except:
    print __doc__
    sys.exit()

# der der for mange Options
if len (Options) > 1 :
    print __doc__, "To many options selected"
    sys.exit()

# set tiden som default 24 timer
Tid = datetime.timedelta( hours=24 )

for Option, Argument in Options:
    try: # test if argument is int ?
        if Option == '-h':
            Tid = datetime.timedelta( hours=int( Argument ) )
        elif Option == '-d':
            Tid = datetime.timedelta( days=int( Argument ) )
           
    except: # Args was not int
        print __doc__, "args must bee int"
        sys.exit()

#############################################
# gennemgå alle filerne i aktuelt bibliotek #
#############################################

# Set grænsen for hvor gamle filerne må være
Limit = datetime.datetime.now() - Tid

for FName in os.listdir("."):
    if os.path.isfile(FName) and not os.path.islink(FName):
        # kun filer chekkes
        if datetime.datetime.fromtimestamp( os.path.getmtime( FName ) ) < Limit:
            print "deleting " , FName
            # os.remove(FName)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester