aktuellste Datei auslesen und in andere Datei schreiben und mit Datum versehen
Hallo!
Nachdem folgendes Skript von bastla und Biber funktioniert hat gibt es doch noch eine Funktion, die ich leider vergessen hatte:
@echo off & setlocal
set ZielOrdner=C:\Test
set BackupOrdner=C:\Test\Backup
Set "String=%2"
if [%2]== set "String=0000080"
Set Nr=
for /f %%i in ('dir "%BackupOrdner%" /b /o-n') do if not defined Nr set /a Nr=%%~ni
set /a Nr +=1000000001
set ZielDatei=%Nr:~-9%.txt
for /f %%i in ('findstr "%String%" "%1"') do echo %%i %date% %time:~0,5% Uhr>>"%ZielOrdner%\%ZielDatei%"
copy "%ZielOrdner%\%ZielDatei%" "%BackupOrdner%\%ZielDatei%"
Im Quellverzeichnis liegen mehrere Dateien mit fortlaufendem Namen (z.B. TEST0001.abc, TEST0002.abc, usw.).
Nun möchte ich mit dem Skript immer nur die aktuellste Datei auslesen.
Wie kann man das bewerkstelligen?
Gruß,
HoyGroDo
Nachdem folgendes Skript von bastla und Biber funktioniert hat gibt es doch noch eine Funktion, die ich leider vergessen hatte:
@echo off & setlocal
set ZielOrdner=C:\Test
set BackupOrdner=C:\Test\Backup
Set "String=%2"
if [%2]== set "String=0000080"
Set Nr=
for /f %%i in ('dir "%BackupOrdner%" /b /o-n') do if not defined Nr set /a Nr=%%~ni
set /a Nr +=1000000001
set ZielDatei=%Nr:~-9%.txt
for /f %%i in ('findstr "%String%" "%1"') do echo %%i %date% %time:~0,5% Uhr>>"%ZielOrdner%\%ZielDatei%"
copy "%ZielOrdner%\%ZielDatei%" "%BackupOrdner%\%ZielDatei%"
Im Quellverzeichnis liegen mehrere Dateien mit fortlaufendem Namen (z.B. TEST0001.abc, TEST0002.abc, usw.).
Nun möchte ich mit dem Skript immer nur die aktuellste Datei auslesen.
Wie kann man das bewerkstelligen?
Gruß,
HoyGroDo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 53200
Url: https://administrator.de/contentid/53200
Ausgedruckt am: 23.11.2024 um 07:11 Uhr
16 Kommentare
Neuester Kommentar
Moin HoyGroDo,
im Prinzip analog zu oben:
In beiden Fällen würde die "aktuelle" Datei Testnnnn.abc ("aktuell" im Sinne von höchste Lfdnr) ermittelt werden in %HighFile%.
Gruss
Biber
im Prinzip analog zu oben:
for /f %%i in ('dir "%QuellOrdner%\Test????.abc" /b /on ') do set HighFile=%%~nxi
-oder
for /f %%i in ('dir "%QuellOrdner%\Test????.abc" /b /o-n ') do if not defined Highfile set HighFile=%%~nxi
-oder
for /f %%i in ('dir "%QuellOrdner%\Test????.abc" /b /o-n ') do if not defined Highfile set HighFile=%%~nxi
In beiden Fällen würde die "aktuelle" Datei Testnnnn.abc ("aktuell" im Sinne von höchste Lfdnr) ermittelt werden in %HighFile%.
Gruss
Biber
Warum erscheint der RESTDERZEILEINDERQUELLDATEI anstatt der gesuchten Nummer - z.B. 00000080123456 ?
Der Unterschied wird sein, ob Du als Parameter für den/die Dateinamen Wildcards übergibst oder nicht.
Teste es am CMD-Prompt:
Wenn Du eingibst....
findstr "0000080" c:\quelle\test*.abc
dann kommt irgendetwas zurück mit den Dateinamen + Doppelpunkt am Anfang.c:\quelle\test0001.abc:0000080127 blablausw.
c:\quelle\test0002.abc:0000080129 blablausw.
c:\quelle\test0002.abc:0000080129 blablausw.
Wenn Du eingibst...
findstr "0000080" c:\quelle\test0001.abc
...kommt zurück:0000080127 blablausw.
Im zweiten Fall (der scheint jetzt bei Deinem zweiten Test gegeben zu sein) ist das Token1 ="0000080127" und dummerweise wird erst das Token2="blablausw." angezeigt.
Vorschlag zum Workaround:
Nimm immer eine Wildcard-Dateimaske, indem Du ein "?" an das Ende des Dateinamens hängst.
for /f "<b>tokens=3</b> delims=: " %%i in ('findstr "%String%" <b>"%1?"</b>') do ....
Das dritte Token sollte der "0000080xxx" entsprechen.
Gruss
Biber
Na ja,
das liegt daran, dass wir jetzt erstmal die Puzzleteile, die wir im Lauf der Verfeinerung in die Hand genommen haben, erstmal sinnvoll zusammensetzen müssen.
Die -ich verweise wieder ganz oben auf den Thread-Beginn- "aktuelle" Testxxxx.abc-Datei wird zwar in der Variablen %HighFile% ermittelt, aber nie verwertet.
Der Parameter %1 (wo Pfad/Dateimaske drinstehen sollten - ursprünglicher Plan!) wird bei der Ermittlung von %HighFile% vollkommen ignoriert...
[Weiter hab ich noch noch nicht geschaut...]
Vorschlag: Ich mach mal Mittach eben und Du sortierst inzwischen oder bis morgen mal "den Plan", den Ablauf des Bätschelchens.
Wenn der klar ist, dann bekommen wir hier im Forum das Handwerkliche schnell hin.
Gruss
Biber
das liegt daran, dass wir jetzt erstmal die Puzzleteile, die wir im Lauf der Verfeinerung in die Hand genommen haben, erstmal sinnvoll zusammensetzen müssen.
Die -ich verweise wieder ganz oben auf den Thread-Beginn- "aktuelle" Testxxxx.abc-Datei wird zwar in der Variablen %HighFile% ermittelt, aber nie verwertet.
Der Parameter %1 (wo Pfad/Dateimaske drinstehen sollten - ursprünglicher Plan!) wird bei der Ermittlung von %HighFile% vollkommen ignoriert...
[Weiter hab ich noch noch nicht geschaut...]
Vorschlag: Ich mach mal Mittach eben und Du sortierst inzwischen oder bis morgen mal "den Plan", den Ablauf des Bätschelchens.
Wenn der klar ist, dann bekommen wir hier im Forum das Handwerkliche schnell hin.
Gruss
Biber
Moin HoyGroDo,
nur zur Klärung für alle, die gleich bei HoyGroDo-Quest III mitspielen wollen:
---> diese beiden Vorgaben gleichzeitig einhalten bedeutet dann:
die Wildcards geben die Gesamtheit der Quelldateien an, von denen nur die aktuelle (die mit der höchsten LfdNr) berücksichtigt werden soll.
Gruss
Biber
nur zur Klärung für alle, die gleich bei HoyGroDo-Quest III mitspielen wollen:
der Aufruf der Batchdatei muss mit Wildcard möglich sein
mehrere Quelldateien, von denen immer nur die aktuellste bearbeitet werden
mehrere Quelldateien, von denen immer nur die aktuellste bearbeitet werden
---> diese beiden Vorgaben gleichzeitig einhalten bedeutet dann:
die Wildcards geben die Gesamtheit der Quelldateien an, von denen nur die aktuelle (die mit der höchsten LfdNr) berücksichtigt werden soll.
Gruss
Biber
So,
ich versuche es mal kurz zu sortieren...
Soweit mein Vorschlag zur Umsetzung.
Die Mimik mit Findstr/Wildcards/Tokens=3 ist jetzt wieder obsolet, da ja immer nur eine Datei ("%highFile%") durchsucht wird.
Dennoch : ungetestete Skizze!
Gruss
Biber
ich versuche es mal kurz zu sortieren...
::-------------Bearbeite3.bat
:: Parameter1: Quelldatei(en) ggf mit Laufwerk und Pfad ---Beispiel c:\Quelle\Test*.abc
:: Parameter2: Suchstring z.B "000080" [Default: "0000080"]
@echo off & setlocal
REM ====ab hier Pfade anpassen
set "ZielOrdner=C:\Test"
set "BackupOrdner=C:\Test\Backup"
REM ====bis hier Pfade anpassen
Set "String=%2"
if [%2]== set "String=0000080"
Set Nr=
REM Aus den Dateien (oder auch einer einzigen Datei), die als Parameter1 übergeben wurden, die HÖCHSTE ermitteln
for /f %%i in ('dir "%~1" /b /o-n ') do if not defined Highfile set "HighFile=%%~dpnxi"
REM nächste "freie" LfdNummer im %BackupOrdner ermitteln [unterstellt: nur Dateien der Form "0nnnnnnnn.txt" vorhanden.]
for /f %%i in ('dir "%BackupOrdner%\0*.txt" /b /o-n') do if not defined Nr set /a Nr=%%~ni
set /a Nr +=1000000001
set ZielDatei=%Nr:~-9%.txt
for /f %%i in ('findstr "%String%" "%HighFile%"') do (
echo %%i %date% %time:~0,5% Uhr>>"%ZielOrdner%\%ZielDatei%"
)
copy "%ZielOrdner%\%ZielDatei%" "%BackupOrdner%\%ZielDatei%"
:: ---Nur zum Testen:
Type "%ZielOrdner%\%ZielDatei%" & pause
Soweit mein Vorschlag zur Umsetzung.
Die Mimik mit Findstr/Wildcards/Tokens=3 ist jetzt wieder obsolet, da ja immer nur eine Datei ("%highFile%") durchsucht wird.
Dennoch : ungetestete Skizze!
Gruss
Biber
Hallo HoyGroDo!
Um doch auch noch mitzuwirken ...
Ergänze die Zeile
und ändere den "for /f"-Teil für die Ausgabe auf
Grüße
bastla
Um doch auch noch mitzuwirken ...
Ergänze die Zeile
@echo off & setlocal <b>enabledelayedexpansion</b>
for /f %%i in ('findstr "%String%" "%HighFile%"') do (
set Nummer=%%i
echo !Nummer:~2! %date:~3% %time:~0,5% Uhr>>"%ZielOrdner%\%ZielDatei%"
)
Grüße
bastla