mooowe
Goto Top

Batch Neuste Datei kopieren und Namen der Textdatei ändern

Hallo an alle,
ich bin neu hier und habe direkt eine Frage. Beschäftigte mich seit kurzem mit shell/batch und habe folgendes Problem. Aus Code-Schnipseln habe ich versucht mir eine Datei zu bauen, die Text Dateien kopieren soll, die einen bestimmten Namen haben. Es gibt jedoch weitere Dateien mit ähnlichem Namen in diesem Ordner. Jetzt möchte ich ein Batch haben der die neuste Datei mit diesem "Ungefähren-Namen" kopiert.

Hier der Code den ich mir zusammen gebaut / gesucht habe es aber auch so noch nicht funktioniert (kopierfunktion):

@echo off
setlocal
set workdir="C:\Neuer Ordner\"
set files=
dir %workdir% /A-D/B/OG-D>%temp%files.tmp
for /f "tokens=1* delims=" %%i in (%temp%files.tmp) do if not defined files set "files=%%i"
del %temp%files.tmp

echo %files%
xcopy "%files%" "C:\NeuerOrdner\NeuerOrdner\"

pause


Zum Verständnis:

Im Ordner C:\NeuerOrdner\ befinden sich Dateien die folgendermaßen heißen:

DE_999999_Adress_232323
DE_999999_Company_12122

einmal am Tag kommt eine neue DE_999999_Adress_* datei hinzu mit irgendeiner Zahlenkombination am schluss (wird von einem anderen System produziert).

Meine Frage: Wie kann man das Skript so schreiben, dass das Aktuelle File "DE_999999_Adress_" genommen wird.
MEin Versuch oben nimmt nur die aktuellste Datei , was in meinem fall jedoch nicht geht da es auch noch andere Arten von Files gibt die evtl. neuer sind.

Es wäre super wenn ihr mir helfen könnten.

MfG
Mooowe

Content-ID: 189279

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

Ausgedruckt am: 08.11.2024 um 05:11 Uhr

60730
60730 08.08.2012 um 14:42:13 Uhr
Goto Top
moin,

zum einen - kennst du die code Tags hier im Forum?
zum anderen, was macht denn das @echo off?
last but not least was macht diese Zeile?
wobei das nur einer von xxx³ Wegen wäre
for /f "tokens=4" %%a in ('dir DE_999999_Adress_*^|find "%date%"') do type %%a  

Gruß
mooowe
mooowe 08.08.2012 um 14:53:49 Uhr
Goto Top
Nein Kannte ich noch nicht, vielen dank face-smile
@echo = hatte da vorher Textzeilen ausgegeben. kann vernachlässigt werden
60730
60730 08.08.2012 um 15:20:48 Uhr
Goto Top
Zitat von @mooowe:
Nein Kannte ich noch nicht, vielen dank face-smile
und warum nutzt du Sie dann nicht? - wegen der Editierfunktion?
@echo = hatte da vorher Textzeilen ausgegeben. kann vernachlässigt werden
Yupp - sehe ich auch so grade beim Bugfixen ist ein führendes ja zwingend erforderlich.

Ich vernachlässige mal mein Helfersyndrom und leg mich wieder in den Schatten.
Darkprodukt
Darkprodukt 08.08.2012 aktualisiert um 15:31:26 Uhr
Goto Top
Ungetestet so.
@echo off & setlocal
set "workdir=C:\Neuer Ordner\"  
set "files="  
for /f %%i in ('dir /a-s-h-d /o-d /b /s "workdir"^|findstr "DE_999999_Adress_*"') do if not defined files set "files=%%i"  

echo %files%
xcopy "%files%" "C:\NeuerOrdner\NeuerOrdner\"  

pause

Es könnte bei der Version noch zu einem Problem führen, wenn "DE_999999_Adress_*" in einem Ordner/Unterordner Namen auftaucht.

Wenn ja bescheid sagen.

Grüße
Darkprodukt
bastla
bastla 08.08.2012 aktualisiert um 18:38:28 Uhr
Goto Top
@Darkprodukt
Es könnte bei der Version noch zu einem Problem führen, wenn "DE_999999_Adress_*" in einem Ordner/Unterordner Namen auftaucht.
Na, da lässt sich ja etwas dagegen tun (auch ungetestet face-wink):
@echo off & setlocal
set "workdir=C:\Neuer Ordner\"  
set "files="  
for /f %%i in ('dir /a-s-h-d /o-d /b /s "%workdir%\DE_999999_Adress_*"') do if not defined files set "files=%%i"  

echo %files%
xcopy "%files%" "C:\NeuerOrdner\NeuerOrdner\"  

pause
Noch einfacher wäre übrigens als Zeile 4 ([Edit] wenn's nur um den einen Ordner gehen sollte und daher ohne "/s" [/Edit]:
for /f %%i in ('dir /a-s-h-d /od /b "%workdir%\DE_999999_Adress_*"') do set "files=%%i"
Grüße
bastla
mooowe
mooowe 08.08.2012 um 15:39:59 Uhr
Goto Top
Funktioniert leider noch gar nicht, ich glaube weil er das File in dem Ordner nicht finden kann.

Gruß
Mooowe
Darkprodukt
Darkprodukt 08.08.2012 aktualisiert um 16:13:48 Uhr
Goto Top
Was heist Fungtioniert garnicht?

-Beendet sich die Konsole ohne jeden Ton?
-Geht es bis zur Pause Zeile am ende?
-Gibts eine echo ausgabe?
-Fungtioniert das Echo, aber das Kopieren nicht?

@bastla
Danke ^^
Aber würde es so nicht auch ordner mit dem Namen "..." durchsuchen ;)

Da muss der Operator /s weg ;)

Und bei der vereinfachten Zeile 4,
würde die älterste Datei als ausgabe erscheinen.

Grüße
Darkprodukt
bastla
bastla 08.08.2012 aktualisiert um 15:59:11 Uhr
Goto Top
@Darkprodukt
Aber würde es so nicht auch ordner mit dem Namen "..." durchsuchen ;)
Es würden %workdir% und dessen Unterordner untersucht werden - wenn nicht gewünscht, dann (wie Du schon angemerkt hast) ohne "/s", aber dafür mit Angabe des Quellordners (da ja dann nur noch ein Dateiname - ohne Pfad - als Ergebnis kommt) ...
Und bei der vereinfachten Zeile 4,
würde die älterste Datei als ausgabe erscheinen.
Ist Dir das "-" aufgefallen (ich meine das, das es da nicht mehr gibt face-wink)?

Grüße
bastla
Darkprodukt
Darkprodukt 08.08.2012 aktualisiert um 16:20:44 Uhr
Goto Top
Ja das ist mir auch gerade aufgefallen ;)

Wuste aber bis jezt nicht das man damit die fungtion umkehrt.

Sehr nützlich das zu wissen.

Grüße
Darkprodukt

So und hier jezt eine Version die fungtioniert.
@echo off & setlocal
set "workdir=C:\Neuer Ordner\"  
for /f "delims=" %%i in ('dir /a-s-h-d /od /b /s "%workdir%\DE_999999_Adress_*"') do set "files=%%i"  

echo %files%
xcopy "%files%" "C:\NeuerOrdner\NeuerOrdner\"  

pause

-Im momment findet es auch ordner die ungefär so heißen "%workdir%\DE_999999_Adress_*\"

Das lässt sich umgehen wenn man die Dateiendung der datein hat.
In dem Fall so:
for /f "delims=" %%i in ('dir /a-s-h-d /od /b /s "%workdir%^|findstr "DE_999999_Adress_*.(DATEIENDUNG)"') do set "files=%%i"  

PS: Die (DATEIENDUNG) mit den Klammern durch die Dateiendung ersetzen. (Der satz ist einfach gut XD )
60730
60730 08.08.2012 aktualisiert um 16:40:08 Uhr
Goto Top
Salve,

Zitat von @Darkprodukt:
So und hier jezt eine Version die fungtioniert.
Bist du ein Fungi Koch?
for /f "delims=" %%i in ('dir /a-s-h-d /od /b /s "%workdir%\DE_999999_Adress_*"') do set  

-Im momment findet es auch ordner die ungefär so heißen "%workdir%\DE_999999_Adress_*\"
for /f "delims=" %%i in ('dir /a-s-h-d /od /b /s "%workdir%^|findstr  

PS: Die (DATEIENDUNG) mit den Klammern durch die Dateiendung ersetzen. (Der satz ist einfach gut XD )

PS² Was bedeutet denn dieser Schalter -d, der da in beiden Zeilen zu finden ist und warum findet dann die erste Zeile Ordner?
Und was macht der €cho offer, wenn seine Datei keine suffix hat?
Testest du unter Fungi OS?
^Fragen über Fragen
pieh-ejdsch
pieh-ejdsch 08.08.2012 aktualisiert um 18:39:08 Uhr
Goto Top
moin,

wenn Du schon mit findstr in der Ausgabe herumfilterst dann dezimiere doch die Ausgabe auf eine Zeile, dezimiere noch die /S Rekursion und somit den Batch auf drei vier Zeilen:
@echo off
pushD "C:\Neuer Ordner\"  
for /f "tokens=1*delims=:" %%h in ('dir /a-s-h-d /o-d /b "DE_999999_Adress_*" ^|findstr /n . ^|findstr /b 1: ') do xcopy "%%i" "C:\NeuerOrdner\NeuerOrdner\"  
popD

Gruß Phil
Darkprodukt
Darkprodukt 08.08.2012 aktualisiert um 23:28:19 Uhr
Goto Top
Zitat von @60730:
PS² Was bedeutet denn dieser Schalter -d, der da in beiden Zeilen zu finden ist und warum findet dann die erste Zeile
Ordner?
Und was macht der €cho offer, wenn seine Datei keine suffix hat?
Testest du unter Fungi OS?
Fragen über Fragen
Und das @echo off schaltet die Befehlszeilen anzeige aus.
So das man im CMD fenster nicht sehen kan das z.b. "move bla\bla.bla ula\ula.bla" geschrieben wurde sondern nur noch: "1 Datei wurde verschoben" Den satz könnte ich jezt noch mit "move bla\bla.bla ula\ula.bla>NUL" unterdrücken.

Der schalter d. Zu finden unter dir /? Ist eine unterfungtion von /o
/O         Gibt die Liste sortiert aus.
Folge       N Name (alphabetisch)           S Größe (kleinere zuerst)
            E Erweiterung (alphabetisch)    D Datum/Zeit (ältere zuerst)
            G Verzeichnisse zuerst          - vorangestellt kehrt die
                                              Reihenfolge um

@phil
Zitat von @pieh-ejdsch:
for /f "tokens=1*delims=:" %%h in ('dir /a-s-h-d /o-d /b /s "DE_999999_Adress_*" ^|findstr /n . ^|findstr /b 1: ') do xcopy "%%i" "C:\NeuerOrdner\NeuerOrdner\"  

Wennschon:
@echo off & setlocal
set "workdir=C:\Neuer Ordner\"  
for /f "delims=" %%i in ('dir /a-s-h /o-d /b /s "%workdir%^|findstr /n "DE_999999_Adress_*."^|findstr /b "1:"') do echo %files% && xcopy "%files%" "C:\NeuerOrdner\NeuerOrdner\"  

pause
;)

Grüße
Darkprodukt
bastla
bastla 08.08.2012 aktualisiert um 18:36:18 Uhr
Goto Top
@Darkprodukt
T-Mos Frage bezog sich eigentlich auf das "-d" in "/a-s-h-d" (und mit "" kennt er sich auch aus face-wink) ...

Grüße
bastla
Darkprodukt
Darkprodukt 08.08.2012, aktualisiert am 14.08.2012 um 12:27:17 Uhr
Goto Top
Ah ok ^^

@mooowe
Mit der Batch solte eigentlich genau das klappen wie gewünscht.
Wenn nicht, bitte ein zu gebrauchendes Feedback danke.

@echo off & setlocal
set "workdir=C:\Neuer Ordner\"  
for /f "delims=" %%i in ('dir /a-s-h-d /o-d /b /s "%workdir%^|findstr /n "DE_999999_Adress_*."^|findstr /b "1:"') do echo %files% && xcopy "%files%" "C:\NeuerOrdner\NeuerOrdner\"  

pause

Grüße
Darkprodukt
mooowe
mooowe 09.08.2012 um 08:28:27 Uhr
Goto Top
Vielen Dank für eure Hilfe,.
Jedoch klappt das kopieren immernoch nicht.

C:\Neuer Ordner\

enthält (aus testzwecken) nur eine Datei die Folgendermaßen heißt:

DE_999999_Adress_2323.txt

Wenn ich das Skript ausführe öffnet sich das CMD-Fenster und schließt sich wieder.

Habe den Quellcode von Darkside benutzt.

Frage nun: Was mache ich falsch und funktioniert es bei euch?

Gruß und Danke
bastla
bastla 09.08.2012 um 09:57:03 Uhr
Goto Top
@Darkprodukt
Hm das -d solte eigentlich nicht rein. War wohl gewohnheit ;)
Falsche Antwort.

Grüße
bastla
60730
60730 09.08.2012 um 11:08:36 Uhr
Goto Top
moin,

schau dir bitte diesen verlinkten @echo off Beitrag an und befolge die Ratschläge.
Und dann ist eine Frage - was passiert denn mit den kopierten Dateien?

Bleiben die im Ziel oder werden die umbenannt?

Was passiert, wenn du den Einzeiler (die erste Antwort) von
for /f "tokens=4" %%a in ('dir DE_999999_Adress_*^|find "%date%"') do type %%a
auf
for /f "tokens=4" %%a in ('dir DE_999999_Adress_*^|find "%date%"') do copy "%%a" ziel\
oder ähnlich umtrimmst?
mooowe
mooowe 09.08.2012 um 13:42:27 Uhr
Goto Top
Das kopieren klappt jetzt beim ersten mal.
Er findet die jüngste Datei und kopiert so rüber, soweit so gut ...
Beim zweiten mal findet er nicht mehr die jüngste Datei (sondern er will die Datei kopieren die er bereits kopiert hat).
Desweiteren sollte er den Namen ab dem * abtrennen und nur diesen Teil kopieren.

Ich hab mal die Sufu benutzt und euch den Quellcode anständig ausgeben, den ich benutzt habe:

@echo off & setlocal
set "workdir=C:\NeuerOrdner\"  
for /f "delims=" %%i in ('dir /a-s-h-d /od /b /s "%workdir%\DE_999999_Adress_*"') do set "files=%%i"  

echo %files%
xcopy "%files%" "C:\NeuerOrdner\NeuerOrdner\"  

pause
bastla
bastla 09.08.2012 aktualisiert um 14:23:30 Uhr
Goto Top
Hallo mooowe!
Beim zweiten mal findet er nicht mehr die jüngste Datei (sondern er will die Datei kopieren die er bereits kopiert hat).
Wenn nicht verschoben, sondern nur kopiert wird, bleibt die jüngste Datei auch die jüngste Datei (bis eine noch jüngere kommt) ...
Desweiteren sollte er den Namen ab dem * abtrennen und nur diesen Teil kopieren.
Meinst Du damit, dass die kopierte Datei dann "DE_999999_Adress" heißen soll?

Wenn ja, dann etwa so:
@echo off & setlocal
set "workdir=C:\Neuer Ordner"  
set "file="  
for /f %%i in ('dir /a-s-h-d /od /b "%workdir%\DE_999999_Adress_*"') do set "file=%%i"  
if not defined file echo Keine Datei gefunden! & goto :eof
for /f "tokens=1-3 delims=_" %%a in ("%file%") do copy "%workdir%\%file%" "%workdir%\NeuerOrdner\%%a_%%b_%%c">nul  
wobei natürlich die vorher kopierte Datei überschrieben wird (die heißt ja auch schon "DE_999999_Adress") ...

Grüße
bastla
mooowe
mooowe 09.08.2012 um 14:29:53 Uhr
Goto Top
Habe nur noch die Dateiendung in

 for /f "tokens=1-3 delims=_" %%a in ("%file%") do copy "%workdir%\%file%" "%workdir%\NeuerOrdner\%%a_%%b_%%c.txt">nul   

eingefügt, dann funktioniert es einwandfrei!


Vielen Dank für Eure gemeinsame Hilfe face-smile
pieh-ejdsch
pieh-ejdsch 09.08.2012 um 18:54:32 Uhr
Goto Top
hallo mooowe,

schön das Du die Umbenennung (wenn auch einen Tag später) zum eigentlichen Lösen vom Beitragtitel genannt hast.

Damit der Beitrag auch als gelöst gilt - Markierst Du ihn bitte auch so.
Danke

Gruß Phil
mooowe
mooowe 10.08.2012 um 11:33:53 Uhr
Goto Top
Hallo an alle nochmal,
habe versucht die Verzeichnisse durch Variablen zu ersetzen, was mir leider nicht ganz gelungen ist:

set "infolder=C:\NeuerOrdner\"  
set "outfolder="C:\NeuerOrdner\NeuerOrdner\"   

                            
@echo off & setlocal
set "file="  
for /f %%i in ('dir /a-s-h-d /od /b "%infolder%\DE_999999_Adress_*"') do set "file=%%i"  
if not defined file echo Keine Datei gefunden! & goto :eof
for /f "tokens=1-3 delims=_" %%a in ("%file%") do copy "%infolder%\%file%" "%outfolder%\%%a_%%b_%%c.txt">nul  

pause

Vielen Dank schonmal
60730
60730 10.08.2012 aktualisiert um 12:12:39 Uhr
Goto Top
moin,

Vielen Dank schonmal..

Kennst du den alten Kneipenspruch "auf einem Bein kann man nicht stehen?"

Kennst du die päärchenbildung?

  • wieviele " sind in der Zeile set "outfolder="C:\NeuerOrdner\NeuerOrdner\"
  • warum steht in deiner geänderten und nicht laufenden batch ein @echo off?

PS: genau deswegen hab ich mir erlaubt deine Frage als nicht sehr anspruchsvoll zu markieren.
Denn das ganze steht hier sicherlich schon mal extra für dich geschrieben.

N8

Ps: Wenn du sowohl
set "infolder=C:\NeuerOrdner\"
set "outfolder="C:\NeuerOrdner\NeuerOrdner\"

als auch
do copy "%infolder%\%file%" "%outfolder%\%%a_
nimmst - wieviele \ sind dann hintereinander und gehören die da hin?
bastla
bastla 10.08.2012 um 12:10:47 Uhr
Goto Top
Hallo mooowe!

Wird's so:
@echo off & setlocal
set "infolder=C:\NeuerOrdner"  
set "outfolder=C:\NeuerOrdner\NeuerOrdner"                             
besser?

Grüße
bastla
mooowe
mooowe 10.08.2012 um 12:53:22 Uhr
Goto Top
@timobeil.. ist das hier ein Forum in dem man Gegenfragen zu gestellten Fragen stellt anstatt Antworten zu geben?


@bastla: nein leider nicht..
bastla
bastla 10.08.2012 um 13:02:01 Uhr
Goto Top
@t-mo
wieviele \ sind dann hintereinander und gehören die da hin?
Natürlich nicht - allerdings sollte es kein Problem damit geben, wenn nicht eines der beiden Verzeichnisse auf "C:\" (oder das Rootverzeichnis eines anderen Laufwerks verweist) ...

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 10.08.2012 aktualisiert um 13:11:41 Uhr
Goto Top
moin mooowe,

da wir leider nicht absolut die gleiche Umgebung haben ist es doch nicht zuviel verlangt, dass Du in Deinem Batch das @echo off entweder zu einem ::@echo off machst oder @echo on drausbastelst.
Es geht ja nicht nur darum, dass Du schon wieder ein paar Fragen (die hier übrigens sehr oft gestellt werden) von Threaderstellern sondern auch von den Antwortenden erwartet werden können.

Timos Tipp ist nicht nur so dahergeschrieben.
Lies ihn durch und befolge ihn.

Dann kannst Du hier die Fehlermeldung oder das was bei Dir Ausgegeben wird hier hinkrizeln.

Gruß Phil
bastla
bastla 10.08.2012 aktualisiert um 13:13:59 Uhr
Goto Top
Hallo mooowe!

Wenn es so nicht klappt (was mich durchaus überrascht), dann muss ich allerdings T-Mos Frage
warum steht in deiner geänderten und nicht laufenden batch ein @echo off?
wiederholen - schau Dir das Ganze mit "echo on" an ...

Grüße
bastla
mooowe
mooowe 10.08.2012 um 13:07:55 Uhr
Goto Top
nach meinem Verständnis war es auf die "\" bezogen..
hab eure ratschläge befolgt und komme leider trotzdem zu keinem Ergebnis
bastla
bastla 10.08.2012 aktualisiert um 13:11:58 Uhr
Goto Top
Hallo mooowe!

Lässt sich "kein Ergebnis" auch noch etwas aussagekräftiger (zB unter Einbeziehung der Ausgaben, die Du jetzt mit eingeschaltetem "echo" erhältst) formulieren?

Was die "\" am Ende angeht, sollten die zwar nicht die Fehlerursache sein, gehören aber trotzdem nicht hin ...

Grüße
bastla
mooowe
mooowe 10.08.2012 um 14:48:08 Uhr
Goto Top
Die Syntax für Dateiendungen, Verzeichnisnamen und Datenträgerbezeichnungen sind falsch..

kann aber keinen Fehler finden.. und die Verzeichnisse gibt es wie angegeben in meinem Verzeichnis.
60730
60730 10.08.2012 aktualisiert um 19:55:41 Uhr
Goto Top
moin,

Zitat von @mooowe:
@timobeil.. ist das hier ein Forum in dem man Gegenfragen zu gestellten Fragen stellt anstatt Antworten zu geben?

Naja - streng genommen kann man das schon mit Jeopardy vergleichen - stelle eine Antwort in Frageform.
Und nein wenn man sich selber mit echo off die chance nimmt den Bock zu finden - dann verlangt man indirekt - copy&paste das - fügs in eine txt Datei - bau die Ordnerstruktur drumrum auf und lass es ohne €echo off laufen und schreib mir - wos hängt.
Und die zwei \\ war ein Schnellschuss, den ich auf den ersten halben Blick gesehen hab und dank deiner @echo off Nummer (widerwilligerweise wiederholt) hatte ich keinen Bock auf den zweiten Blick.


Also - nimm diesen verlinkten Beitrag schau nach der/den Zeilen wo was vonwegen batch>output oder sinngemäß drin steht und dann siehst du was Ambach ist.

Oder bau dir ein
if exist %variable%\. echo Pfad %variable% gefunden in das Ding
Sei kreativ und nimm auch das >nul nach dem xcopy weg....
Hybsch / blind machen kann man ne Batch später immer noch - aber doch nicht während der Bauphase...
Ich versteh so einen Ansatz einfach nicht - ok Bastla batcheld blind - aber bis da ein normalsterblicher auch nur Ansatzweise drankommt das dauert.

@ Bastla - da (\\) hab ich schon die dollsten Sachen gesehen face-wink
Gruß

Gruß