frisconet
Goto Top

Batch - For Schleifen Ausgabe in Datei umleiten

Hallo Forum,
ich habe ein kleines Problem mit der Umleitung von dem Ergebnis einer For-Schliefe.
Ich habe mir eine Batch-Datei geschrieben um ein Verzeichnis auszulesen um die älteren Dateien zu löschen. Anschließend soll das Ergebnis in eine TXT Datei geschrieben / umgeleitet werden. Das funktioniert nur wenn nur eine Datei zu löschen da ist. Sollten es mehrere Dateien sein werden auch diese angezeigt und gelöscht aber nur eine wird in die Txt Datei geschrieben.
Gibt es eine Möglichkeit das so umzuschreiben das mir alle Dateien in die TXT Datei geschrieben werden.
Hier mein Code:

@echo off & setlocal
set Kopf=%temp%\Kopf.txt
>%Kopf% echo\
>>%Kopf% echo\
>>%Kopf% echo ==============================================
>>%Kopf% echo ----------------------------------------------
>>%Kopf% echo -  Filme Bereinigung beginnt. -
>>%Kopf% echo ----------------------------------------------
>>%Kopf% echo ==============================================
>>%Kopf% echo\
>>%Kopf% echo\
>>%Kopf% echo\

for /L %%A in (5,-1,0) do (
type %Kopf%
echo Suchvorgang wird gestartet
echo\
echo Wartezeit von %%A sekunden laeuft...
ping localhost -n 2 >nul
cls
)

type %Kopf%

set "Ordner=J:\HDD-Test"  
set "endung=*.ts"   
set "Anzahl=4"  
set "loesch=loesch.txt"  

for /f "skip=%Anzahl% delims=" %%i in ('dir /b /a-d /o-d "%Ordner%\%endung%"') do echo "%Ordner%\%%i" & echo "Geloescht am %date% - Datei= %Ordner%\%%i" > "%Ordner%\%loesch%" & set "loeschen=%Ordner%\%%i"  & del "%Ordner%\%%i"  

cls

Wenn ich meinen Code mit >> abändere (siehe unten) werden alle Dateien in die TXT Datei geschrieben. So möchte ich das aber nicht weil dann die Einträge am nächsten Tag dazu geschrieben werden. Ich möchte das jeden Tag nur die Dateien die gelöscht wurden eingeschrieben bekommen. Ich hoffe ich habe mich nicht zu verwirrend ausgedrückt.
echo "Geloescht am %date% - Datei= %Ordner%\%%i" >>"%Ordner%\%loesch%  
"
Vielen Dank für Eure Hilfe.

Gruß Jürgen

Content-ID: 670741

Url: https://administrator.de/forum/batch-for-schleifen-ausgabe-in-datei-umleiten-670741.html

Ausgedruckt am: 20.02.2025 um 19:02 Uhr

Delta9
Delta9 16.01.2025 um 16:50:12 Uhr
Goto Top
Hallo Jürgen,
warum das ganze nicht in Powershell?
Da ist es viel übersichtlicher als Batch mit seinen "Variablen".
151183
Lösung 151183 16.01.2025 aktualisiert um 17:02:25 Uhr
Goto Top
@echo off & setlocal
set "Kopf=%temp%\Kopf.txt"  
>"%Kopf%" (  
echo.
echo ==============================================
echo ----------------------------------------------
echo -  Filme Bereinigung beginnt. -
echo ----------------------------------------------
echo ==============================================
echo.
echo.
echo.
)

for /L %%A in (5,-1,0) do (
	type %Kopf%
	echo Suchvorgang wird gestartet
	echo\
	echo Wartezeit von %%A sekunden laeuft...
	timeout /t 1 >nul
	cls
)

type %Kopf%

set "Ordner=J:\HDD-Test"    
set "endung=*.ts"     
set "Anzahl=4"    
set "loesch=loesch.txt"    

>"%Ordner%\%loesch%" 2>&1 (for /f "skip=%Anzahl% delims=" %%i in ('dir /b /a-d /o-d "%Ordner%\%endung%"') do (  
	echo "%Ordner%\%%i"  
	echo Geloescht am %date% - Datei= %Ordner%\%%i 
	del "%Ordner%\%%i"  
))
Frisconet
Frisconet 16.01.2025 um 17:01:29 Uhr
Goto Top
Hallo Delta9,
wie würde das denn aussehen?
151183
151183 16.01.2025 aktualisiert um 17:23:44 Uhr
Goto Top
wie würde das denn aussehen?
bsp.
Start-Transcript "J:\HDD-Test\loesch_$(get-date -f yyyyMMdd).txt"  
Get-ChildItem -Path "J:\HDD-Test" -File -Filter *.ts | sort LastWriteTime -Descending | select -Skip 4 | remove-item -force -verbose  
Stop-Transcript
Frisconet
Frisconet 16.01.2025 um 18:31:43 Uhr
Goto Top
Hallo gastric,

vielen lieben Dank für Deine Erklärung. Ich habe die Batch-Version genommen. Das funktioniert super gut.
Vielen Dank noch mal an alle.
Gruß Jürgen
Frisconet
Frisconet 20.01.2025 um 13:15:20 Uhr
Goto Top
Hallo gastric,
jetzt hast Du mir das laufen gezeigt. Jetzt möchte ich noch tanzen lernen!
Ich habe jetzt die Ausgabe in eine .rtf Datei umgeleitet. Das funktioniert super. Jetzt möchte ich noch die Ausgabe in der RTF Datei formatieren. Das funktioniert auch sehr gut. Bis auf die Variable "%%i" die mir die zu löschenden Dateieien ausgibt. Wenn mehr als eine Datei gelöscht werden soll wird mir nur die letzte Datei angezeigt alle weiteren nicht. Ohne Text-Formatierungen werden mir alle zu löschenden Dateien angezeigt. Kannst Du erkennen was ich da falsch mache?
Vielen lieben Dank für eine Hilfe.
Hier der gesamte Code meiner Batch-Datei
@echo off & setlocal
set "Kopf=%temp%\Kopf.txt"    
>"%Kopf%" (    
echo.
echo ==============================================
echo ----------------------------------------------
echo -  Filme Bereinigung beginnt. -
echo ----------------------------------------------
echo ==============================================
echo.
echo.
echo.
)

for /L %%A in (5,-1,0) do (
	type %Kopf%
	echo Suchvorgang wird gestartet
	echo\
	echo Wartezeit von %%A sekunden laeuft...
	timeout /t 1 >nul
	cls
)

type %Kopf%

set "Ordner=J:\HDD-Test"  
set "Ordner0=J:\\HDD-Test\"     
set "endung=*.ts"       
set "Anzahl=2"  
set "loesch=loesch.rtf"      


echo Das Verzeichnis %Ordner% wird ausgelesen...
C:\BAT-Dateien\wait32.exe 3

>"%Ordner%\%loesch%" 2>&1 (for /f "skip=%Anzahl% delims=" %%i in ('dir /b /a-d /o-d "%Ordner%\%endung%"') do (   

echo {\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
echo {\*\generator Riched20 10.0.19041}\viewkind4\uc1
echo \pard\sa200\sl276\slmult1\fs40 Geloescht am %date% um %time:~0,5%\fs22\par
echo \pard\sa200\sl276\slmult1\fs40 Datei= \b\fs40 %%i \b0\fs22\par 
echo \pard\sa200\sl276\slmult1\fs40 Das Verzeichnis \b\fs50 %Ordner0%  \b0\fs40 ist bereinigt worden!\fs22\par}}

del "%Ordner%\%%i"    
))

C:\BAT-Dateien\wait32.exe 5
echo Das Vereichnis %Ordner% wurde bereinigt!
C:\BAT-Dateien\wait32.exe 5
REM start "WORD" "%Ordner%\HDD-loeschen.docx"  
start "WORD" "%Ordner%\loesch.rtf"  
C:\BAT-Dateien\wait32.exe 2

cls
151183
151183 20.01.2025 um 13:19:20 Uhr
Goto Top
Sonderzeichen müssen escaped werden ...
https://www.robvanderwoude.com/escapechars.php
Frisconet
Frisconet 20.01.2025 um 14:07:40 Uhr
Goto Top
Welche Sonderzeichen? Gib mir einen Tip. Danke
151183
151183 20.01.2025 aktualisiert um 14:24:29 Uhr
Goto Top
Zitat von @Frisconet:

Welche Sonderzeichen? Gib mir einen Tip. Danke
Link lesen und lernen da steht doch welche es sind , wenn ich es dir verrate lernst du nix nachhaltig 😉.
By the way Batch und RTF sind sowas von 80er 🤪. Sattel besser gleich auf Powershell und HTML um statt so einen Quark zu fabrizieren ...
Frisconet
Frisconet 20.01.2025 um 17:20:52 Uhr
Goto Top
Link gelesen und nichts gefunden.
Es kann ja nur um diese Zeile gehen. Her sind zwei %%i Prozent Zeichen.
echo \pard\sa200\sl276\slmult1\fs40 Datei= \b\fs40 %%i \b0\fs22\par 
Egal wie ich es mache ich bekomme nur die letzte Datei angezeigt. In meinem Fall sollten es aber 3 Dateien sein.
P.S.
Du solltest nicht zu diesen Sachen "so einen Quark zu fabrizieren ..." sagen. Ich habe Dich höflich um Hilfe gebeten. Du musst nicht antworten!
Frisconet
Frisconet 22.01.2025 um 14:27:37 Uhr
Goto Top
Hallo, jetzt habe ich die Lösung. Das escapen von Sonderzeichen war es nicht.
Vielen Dank für die Hilfe.
Ich hätte da noch ein kleines Problem. Wenn keine Dateien zu löschen ist und die Variable "%%i" leer ist wird nichts in die RTF-Datei geschrieben. Die bleibt völlig leer. Ich würde es aber besser finden wenn ein kleiner Hinweis in die RTF-Datei geschrieben würde. z.B. "Am Datum um Uhrzeit ist keine Datei gelöscht worden." Ich habe versucht das mit einer IF abfrage zu prüfen aber das gelang mir leider nicht.
Also wenn einer eine Idee hat würde ich mich sehr freuen. Vielen lieben Dank
Gruß Jürgen.
@echo off & setlocal enabledelayedexpansion
set "Kopf=%temp%\Kopf.txt"    
>"%Kopf%" (    
echo.
echo ==============================================
echo ----------------------------------------------
echo -  Filme Bereinigung beginnt. -
echo ----------------------------------------------
echo ==============================================
echo.
echo.
echo.
)

for /L %%A in (5,-1,0) do (
	type %Kopf%
	echo Suchvorgang wird gestartet
	echo\
	echo Wartezeit von %%A sekunden laeuft...
	timeout /t 1 >nul
	cls
)

type %Kopf%

set "Ordner=J:\HDD-Test"  
set "Ordner0=J:\\HDD-Test\"     
set "endung=*.ts"       
set "Anzahl=3"      
set "loesch=loesch.rtf"      
set "cntr=0"  
for /f "skip=%Anzahl% delims=" %%i in ('dir /b /a-d /o-d "%Ordner%\%endung%"') do (  

REM del "%Ordner%\%%i"  

set /a "cntr+=1"    
set "\pard\sa200\sl276\slmult1\f1\cb2\cf2\b\fs30 Datei-!cntr! = \f1\cb6\cf6 %%i \b0\par"   
)
echo Das Verzeichnis %Ordner% wurde ausgelesen...
C:\BAT-Dateien\wait32.exe 5
echo Die Datei/Dateien werden zum loeschen vorgemerkt...
C:\BAT-Dateien\wait32.exe 5

>"%Ordner%\%loesch%" 2>&1 (for /l %%i in (1,1,%cntr%) do (  
echo {\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
echo {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}
echo \pard\sa200\sl276\slmult1\fs30\b Geloescht am %date% um %time:~0,5% \b0\par
set \pard\sa200\sl276\slmult1\f1\cb2\cf2\b\fs30 Datei-\f1\cb6\cf6%%i\b0\par
echo \pard\sa200\sl276\slmult1\f1\cb1\cf1\fs30 Das Verzeichnis \f1\cb2\cf2\b %Ordner0%  \b0\f1\cb1\cf1 ist bereinigt worden.\par}
)) 

echo Das Verzeichnis %Ordner% wurde bereinigt!
C:\BAT-Dateien\wait32.exe 3
start "WORD" "%Ordner%\loesch.rtf"  
C:\BAT-Dateien\wait32.exe 2

cls