planich
Goto Top

Batch Löschen von Datei Ordner aus txt. woher wissen ob Datei oder Ordner

Hallo,
ich habe in einer txt eine Menge Pfade, das sieht etwa so aus

"test\~ThorstenExportSTEP
test\DIN_EN62079_Erstellen von Anleitungen Gliederung, Inhalt und Darstellung.sync.PDF
test\Elektrik-SicherheitsDoku-BEISPIEL.sync.doc
test\EN 842.sync.pdf"

nun möchte ich alles löschen, egal ob Datei oder Ordner
ich kenn aber keinen Befehl der einfach Datei und Ordner löscht, sondern nur entweder oder, also möchte ich jetzt prüfen ob das ganze ein Ordner ist, wenn ja den rmdir Befehl nutzen, ansonsten den erase.

Wie kann ich das überprüfen, oder gibt es doch einen Befehl der Verzeichnisse und Dateien gleichermaßen löscht?

Danke und ein schönes Wochenende

PS: im Netz habe ich zum Prüfen etwas gefunden, das für mich leider nicht funktioniert hat
if exist %1\* echo Directory

wenn ich das auf mich abändere z.B.
if exist %top2%\*

krieg ich nur nen Fehler

%1 ist doch keine korrekte Variable oder was bedeutet das?

Content-Key: 188728

Url: https://administrator.de/contentid/188728

Printed on: April 23, 2024 at 07:04 o'clock

Member: baldur
baldur Jul 27, 2012 at 12:52:05 (UTC)
Goto Top
Hi.
Der Befehl:
rmdir /s /q <pfad>
löscht <Pfad> incl. Unterverzeichnissen und darin liegenden Dateien ohne Nachfrage.

Gruss,
Baldur
Member: Planich
Planich Jul 27, 2012 at 13:04:03 (UTC)
Goto Top
das weiß ich, ich glaube du hast meine Frage nicht verstanden, oder ich habe mich unglücklich ausgedrückt

ich lese eine txt zeilenweise aus und habe jeweils einen Pfad zu einem Verzeichnis oder einer Datei
ich kann nicht auf alle Zeilen den rmdir Befehl anwenden, weil dann nur die Verzeichnisse gelöscht werden würden, nicht aber die Dateien

z.B. test\Elektrik-SicherheitsDoku-BEISPIEL.sync.doc
Member: bastla
bastla Jul 27, 2012 updated at 15:17:47 (UTC)
Goto Top
Hallo Planich und willkommen im Forum!

Es sollte zwar
if exist "%top2%\nul"
(und eigentlich auch ohne "nul") klappen, aber im Zweifelsfall einfach
rd /s /q "%top2%" 2>nul
del /f "%top2%" 2>nul
und eins von beiden wird funktioniert haben ... face-wink

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Jul 27, 2012 updated at 16:23:50 (UTC)
Goto Top
moin mitnander,

%1 beschreibt den Zurzeit ersten Parameter innerhalb des Batches.


und falls es doch unbeding erst Vorher geprüft werden soll.

test auf der CMD-Line:
for %i in (c:\users A:\ A:\test A:\anderes.txt D:\neues *) do @dir /b "%i?" 2>nul >&2 &&(if exist "%i\" (echo Ordner: %i) else echo Datei: %i)||echo Datei nicht gefunden.  

Analog zu Deiner Textdatei wäre es (in einem Batch) in etwa so:
for /f usebackqdelims^= %%i in ("D:\Das Textdokument mit dem zu loeschenden sachen") do @dir /b "%%i?" 2>nul >&2 &&(if exist "%%i\" (echo rd /s /q "%%~i") else echo del /f "%%~i")||echo Datei %%i nicht gefunden.  

Das echo zeigt was es Täte - wenn Du es entfernst tut es.

Gruß Phil
Member: Planich
Planich Jul 30, 2012 at 14:44:47 (UTC)
Goto Top
Hallo Bastla und Phil,

ich habe jetzt folgenden Zwischencode der funktioniert

@echo off
set "top2=D:\test\~ThorstenExportSTEP"
echo %top2%
if exist "%top2%\" (
rd /s /q "%top2%"
) else (
echo no
)

wenn ich jedoch das ganze auf mein "größeres" Programm anpasse haut das ganze nicht mehr hin, ich vermute ein Leerzeichen am Ende des Paths, denn wenn ich die txt mit Notepad öffne, habe ich an jedem Zeilenende hinter dem letzten Zeichen noch ein Leerzeichen. Kann mir jemand sagen wie ich das Leerzeichen am Ende einfach weglöschen kann?

Danke für eure Hilfe
Member: bastla
bastla Jul 30, 2012 at 15:12:50 (UTC)
Goto Top
Hallo Planich!
haut das ganze nicht mehr hin
ist eine interessante Fehlerbeschreibung ... face-wink
ich vermute ein Leerzeichen am Ende des Paths
Soferne Du damit Deine Variable %top2% meinst, ist das lt obigem Code auszuschließen - was Du auch leicht prüfen kannst, indem Du in Zeile 3 (die als solche auch leicht erkennbar wäre, wenn Du "Code"-Formatierung verwendet hättest) einfach
echo "%top2%"
schreibst ...

Grüße
bastla
Member: Planich
Planich Jul 31, 2012 at 05:42:04 (UTC)
Goto Top
genau so habe ich es schon probiert und deshalb den Fehler nicht weiter beschrieben, sondern mit meiner Vermutung "eingegrenzt" face-smile

Hier mal der kleine Code

@echo off
set "top2=D:\test\~ThorstenExportSTEP"
echo %top2%
if exist "%top2%\" (
rd /s /q "%top2%"
) else (
echo no
)


und hier der "große"

REM Dateien löschen
for /f "delims=" %%a in (%var_txtpath%) do (
set "top=%%a"
call :prozedurdelete
)
:prozedurdelete
set "top2=!Laufwerksbuchstabe!!top!"
echo %top2%
if exist "%top2%\" (
rd /s /q %top2%
) else (
erase "%top2%"
)
goto :eof

wobei das hier in der txt steht
"
test\~ThorstenExportSTEP
"
wie gesagt am Ende jeder Zeile in der txt ist ein Leerzeichen
Member: bastla
bastla Jul 31, 2012 at 09:04:05 (UTC)
Goto Top
Hallo Planich!

Der "große" Code ist aber erstens auch noch nicht die ganze Wahrheit, und zweitens unnötig groß - unter der Annahme, dass die Pfade in der Textdatei keine Leerzeichen (außer jenen am Ende - und wie die dorthin gekommen sind, kannst nur Du wissen bzw lässt sich aus den bisher geposteten Informationen nicht feststellen) enthalten, sollte eigentlich
REM Dateien löschen
for /f %%a in (%var_txtpath%) do (
    rd /s/q %Laufwerksbuchstabe%%%a 2>nul
    del /f %Laufwerksbuchstabe%%%a 2>nul
)
schon genügen ...
Wenn Du bei Deinem Ansatz bleiben willst, brauchst Du zumindest noch ein "goto :eof" vor dem Unterprogramm (wenn Du "Code"-Formatierung verwendet hättest, könnte ich jetzt auch die entsprechende Zeilennummer nennen), aber nicht die Schreibweise der Variablen mit "!" anstatt "%" ...

Grüße
bastla
Member: Planich
Planich Jul 31, 2012 updated at 09:48:23 (UTC)
Goto Top
Hallo bastla,
ok dann hier mal der gesamte Code

@echo off
REM Zeitvariablen setzen
FOR /F "tokens=1-6 delims=.,: " %%i IN ('ECHO %DATE% %TIME%') DO (  
	SET  _DAY=%%i
	SET  _MON=%%j
	SET _YEAR=%%k
	SET _HOUR=%%l
	SET  _MIN=%%m
	SET  _SEC=%%n
)
IF %_HOUR%==9 SET _HOUR=0%_HOUR%
IF %_HOUR%==8 SET _HOUR=0%_HOUR%
IF %_HOUR%==7 SET _HOUR=0%_HOUR%
IF %_HOUR%==6 SET _HOUR=0%_HOUR%
IF %_HOUR%==5 SET _HOUR=0%_HOUR%
IF %_HOUR%==4 SET _HOUR=0%_HOUR%
IF %_HOUR%==3 SET _HOUR=0%_HOUR%
IF %_HOUR%==2 SET _HOUR=0%_HOUR%
IF %_HOUR%==1 SET _HOUR=0%_HOUR%
IF %_HOUR%==0 SET _HOUR=0%_HOUR%

setlocal enabledelayedexpansion

set Laufwerksbuchstabe=D:\
set var_txtpath=%Laufwerksbuchstabe%%_YEAR%%_MON%%_DAY%_%_HOUR%%_MIN%%_SEC%Log.txt
set var_zippath=%Laufwerksbuchstabe%%_YEAR%%_MON%%_DAY%_%_HOUR%%_MIN%%_SEC%.7z

set "sevenzpath=C:\Program Files (x86)\7-Zip\7zG.exe"  
set "rootpath=D:\test\"  

REM schauen ob die ext. Festplatte angeschlossen ist und wir den richtigen Laufwerksbuchstaben vermuten
for /f %%a in ('find "12345678" "H:\flag.txt"') do set T=%%a  
if %T%==12345678 goto check2
Echo Laufwerk H:\ und Flag Datei nicht gefunden >> %var_txtpath%
goto exit

:check2
REM schauen ob 7-Zip im richtigen Ordner liegt
Echo Flag-Datei gefunden
if exist "%sevenzpath%" goto doit  
Echo 7-Zip im falschen Ordner oder nicht vorhanden >> %var_txtpath%
goto exit

REM Start des Vorgangs
:doit
Echo 7zip.exe gefunden - Beginne Vorgang
REM Dateien mit "~"  
for /f "tokens=*" %%i in ('dir "%rootpath%~*" /a /s /b') do (  
set "top=%%i"  
call :prozedur															
)
REM .sync Dateien
for /f "tokens=*" %%i in ('dir "%rootpath%*.sync*" /a /s /b') do (  
set "top=%%i"  
call :prozedur	
)
REM .$$. Dateien
for /f "tokens=*" %%r in ('dir "%rootpath%*.$*$*" /a /s /b') do (  
set "top=%%r"  
call :prozedur	
)
REM Packen der Dateien
d:
"%sevenzpath%" a -t7z %var_zippath% "@%var_txtpath%" -scsWIN  

REM Dateien löschen
for /f "delims=" %%a in (%var_txtpath%) do (  
set "top=%%a"  
call :prozedurdelete
)
goto exit

REM Call in Sprungmarke :prozedur wird benötigt, da der set Befehl in der FOR Schleife nicht funktioniert
:prozedur
REM echo %top2%
REM Erste drei Zeichen vorn abschneiden, damit 7zip beim Packen die Ordnerstruktur übernimmt
set "top2=!top:~3!"  
REM Umlaute aktivieren
chcp 1252>nul						
echo %top2% >> %var_txtpath%
REM Umlaute deaktivieren
chcp %CP%>nul
REM um aus :prozedur herauszukommen	
goto :eof

:prozedurdelete
set "top2=!Laufwerksbuchstabe!!top!"  
echo %top2%
if exist "%top2%\" (  
rd /s /q "%top2%"  
) else ( 
erase "%top2%"  
)
goto :eof

:exit
endlocal
PAUSE

Ich kriege beim Ausführen immer die Meldung "Das System kann den angegebenen Pfad nicht finden"

Deinem letzten Hinweis mit dem "gogo :eof" kann ich nicht ganz folgen, vielleicht kannst du mir jetzt die Zeile nennen. Mir fällt grad nix auf wo das Sinn machen würde bzw. hab ich es ja schon eingebaut.

Gruß und Danke
Planich
Member: bastla
bastla Jul 31, 2012 updated at 12:45:56 (UTC)
Goto Top
Hallo Planich!

Etwas angepasst / gestrafft:
@echo off
REM Zeitvariablen setzen
FOR /F "tokens=1-6 delims=.,: " %%i IN ('ECHO %DATE% %TIME%') DO (  
	SET  "_DAY=%%i"  
	SET  "_MON=%%j"  
	SET "_YEAR=%%k"  
	SET "_HOUR=%%l"  
	SET  "_MIN=%%m"  
	SET  "_SEC=%%n"  
)
IF %_HOUR% lss 10 SET "_HOUR=0%_HOUR%"  

set Laufwerksbuchstabe=D:\
set "var_txtpath=%Laufwerksbuchstabe%%_YEAR%%_MON%%_DAY%_%_HOUR%%_MIN%%_SEC%Log.txt"  
set "var_zippath=%Laufwerksbuchstabe%%_YEAR%%_MON%%_DAY%_%_HOUR%%_MIN%%_SEC%.7z"  

set "sevenzpath=C:\Program Files (x86)\7-Zip\7zG.exe"  
set "rootpath=D:\test\"  

REM schauen ob die ext. Festplatte angeschlossen ist und wir den richtigen Laufwerksbuchstaben vermuten
for /f %%a in ('find "12345678" "H:\flag.txt"') do set "T=%%a"  
if "%T%"=="12345678" goto check2  
>>%var_txtpath% Echo Laufwerk H:\ und Flag Datei nicht gefunden
goto exit

:check2
REM schauen ob 7-Zip im richtigen Ordner liegt
Echo Flag-Datei gefunden
if exist "%sevenzpath%" goto doit  
>>%var_txtpath% Echo 7-Zip im falschen Ordner oder nicht vorhanden
goto exit

REM Start des Vorgangs
:doit
Echo 7zip.exe gefunden - Beginne Vorgang
REM Dateien mit "~"  
for /f "tokens=*" %%i in ('dir "%rootpath%~*" /a /s /b') do (  
    set "top=%%i"  
    call :prozedur															
)
REM .sync Dateien
for /f "tokens=*" %%i in ('dir "%rootpath%*.sync*" /a /s /b') do (  
    set "top=%%i"  
    call :prozedur	
)
REM .$$. Dateien
for /f "tokens=*" %%r in ('dir "%rootpath%*.$*$*" /a /s /b') do (  
    set "top=%%r"  
    call :prozedur	
)
REM Packen der Dateien
d:
"%sevenzpath%" a -t7z %var_zippath% "@%var_txtpath%" -scsWIN  

REM Dateien löschen
for /f "delims=" %%a in (%var_txtpath%) do (  
    rd /s /q "%Laufwerksbuchstabe%%%a" 2>nul  
    del /f "%Laufwerksbuchstabe%%%a" 2>nul  
)
goto exit

REM Call in Sprungmarke :prozedur wird benötigt, da der set Befehl in der FOR Schleife nicht funktioniert
:prozedur
REM echo %top2%
REM Erste drei Zeichen vorn abschneiden, damit 7zip beim Packen die Ordnerstruktur übernimmt
set "top2=%top:~3%"  
REM Umlaute aktivieren
for /f "tokens=3 delims=. " %%i in ('chcp') do set "CP=%%i"  
chcp 1252>nul						
>>%var_txtpath% echo %top2%
REM Umlaute deaktivieren
chcp %CP%>nul
REM um aus :prozedur herauszukommen	
goto :eof

:exit
endlocal
PAUSE
Die Leerzeichen am Ende der Pfade hattest Du übrigens Deiner Zeile 80 zu verdanken:
echo %top2% >> %var_txtpath%
"works as designed" face-wink - es wird "%top2%Leerzeichen%" in die Datei geschrieben; wie's anders gehen kann, siehst Du oben ...

Grüße
bastla

[Edit] Zeile 66 korrigiert [/Edit]
Member: Planich
Planich Jul 31, 2012 updated at 11:28:22 (UTC)
Goto Top
es funktioniert mit deinem Quellcode leider nicht :D

in meiner txt steht dann
"
!top:~3!
"

folglich wird auch nichts gepackt von 7zip und es wird auch nichts gelöscht

ich kann deine Zeile 68 auch nicht richtig nachvollziehen, zumal ich auch chcp nicht wirklich verstanden habe, als ich es verwendete. Ich habe das nur als Lösung für mein Umlautproblem im Netz gefunden.
Vielleicht kannst du mir das nochmal erklären

Edit:

Wenn ich meine eigene Version anpasse funktionierts

echo %top2% >> %var_txtpath%
abändern in:

echo %top2%>>%var_txtpath%

und schon erstellt er da nicht unsinniger Weise ein Leerzeichen und es tut was es soll :D

danke
Member: bastla
bastla Jul 31, 2012 at 12:49:32 (UTC)
Goto Top
Hallo Planich!
es funktioniert mit deinem Quellcode leider nicht :D
Mit der inzwischen korrigierten Zeile 66 sollten die Chancen besser sein ... face-wink
ich kann deine Zeile 68 auch nicht richtig nachvollziehen, zumal ich auch chcp nicht wirklich verstanden habe
Hier wird einfach die aktuelle Codepage (dürfte 850 sein) als %CP% zwischengespeichert - ansonsten wäre die Zeile 72 (bei Dir oben 82) sinnlos ...

Grüße
bastla