rejael
Goto Top

Dateien nach Datum sortieren

Dateien nach Datum sortieren und dann kopieren
[Edit Biber]: Ist mit vereinten Kräften fast schon eine Musterlösung geworden [/Edit]

Hallo alle zusammen,

ich habe mal eine Bitte an "Batcher" unter euch:

ich möchte aus einem Ordner die letzten 2 dateien in ein anderen Ordner kopieren, wobei dateien alle errorxxxxxx.txt heißen.

Bis jetzt funktioniert es so:

@echo off
:: -------erstelle ordner
mkdir "H:\My Databases\test_xcopy\%date%"

:: ------- hier soll eine Sortierung im aktuellem Ordner erfolgen und dann die letzten 2 Dateien kopiert werden

??????

:: ------- kopiere Datei
xcopy H:\testxcopy\robot.txt "H:\My Databases\test_xcopy\%date%" /D /Y

:: ------- kopiere Datei (davon die letzten 2???)
xcopy H:\testxcopy\Kensingtonerr*.txt "H:\My Databases\test_xcopy\%date%" /D /Y

close

wenn jemand eine Idee hat, dann antwortet bitte.
PS: Können die Dateien auch noch vor dem kopieren gepackt werden??

Ciao René

Content-Key: 50240

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

Printed on: April 25, 2024 at 01:04 o'clock

Member: miniversum
miniversum Jan 30, 2007 at 15:13:36 (UTC)
Goto Top
@echo off
setlocal enabledelayedexpansion
set Anzahl=2

set zahl=1
FOR /F "delims=" %%i in ('dir /b /O-D') do (
if !zahl! leq %anzahl% ECHO copy "%%i"
set /a zahl=!zahl!+1
)

Unter Anzahl gibst du eben deine zwei oder wieviele du kopiert haben willst an.
Hier siehst du nur welche Kopiert weren. Wilslt du das es ausgeführt wird must du das ECHO entfernen.

miniversum
Member: Biber
Biber Jan 30, 2007 at 17:01:25 (UTC)
Goto Top
...oder, wenn Du es ohne Delayedexpansion machen willst:
:: -----------snipp ProcessLast.bat [Parameter1: Anzahl]
@echo off & setlocal
REM Kein Parameter angegeben? Dann "1" als Anzahl annehmen  
If [%1]== %0 1
if not exist "H:\My Databases\test_xcopy\%date%" mkdir "H:\My Databases\test_xcopy\%date%"  
For /L %%i in (1,1,%1) do call :doSomething
goto :eof

:doSomething
for /f %i in ('dir /b /o:d error*.txt') do @Set "ThisErrorFile=%%i"  
REM Die neueste Errorxxxxx.txt steht in der Variablen %ThisErrorfile%
REM und nun COPY, MOVE, RENAME oder 7z oder Rar mir diese Datei... Beispiel MOVE:
Move "%ThisErrorFile%  "H:\My Databases\test_xcopy\%date%\*.*"  
goto :eof

[ungetestete Skizze]

Zum Thema Packen, Zippen, Raren findest Du ein paar Beispiel-Beiträge im Bereich Batch & Shell.

HTH
Biber
Member: rejael
rejael Jan 31, 2007 at 20:10:19 (UTC)
Goto Top
Super Danke für die schnelle Antwort, nur leider bin ich nicht der Experte in Sachen Programmierung!
Wo müsste denn dann dein Code eingesetzt werden?

@echo off
:: -------erstelle ordner
mkdir "H:\My Databases\test_xcopy\%date%"
xcopy H:\testxcopy\robot.txt "H:\My Databases\test_xcopy\%date%" /D /Y

setlocal enabledelayedexpansion
set Anzahl=2

set zahl=2
FOR /F "delims=" %%i in ('dir /b /O-D') do (
if !zahl! leq %anzahl% ECHO copy "%%i"
set /a zahl=!zahl!+1
)

xcopy H:\testxcopy\Kensingtonerr*.txt "H:\My Databases\test_xcopy\%date%" /D /Y

close

So wird der Ordner erstellt und die robot.txt kopiert, aber die
Oder muss dann der ganze Code anders geschrieben werden???

Danke euch
Member: miniversum
miniversum Jan 31, 2007 at 20:24:30 (UTC)
Goto Top
@echo off
:: -------erstelle ordner
mkdir "H:\My Databases\test_xcopy\%date%"

:: ------- hier soll eine Sortierung im aktuellem Ordner erfolgen und dann die letzten 2 Dateien kopiert werden

setlocal enabledelayedexpansion
set Anzahl=2

set zahl=1
FOR /F "delims=" %%i in ('dir /b /O-D') do (
if !zahl! leq %anzahl% ECHO copy "%%i" "Z:\iehl"
set /a zahl=!zahl!+1
)

setlocal disabledelayedexpansion

:: ------- kopiere Datei
xcopy H:\testxcopy\robot.txt "H:\My Databases\test_xcopy\%date%" /D /Y

:: ------- kopiere Datei (davon die letzten 2???)
xcopy H:\testxcopy\Kensingtonerr*.txt "H:\My Databases\test_xcopy\%date%" /D /Y

close


Das dickgedruckte "Z:\iehl" must du halt anpassen WOHIN die Dateien kopiert werden sollen.
Das ECHO mußt du entfernen das die Dateien wirklich kopiert werden und nicht nur angezeigt.
Das setlocal disabledelayedexpansion ist wahlweiße. kansnt du auch weglassen.

miniversum
Member: rejael
rejael Jan 31, 2007 at 20:41:44 (UTC)
Goto Top
Also wenn ich es so anpasse, dann wird die robot.txt und die ganzen Kingstonerrorxxx.txt kopiert, aber ich will ja nur die 2 aktuellsten Kingstonerrorxxx.txt dateien kopiert haben?

@echo off
:: -------erstelle ordner
mkdir "H:\My Databases\test_xcopy\%date%"

:: ------- hier soll eine Sortierung im aktuellem Ordner erfolgen und dann die letzten 2 Dateien kopiert werden

setlocal enabledelayedexpansion
set Anzahl=1

set zahl=1
FOR /F "delims=" %%i in ('dir /b /O-D') do (
if !zahl! leq %anzahl% copy "%%i" "H:\My Databases\test_xcopy\%date%"
set /a zahl=!zahl!+1
)

::---setlocal disabledelayedexpansion

:: ------- kopiere Datei
xcopy H:\testxcopy\robot.txt "H:\My Databases\test_xcopy\%date%" /D /Y

:: ------- kopiere Datei Kensingtonerr*.txt (davon die letzten 2???)
xcopy H:\testxcopy\Kensingtonerr*.txt "H:\My Databases\test_xcopy\%date%" /D /Y

close

Danke rejael
Member: rejael
rejael Jan 31, 2007 at 20:41:55 (UTC)
Goto Top
Also wenn ich es so anpasse, dann wird die robot.txt und die ganzen Kingstonerrorxxx.txt kopiert, aber ich will ja nur die 2 aktuellsten Kingstonerrorxxx.txt dateien kopiert haben?

@echo off
:: -------erstelle ordner
mkdir "H:\My Databases\test_xcopy\%date%"

:: ------- hier soll eine Sortierung im aktuellem Ordner erfolgen und dann die letzten 2 Dateien kopiert werden

setlocal enabledelayedexpansion
set Anzahl=1

set zahl=1
FOR /F "delims=" %%i in ('dir /b /O-D') do (
if !zahl! leq %anzahl% copy "%%i" "H:\My Databases\test_xcopy\%date%"
set /a zahl=!zahl!+1
)

::---setlocal disabledelayedexpansion

:: ------- kopiere Datei
xcopy H:\testxcopy\robot.txt "H:\My Databases\test_xcopy\%date%" /D /Y

:: ------- kopiere Datei Kensingtonerr*.txt (davon die letzten 2???)
xcopy H:\testxcopy\Kensingtonerr*.txt "H:\My Databases\test_xcopy\%date%" /D /Y

close

Danke rejael
Member: Biber
Biber Jan 31, 2007 at 21:23:59 (UTC)
Goto Top
Moin rejael,

hier auch noch mal meine [ungetestete] Variante im Stück:

:.------snipp CopyLast.bat 
@echo off & setlocal
:: Was variabel bleiben sollte, ist die Anzahl --->Parameter 1; Default 1
IF [%1]== %0 1
:: ------- hier soll eine Sortierung im aktuellem Ordner erfolgen und dann die letzten 2 Dateien kopiert werden
::Hmmm, die Vorgabe "aktueller Ordner" ist gefährlich.. geh lieber von "immer ein bestimmter Ordner aus. 
Set "QuellOrdner=H:\testxcopy"  
:: und den ZielOrdner unterstellen wir auch mal als fest
Set "ZielOrdner=H:\My Databases\test_xcopy"  
If not exist "%QuellOrdner%" (  
    echo QuellOrdner nicht vorhanden
    Pause
    Goto :eof
)    
PushD "%QuellOrdner%"  
For /L %%i in (1,1,%1) do call :doSomething
If exist "%Zielordner%\%date%" copy "%QuellOrdner%\robot.txt"  "%ZielOrdner\%date%\*.*"   
PopD
goto :eof

:doSomething
for /f %%i in ('dir /b /o:d Kensingtonerr*.txt') do @Set "ThisErrorFile=%%i"  
REM Die neueste KensingtonErrorxxxxx.txt steht in der Variablen %ThisErrorfile%
REM und nun COPY, MOVE, RENAME oder 7z oder Rar mir diese Datei... Beispiel COPY:
::erst jetzt das...%date%-Verzeichnis anlegen
If not exist "%Zielordner\%date%" md "%Zielordner\%date%"  
Copy "%ThisErrorFile%  "%Zielordner\%date%\*.*"  
goto :eof

Gruß
Biber
Member: rejael
rejael Jan 31, 2007 at 21:34:13 (UTC)
Goto Top
ok klappt leider nicht, es wird kein ordner angelegt und auch nichts kopiert???
Hast du noch idee?

Danke im voraus
Member: Biber
Biber Jan 31, 2007 at 21:48:19 (UTC)
Goto Top
Probier jetzt noch mal..

Habe im Source ein "for /f %i in.." durch "for /f %%i in.." ersetzt.

[Aber immer noch nicht getestet.. unterhalte mich grad in einem anderen Thread mit darkbrain85, sorry]

Gruß
Biber
Member: rejael
rejael Jan 31, 2007 at 21:58:50 (UTC)
Goto Top
Na ja geht immer noch nicht, vielleicht kannst du es ja einmal in einer ruhigen Minute testen?
Bis später mal
Member: bastla
bastla Feb 01, 2007 at 14:01:42 (UTC)
Goto Top
Hallo rejael!

Ich hatte gerade ein paar ruhige Minuten ...

@Biber
Ich hab' noch einige % und ein " hineingeworfen, aber in der obigen Form sollte ein "move" stattfinden (da immer nur die aktuellste Datei gesucht wird).

Mit einigen Fundstücken aus Deiner Trickkiste (ja, die war schon wieder offen face-wink), käme bei mir diese Variante heraus:
::------snipp CopyLast.bat 
@echo off & setlocal
:: Was variabel bleiben sollte, ist die Anzahl --->Parameter 1; Default 1
IF [%1]== %0 1
:: ------- hier soll eine Sortierung im aktuellem Ordner erfolgen und dann die letzten 2 Dateien kopiert werden
::Hmmm, die Vorgabe "aktueller Ordner" ist gefährlich.. geh lieber von "immer ein bestimmter Ordner aus. 
Set "QuellOrdner=Z:\testxcopy"  
:: und den ZielOrdner unterstellen wir auch mal als fest
Set "ZielOrdner=Z:\My Databases\test_xcopy"  
If not exist "%QuellOrdner%" (  
    echo QuellOrdner nicht vorhanden
    Pause
    Goto :eof
)    
PushD "%QuellOrdner%"  
For /L %%i in (1,1,%1) do call :doSomething %%i
If exist "%Zielordner%\%date%" copy /y "%QuellOrdner%\robot.txt" "%ZielOrdner%\%date%\*.*" >nul  
PopD
goto :eof

:doSomething
set /a Nr=%1 - 1
set ThisErrorFile=
if %Nr%==0 (
	for /f "delims=" %%i in ('dir /b /o:-d Kensingtonerr*.txt') do if not defined ThisErrorFile @Set "ThisErrorFile=%%i"  
	) else (
	for /f "skip=%Nr% delims=" %%i in ('dir /b /o:-d Kensingtonerr*.txt') do if not defined ThisErrorFile @Set "ThisErrorFile=%%i"  
)	
REM Die %%L. neueste KensingtonErrorxxxxx.txt steht in der Variablen %ThisErrorfile%
REM und nun COPY, RENAME oder 7z oder Rar mir diese Datei... Beispiel COPY:
::erst jetzt das...%date%-Verzeichnis anlegen
If not exist "%Zielordner%\%date%" md "%Zielordner%\%date%"  
Copy "%ThisErrorFile%"  "%Zielordner%\%date%\*.*" > nul  
goto :eof

Grüße
bastla

[Edit] Zur Sicherheit noch "delims=" eingebaut - falls die "KensingtonErrorxxxxx.txt" eine "KensingtonError x xx.txt" wäre ... [/Edit]
Member: Biber
Biber Feb 01, 2007 at 14:11:56 (UTC)
Goto Top
Thx, bastla,

ist mir grad sehr Recht, dass Du da mal drüberguckst...
Ich kasper' hier grad mit "produktiven Problemen" und vor allem mit unproduktiven Nasen rum..

Hoffentlich kommt bald der Vi$ta-Rollout, damit endlich diese Computerproblem aufhören... face-wink

Gruss
Biber
Member: rejael
rejael Feb 01, 2007 at 19:30:14 (UTC)
Goto Top
Hallo Bastla,

es hat geklappt!!!!! Danke
Nur eins funktioniert nicht recht und zwar die Variable setzten für die Anzahl:

::------snipp CopyLast.bat
@echo off & setlocal
:: Was variabel bleiben sollte, ist die Anzahl --->Parameter 2; Default 1
IF [%1]== %0 2
:: ------- hier soll eine Sortierung im aktuellem Ordner erfolgen und dann die letzten 2 Dateien

ansonsten super, ich danke dir wie verrückt.
Wegen des zippens der dateien mache ich mich später mla schlau...

rejael
Member: bastla
bastla Feb 01, 2007 at 20:12:47 (UTC)
Goto Top
Hallo rejael!

Nur eins funktioniert nicht recht und zwar die Variable setzten für die Anzahl:
:: ------- hier soll eine Sortierung im aktuellem Ordner erfolgen und dann die letzten 2 Dateien
Was genau meinst Du mit "funktioniert nicht recht"? Der Batch ist so angelegt, dass die Anzahl beim Aufruf übergeben wird, so dass Du leicht von 2 auf 4 oder 7 Dateien umstellen kannst, daher starten mit
CopyLast 2
(wenn Du unter "CopyLast.bat" gespeichert hast).

Zu
Anzahl --->Parameter -2 1; Default 1
Parameter 1 meint hier, wie oben gezeigt, dass als erster (und einziger) Parameter beim Aufruf die Anzahl der zu kopierenden Dateien übergeben werden soll - wurde dies nicht gemacht, stellt diese Zeile
IF [%1]== %0 2
sicher, dass ein Defaultwert verwendet wird (von Dir jetzt auf 2 geändert). Zur Sicherheit solltest Du aber, wie oben gezeigt, die Anzahl beim Aufruf mitgeben.

ansonsten super, ich danke dir wie verrückt.
Freut mich, mein Anteil dabei ist aber vergleichsweise gering gewesen, daher: fwd 2 Biber ...

Wegen des zippens der dateien mache ich mich später mla schlau...
Vielleicht als Hinweis: Von 7-zip gibt es eine Kommandozeilenversion, zu finden hier, die Du verwenden könntest. Aus dem "copy"-Befehl würde dann etwas in der Art (genaue Syntax müsstest Du Dir ansehen):
C:\Utils\7za.exe a -tzip "%Zielordner%\%date:.=-%.zip" "%ThisErrorFile%"  

Grüße
bastla

[Edit] Überflüssige Pfaderweiterung entfernt [/Edit]