Hi,
hab folgendes Problem mit einer .bat - Datei. Später im Code greift diese auf die delage32.exe
Hab diesen Code bekommen.
@echo off
cls
:: Pfad, in dem das Löschprogramm delage32.exe zu finden ist
cd C:\mmu\FileDelete_Age
:: Prüfen ob Datei notdelete.txt vorhanden ist, wenn ja gehe auf ende
if exist notdelete.txt goto ende
:: [Programmaufruf] [Pfad, der zu löschende Datei(en)] [Anzahl der Tage]
:: ["/created" sucht nach dem Erstelldatum,
:: "/recurse" durchsucht auch die Unterordner,
:: "/preview" zeigt die zu löschenden Dateien, löscht aber nocht nicht]
delage32.exe I:\ExcelSheets\*.* 60 /created /recurse
:ende
Leider funktioniert dieser nicht richtig, obwohl die Datei notdelete.txt exisitiert werden die .xls-Dateien gelöscht.
Kann mir einer sagen warum? oder vielleicht sagen wo der Fehler ist.
Innerhalb I:\ExcelSheets\ sind noch 5 Ordner. Sobald in einem dieser Unterordner die Datei notdelete.txt exisitiert, dann sollen die Dateien in diesem Unterordner nicht gelöscht werden, obwohl diese älter als 60 Tage alt sind
Unterordner: Kosten, Gewinn, Problem usw.
Sobald die notdelete.txt z.b in "Kosten" vorhanden ist, dann sollen die .xls-File innerhalb von dem Ordner "Kosten" nicht gelöscht werden. Es sollen alle Unterordner überprüft werden ob sich eine ".txt-Datei mit dem Name "notdelete.txt" befindet !
Danke für eure Hilfe
MfG
dkaj
moin,
warum machst Du die Abfrage in einer Batchdatei und nicht im Code?
Oder ist die delage32.exe nicht von Dir und du kommst an den Code nicht ran?
MfG hulkstar
Obwohl ich auch nicht verstehe wieso dies durch ein externes tool erledigt werden soll sehe ich den Fehler sofort (springt einem richtig ins Auge)
schau dir mal Zeile 6 an und überlege dann WO notdelete.txt gesucht wird.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hi,
dieser code soll hier suchen
I:\ExcelSheets\
Habe keine Ahnung wie man .bat dateien programmiert, könnt ihr mir vielleicht diesen code umändern?
moin,
warum machst Du die Abfrage in einer Batchdatei und nicht im Code?
Oder ist die delage32.exe nicht von Dir und du kommst an den Code nicht ran?
Ist leider nicht von mir, hab sie von meinem Chef bekommen, ich soll diese eben so programmieren 🙁 , das in den Unterordnern von
I:\ExcelSheets\
nach der notdelete.txt gesucht wird.
Danke für eure Hilfe !!!
dann verschieb mal 6 nach 11 und es rockt.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hallo zusammen,
Vorsicht ist die Mutter mit der Porzelankiste. Jeder der mal DOS bedient hat weiß was ich nun mit folgendem meine:
Dieses Script funktioniert aber nur, wenn es auf der C:-Partition ausgeführt wird.
Sollte es von einer anderen Partition ausgeführt werden, dann sorgt ein "cd C:\Irgendwas" nicht dafür, dass die Partition gewechselt wird.
Also erst einmal das anwenden, was Programmierhans angeregt hat, und direkt nach dem cd-Befehl noch eine weitere Zeile einfügen, in der steht:
cd c:
Das tut nie weh, ist aber dann besser 😉
Gruß
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Original von norman_timo
Hallo zusammen,Vorsicht ist die Mutter mit der Porzelankiste. Jeder der mal DOS bedient hat weiß was ich nun mit folgendem meine:
Dieses Script funktioniert aber nur, wenn es auf der C:-Partition ausgeführt wird.
Sollte es von einer anderen Partition ausgeführt werden, dann sorgt ein "cd C:\Irgendwas" nicht dafür, dass die Partition gewechselt wird.
Also erst einmal das anwenden, was Programmierhans angeregt hat, und direkt nach dem cd-Befehl noch eine weitere Zeile einfügen, in der steht:
cd c:
Das tut nie weh, ist aber dann besser 😉
Ich will kein Spielverderber sein, aber hast du mal ausprobiert was du da vorschlaegst?
Hint:
E:\>cd C:
C:\Documents and Settings\Benjamin.Podszun
E:\>
Was die anderen Antworten angeht: Zeile 6 nach 11 verschieben hilft ihm auch nicht. Er will in jedem Unterverzeichnis rekursiv die Datei suchen und bei Vorhandensein entsprechend in dem Verzeichnis nicht loeschen. Das ist leider nicht so trivial wie Zeilen tauschen..
Pound for pound, plutonium is about as toxic as caffeine when eaten.
er hat sicher ein simples C: gemeint (statt cd C:)
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Ich weiss.. 😉
Was jedoch die Ursprungsfrage angeht:
Ich wuerde davon absehen sowas in einer .bat (oder .cmd..) zu bauen. Das wird schnell haesslich. Entweder man hat eine richtige Shell zur Verfuegung (Stichwort: Cygwin.., wenn es von MS sein soll: Windows Power Shell) oder man macht es eben passend zum Forum in wenigen Zeilen C#.
Pound for pound, plutonium is about as toxic as caffeine when eaten.
Hi Leute,
danke für eure Hilfe.
Ich versteh net ganz was ihr mit cd C: meint....
der code löscht die .xls Dateien, der löscht leider alle 😦....
Das soll der aber nicht, der soll nur die löschen wo kein notdelete.txt vorhanden ist.
Was müsste ich verändern??? Könntet mir vielleicht ein verbesserten Code einfügen???
Danke für eure Hilfe !!!!
Original von dkaj
Was müsste ich verändern??? Könntet mir vielleicht ein verbesserten Code einfügen???
Du alles richtig lesen !! 😁
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
erste Datei: deloldxls.cmd
@ECHO OFF
REM aktuelles Datum in Tage umrechnen
REM dazu wird das Bankenjahr (12 Monate zu 30 Tagen benutzt)
SET /a CURRENTDATE="%DATE:~0,2%+%DATE:~3,2%*30+%DATE:~6,4%*360"
REM Laufwerk und Verzeichnis setzen
PUSHD I:\ExcelSheets\
REM Ordner suchen und Sub aufrufen
DIR /s /b /w /AD > %temp%\folders.txt
FOR /F "delims=" %%i IN (%temp%\folders.txt) DO CALL _subdeloldxls.cmd "%%i"
REM Aufraeumen
DEL %temp%\folders.txt
POPD
SET CURRENTDATE=
ECHO Fertig.
zweite Datei: _subdeloldxls.cmd
@ECHO OFF
ECHO Checke Verzeichnis %%1
PUSHD %%1
IF EXISTS "notdelete.txt" GOTO DONOT
:DO
ECHO Lösche alte Dateien...
REM XLS-Dateien suchen, dann Kopfzeilen entfernen
DIR /4 *.xls | find /i ".xls" > %temp%\files.txt
REM token => Spalte, 1(j) = Datum, 2(k) = Zeit, 3(l) = Groesse, 4(m) = Name
FOR /F "tokens=1,2,3*" %%j IN (%temp%\files.txt) DO CALL _subsubdeloldxls.cmd %%j "%%m"
DEL %temp%\files.txt
GOTO ENDE
:DONOT
ECHO notdelete.txt vorhanden, Verzeichnis übersprungen
GOTO ENDE
:ENDE
POPD
dritte Datei: _subsubdeloldxls.cmd
@ECHO OFF
REM 1. Parameter = Datum, 2. Parameter = Name
REM Dateidatum berechnen
SET SUBDATE=%%1
SET /a FILEDATE="%SUBDATE:~0,2%+%SUBDATE:~3,2%*30+%SUBDATE:~6,4%*360"
REM Alter berechnen
SET /a ALTER="%CURRENTDATE%-%FILEDATE%"
REM Altersabfrage (Alter groesser 60 Tage) und löschen
IF %ALTER% GTR 60 DEL /f /q "%%2"
SET ALTER
SET SUBDATE=
SET FILEDATE=
Das sollte es eigentlich tun.
Respekt davor. Aber wenn ich die ganzen tempfiles sehe und das Gesamtergebnis ueber drei Dateien verteilt, dann wuerde ich vielleicht doch eine ordentliche Shell nehmen.. scheint mir das recht viel Aufwand fuer wenig Arbeit. 😉
Pound for pound, plutonium is about as toxic as caffeine when eaten.
Cool Borg ... wo haste denn das assimiliert ? 😉
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Aber wenn ich die ganzen tempfiles sehe
Die könnte man prinzipiell einsparen, indem man direkt die Ausgabe des DIR-Kommandos im FOR benutzt.
dann wuerde ich vielleicht doch eine ordentliche Shell nehmen
Sicherlich. Oder halt ein winziges C#-Programm, das man sich in ein paar Minuten zusammen schustert...
scheint mir das recht viel Aufwand fuer wenig Arbeit.
War auch mehr ein Proof-of-Principle...
Cool Borg ... wo haste denn das assimiliert ?
nun, wenn man erstmal entdeckt hat, dass einem das SET-Kommando das Rechnen erlaubt, kann man viele Sachen mit der einfachen CMD.EXE machen.
Den Code selbst habe ich gerade geschrieben.
Allerdings nicht getestet.
das Gesamtergebnis ueber drei Dateien verteilt
Habe gerade erst festgestellt, dass CALL jetzt auch Sprungmarken unterstützt.
Daher:
@ECHO OFF
REM aktuelles Datum in Tage umrechnen
REM dazu wird das Bankenjahr (12 Monate zu 30 Tagen benutzt)
SET /a CURRENTDATE="%DATE:~0,2%+%DATE:~3,2%*30+%DATE:~6,4%*360"
REM Laufwerk und Verzeichnis setzen
PUSHD I:\ExcelSheets\
REM Ordner suchen und Sub aufrufen
DIR /s /b /w /AD > %temp%\folders.txt
FOR /F "delims=" %%i IN (%temp%\folders.txt) DO CALL :FOLDER "%%i"
REM Aufraeumen
DEL %temp%\folders.txt
POPD
SET CURRENTDATE=
ECHO Fertig.
EXIT
REM ************************************************
REM Sub für aktuellen Ordner
:FOLDER
ECHO Checke Verzeichnis %%1
PUSHD %%1
IF EXISTS "notdelete.txt" GOTO DONOT
:DO
ECHO Lösche alte Dateien...
REM XLS-Dateien suchen, dann Kopfzeilen entfernen
DIR /4 *.xls | find /i ".xls" > %temp%\files.txt
REM token => Spalte, 1(j) = Datum, 2(k) = Zeit, 3(l) = Groesse, 4(m) = Name
FOR /F "tokens=1,2,3*" %%j IN (%temp%\files.txt) DO CALL :FILE %%j "%%m"
DEL %temp%\files.txt
GOTO ENDE
:DONOT
ECHO notdelete.txt vorhanden, Verzeichnis übersprungen
GOTO ENDE
:ENDE
POPD
EXIT
REM ****************************************
REM Sub für aktuelle Datei
:FILE
REM 1. Parameter = Datum, 2. Parameter = Name
REM Dateidatum berechnen
SET SUBDATE=%%1
SET /a FILEDATE="%SUBDATE:~0,2%+%SUBDATE:~3,2%*30+%SUBDATE:~6,4%*360"
REM Alter berechnen
SET /a ALTER="%CURRENTDATE%-%FILEDATE%"
REM Altersabfrage (Alter groesser 60 Tage) und löschen
IF %ALTER% GTR 60 DEL /f /q "%%2"
SET ALTER=
SET SUBDATE=
SET FILEDATE=
EXIT
Hi Borg,
da ich noch gar keine Ahnung von .bat programmierung habe, hätte ich ein paar verständniss fragen.
Durchsucht dein Code die ganzen Unterordner, denn in jedem von denen kann ein "notdelete.txt" sein und dann sollen die .xls files drin nicht gelöscht werden??
Danke !
Hi Borg,
da ich noch gar keine Ahnung von .bat programmierung habe, hätte ich ein paar Verständnissfrage.
Durchsucht dein Code die ganzen Unterordner, denn in jedem von denen kann ein "notdelete.txt" sein und dann sollen die .xls files drin nicht gelöscht werden??
Danke !
Ja.
Um das genauer zu erklären, werde ich den wichtigen Code hier mal als C# einfügen und kommentieren.
@ECHO OFF
// Anzeigen der Befehle auf der Kommandozeile ausschalten
SET /a CURRENTDATE="%DATE:~0,2%+%DATE:~3,2%*30+%DATE:~6,4%*360"
// die Umgebungsvariable CURRENTDATE wird hier auf die (fiktive) Zahl der Tage seit dem 1.1.0 gesetzt
// dies ist zwar relativ einfach, reicht aber für diese Fälle
// %DATE% liefert das aktuelle Datum im Format dd.mm.yyyy
// ~x,y liest y Zeichen ab dem x-ten (nullbasiert)
PUSHD I:\ExcelSheets\
// aktuelles Verzeichnis speichern und in das Zielverzeichnis wechseln
DIR /s /b /w /AD > %temp%\folders.txt
// alle Ordner (/AD) in allen Unterverzeichnissen (s) suchen und nur mit vollem Pfad (/w /b) in eine temporäre Datei schreiben
FOR /F "delims=" %%i IN (%temp%\folders.txt) DO CALL :FOLDER "%%i"
// für jede Zeile der Datei (und damit jedes Verzeichnis die Sub Folder aufrufen
DEL %temp%\folders.txt
// temp. Datei löschen
POPD
// Verzeichnis wiederherstellen
SET CURRENTDATE=
// Umgebungsvariable löschen
ECHO Fertig.
EXIT
// fertig und Ende
:FOLDER
// hier beginnt die Sub Folder
ECHO Checke Verzeichnis %%1
PUSHD %%1
// Infomeldung und ins Verzeichnis wechseln
IF EXISTS "notdelete.txt" GOTO DONOT
// existiert notdelete.txt? ja => gehe zu DONOT
:DO
// sonst
ECHO Lösche alte Dateien...
DIR /4 *.xls | find /i ".xls" > %temp%\files.txt
// alle XLS-Dateien suchen, Jahreszahl vierstellig, Kopfzeilen entfernen und in Datei
FOR /F "tokens=1,2,3*" %%j IN (%temp%\files.txt) DO CALL :FILE %%j "%%m"
// jede Zeile der Datei lesen, Spalte 1 (Änderungsdatum) und 4 (Name) an Sub File weitergeben
DEL %temp%\files.txt
// temp. Datei löschen
GOTO ENDE
:DONOT
ECHO notdelete.txt vorhanden, Verzeichnis übersprungen
GOTO ENDE
:ENDE
POPD
EXIT
// Verzeichnis wiederherstellen und zurück
:FILE
// hier beginnt die Sub File
SET SUBDATE=%%1
// erster Parameter ist Dateidatum
SET /a FILEDATE="%SUBDATE:~0,2%+%SUBDATE:~3,2%*30+%SUBDATE:~6,4%*360"
// wie oben in Zahl der Tage umrechnen
SET /a ALTER="%CURRENTDATE%-%FILEDATE%"
// Alter ist Differenz
IF %ALTER% GTR 60 DEL /f /q "%%2"
// wenn Alter größer als 60 ist, Datei löschen
SET ALTER=
SET SUBDATE=
SET FILEDATE=
EXIT
// Variablen löschen und zurück
Hallo zusammen,
Ich versteh net ganz was ihr mit cd C: meint....
Stimmt, Asche über mein Haupt, ich meinte tatsächlich ein simples C: als Anweisung, danke für die Korrektur, es ist doch schon zu lange her 😉
Gruß
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Hi,
hab mal den Code von Borg ausgeführt, leider funktioniert dein Code nicht X(
Hast du vielleicht noch ein Vorschlag??
Danke !
MFG
dkaj
Ohne konkrete Fehlermeldung ist das nicht so einfach!
Was macht er denn oder auch nicht?
Gruss
Raubritter
hi,
ich versuch mal dieses Problem nochmal zu erklären.
Ich habe unter "I:\Excelsheets" noch weitere Ordner (Kosten,Gewinn,Arbeitnehmer usw).
Jetzt bräuchte ich eine .bat - Datei die durch diese Unterordner geht und die .xls -Dateien sucht die älter als 60 Tage alt sind.
So nun soll überprüft werden ob z.b im Unterordner "Kosten"
z.b Pfad ......."I:\Excelsheets\Kosten"
die Datei "notdelete.txt" vorhanden ist, falls ja, sollen die Dateien die älter als 60 Tage alt sind nicht gelöscht werden. Im nächsten Ordner "Gewinn" soll wieder das gleiche geschehen(Suche nach den Dateien älter als 60 Tage). Falls aber hier kein "notdelete.txt" vorhanden ist, dann sollen die Dateien die älter als 60Tage alt sind, gelöscht werden.
Gerne könnt ihr mir eure Vorschläge schicken z.b Codes usw. aber die Datei muss eine .bat sein, dass ist die einzige Beschränkung die ich bekommen hab.
Danke für eure Hilfe !!
MFG
dkaj
Meinst du nicht auch, dass wir die Aufgabe langsam verstanden haben?
Gerne könnt ihr mir eure Vorschläge schicken z.b Codes usw. aber die Datei muss eine .bat sein, dass ist die einzige Beschränkung die ich bekommen hab.
Die Beschränkung, ausschließlich andere für dich arbeiten zu lassen, hast du aber nicht bekommen, oder?
Hatte zwei kleinere Fehler beim CALL und ein vergessenes Anführungszeichen.
Neue Version im Anhang.
Hi,
danke Borg funktioniert perfekt !! 👍
Die Beschränkung, ausschließlich andere für dich arbeiten zu lassen, hast du aber nicht bekommen, oder?
Ich würde es gern selbst machen können, aber bin zur Zeit im Prüfungsstress für meine Zwischenprüfung, d.h ich habe zur Zeit leider keine Zeit für Tutorials usw.
Danke dir trotzdem für deine Hilfe.
MfG
dkaj
Hi,
da bin ich wieder 😁 . Hab mir auch paar tutorials angeschaut und es mal anders versucht. Anbei mein Code, der auch gut Funktioniert !!
Echo=on
::cls
:: Pfad, in dem das Löschprogramm delage32.exe zu finden ist
cd I:\FileDelete_Age
:: [Programmaufruf] [Pfad, der zu löschende Datei(en)] [Anzahl der Tage]
:: ["/created" sucht nach dem Erstelldatum,
:: "/recurse" durchsucht auch die Unterordner,
:: "/preview" zeigt die zu löschenden Dateien, löscht aber nocht nicht]
dir I:\Excelsheets /s /b /w /AD >dirlisting.txt
FOR /f %%f IN (dirlisting.txt) DO call :loop "%%f"
goto ende
:loop
set "Dir=%~1"
IF NOT EXIST "%DIR%\notdelete.txt" delage32.exe "%DIR%\*.*" 60 /created /recurse
PAUSE
:ende
:del dirlisting.txt
Problem ist nur das einige Ordner ein Leerzeichen haben z.b
"Kosten fürs laufende Jahr" bei diesen Ordner nimmt er nur den ersten Teil
in diesem Bsp wäre das nur "Kosten".
Kann mir einer sagen woran das liegt, oder wie man das umgehen kann? Problem ist, ich darf die Namen der Ordner leider nicht abändern X(.
Bei den Ordnern ohne Leerzeichen funktioniert das Perfekt !!!!
MFG
dkaj
Hallo,
überlege, wo und wie Gänsefüßchen zu setzen wären. Ich verstehe z.B. nicht, warum Du sie hier setzt:
set "Dir=%~1"
Wenn Du einen Pfad wie "Kosten fürs laufende Jahr" hast, muss die gesamte Angabe in Gänsefüßchen stehen. Probiere also so etwas:
set Dir="%~1"
Viel Erfolg! Gruß Jürgen
Hi Juetho,
hab mal dein Vorschlag versucht, leider macht der das immernoch nicht richtig.
In der dirlisting.txt werden alle gefundenen Pfade eingetragen, ich wunder mich nur warum er nicht den eingetragen Pfad nimm , sondern kürzt nur ab.
Kann man das irgendwie umgehen?
Hab auch mal den Code von Borg getestet, da macht er auch das gleiche.
bat-Dateien sind wirklich komisch...
MFG
dkaj
Ich mache nicht ganz das gleiche.
Dein Fehler liegt hier:
FOR /f %%f IN (dirlisting.txt) DO call :loop "%%f"
Das FOR-Kommando benutzt als Trennzeichen per Default Tab, Leerzeichen und Zeilenende. Diese kannst du mit der Option "delims" anpassen.
Daher wie in meinem Code
FOR /f "delims=" %%f IN (dirlisting.txt) DO call :loop "%%f"
Desweiteren muss das "/recurse" weg, sonst löscht er alle älteren Dateien unterhalb eines Verzeichnisses, das kein "notdelete.txt" enthält. Du durchsuchst ja auch alle Verzeichnisse selbst.
Nur leider benutzt du jetzt ja wieder ein externes Programm.
Da fand ich meinen Code schöner...
EDIT: Du solltest die :LOOP-Sub mit GOTO :EOF anschließen. Ist zwar momentan nicht notwendig, da dort eh das Dateiende ist, aber wenn du den Code erweitern solltest, hagelt es Fehler.
aha cool,
teste ich gleich Morgen!
Ich werds mal versuchen und mal sehen obs klappt. Hab mit mein Chef geredet und der will das ich das exteren Programm nutze..
Daher kann ich leider nichts dran ändern...
Ich meld mich morgen wieder. Danke für deine Hilfe !
MFG
dkaj
Hi Borg,
hab eben das getestet und funktioniert einfach Klasse !! 👍
Danke nochmal für deine Hilfe.
MFG
dkaj
hast du deinem chef auch mal borgs bat gezeigt und ihm gesagt das damit das externe programm überflüssig ist?
Original von dkaj
der besteht trotzdem drauf !
Das ist das Recht eines Chefs ... keine Ahnung zu haben und trotzdem zu bestimmen.
Paragraph 1) der Chef hat immer Recht
Paragraph 2) falls der Chef mal nicht Recht hat, dann gilt Paragraph 1
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...