ajmambo
Goto Top

Batch soll Neue Excel Datei suchen und in anderem Ordner Kopieren

Hallo zusammen,

ich habe gestern zum ersten mal eine Batchdatei geschrieben sie macht auch EIGENTLICH das was sie soll.
Das Problem was ich nur habe ich er sucht sich nicht die Aktuelle bzw. Neue Datei raus und Kopiert die sondern eine alte.

Zur Vorgeschichte:

Ich muss für meine Arbeit immer einen Tagesbericht machen diese werden in Excel geschrieben diese haben immer dieses Format

Tagesbericht Name 2013-05-02.xls

Diese Datei liegt in einen Ordner namens Meine Tagesberichte, der hat dann noch die Ordner 2012, 2013 und 2014
und in diesen Ordnern sind dann die jeweiligen Monate Januar- Dezember wo diese Exceldatein dann drin liegen.


Wenn ich die Batch Ausführe dann Kopiert er mir aber immer nur den den Tagesbericht vom März 2013 mit dem Datum vom 21.3.2013

Wobei aber eigentlich der Tagesbericht vom 30.5.2013 Kopiert werden soll.

Selbst wenn ich meine ganzen Tagesberichte auf meinen Privaten Rechner zuhause kopiere und die Batch Ausführe kopiert er nur diese.

Noch mal zum Verständnis diese Datei ist auch nicht als letztes Bearbeitet worden oder so... Aktuell ist die Datei mit heutigen Datum zu gekommen und die soll er finden.


Meine Batch hat folgende Einträge:


@echo off


for /f "delims=" %%a in ('dir /a-d /od-g /b /s *.xls') do set "newestFile=%%a"
xcopy "%newestFile%" "C:\Users\Herr und Gebieter\Desktop\A"

pause


Vielleicht kann mir ja einer sagen wo das Problem bei mir ist.

Content-Key: 207258

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

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: Biber
Biber 30.05.2013 aktualisiert um 19:36:13 Uhr
Goto Top
Moin ajmambo,

willkommen im Forum.

in deinem DIR-Befehl lässt du die Suche ja mit /s über mehrere Unterverzeichnisse schrapeln.
Dadurch machst du dir leider die Sortieroption "nach Datum" kaputt, denn die letzte Datei in der Bildschirmauflistung ist dann immer die aktuellste in dem letzten Ordner, der durchsucht wird.

Okay, EIN möglicher Workaround für dich wäre folgender (mit Herleitung):

Heute ist es ja so, dass geplanterweise die aktuellste/neueste xls-Tabelle kopiert werden soll.
Aber auf jeden Fall nur EINE (wenn du heute drei xls-Tabellen aktualisiert hättest, würdest du auch nur die berücksichtigen, die als letztes gespeichert wurde.

Wenn es also ohnehin nur eine Datei werden sol, die die CMD-Zeile abfackelt, dann wäre das ja immer eie Datei von "heute".

Diese wiederum könntest du auch mit einer "Dir /S"-Suche finden:
C:\Users\Biber>for /f %i in ('dir /a-d /b /s b:\*.xls') do @echo %~ti|find "%date%">nul && @echo Isch kopiere %i ...  

--> for /f %i in ('dir /a-d /b /s b:\*.xls') do ...
> kennst du schon

--> ... @echo %~ti|find "%date%">nul
>... echo mir Datum/uhrzeit der Datei %i, pipe das nach "Findstr "heutigesDatum"

--> && @echo Isch kopiere %i ...
>... und wenn du das heutige Datum gefunden hast, dann führe aus "echo Isch kopiere Datei %i

Grüße
Biber
Mitglied: ajmambo
ajmambo 30.05.2013 um 22:17:42 Uhr
Goto Top
Hallo Bieber,

es tut mir leid ich raff das nicht....
Ich habe Verstanden und Nachvollzogen das er die Letzte Datei in meinen Ordnern nimmt...
Das stimmt soweit auch weil in darunterliegenden Ordner September nix mehr drin ist.

Eine Möglichkeit währe vor jedem Monat die entsprechende Monats zahl zu machen damit sie in der richtigen reinfolge währen... das möchte ich aber nicht machen.

Dein Schnipsel Kapiere ich jedoch nicht so ganz auch wenn Du es Erklärt hast.

--> for /f %i in ('dir /a-d /b /s b:\*.xls') do ...
> das b:*.xls muss doch nicht sein oder? es kann auch nur *.xls stehen

--> ... echo %~ti|find "%date%">nul
>... echo mir Datum/uhrzeit der Datei %i, pipe das nach "Findstr "heutigesDatum"

>....hier sucht er nach ein Datum was %~ti und >nul machen soll Verstehe ich nicht


--> && echo Isch kopiere %i ...
>... und wenn du das heutige Datum gefunden hast, dann führe aus "echo Isch kopiere Datei %i

>.... Isch kopiere ist doch kein Befehl und was macht %i ? ? ?


Ich habe mit dem Schnipsel mal ein bissen Experimentiert aber bei mir macht er nix nur das Dos Fenster auf und zu was ja eindeutig ein Fehler ist und wenn ich das im CMD Fenster eintrage dann bekomme ich ein Syntax Fehler.

Wie ich schon gesagt habe ich bin totaler Neuling und das ist meine erste Batch die ich mache.


Es währe daher super wenn Du mir nochmals Erklären könntest was die einzelnen Befehle machen und wie ich sie richtig um setzen kann.

Ich weiß das ist viel Verlangt aber ich möchte auch Verstehen wie es Funktionier was ich da mache.


Mein Letzter Versuch war:

@echo off


for /f %i in ('dir /a-d /b /s C:\Users\Herr und Gebieter\Desktop\Meine Tagesberichte\*.xls') do @echo %~ti|find "%date%">nul &&
@echo %i ...
xcopy "%date%" "C:\Users\Herr und Gebieter\Desktop\A"

pause

Und ja es darf gelacht werden...

Vielen Dank im Vorraus
Mitglied: Biber
Biber 30.05.2013, aktualisiert am 31.05.2013 um 00:05:24 Uhr
Goto Top
Moin ajmambo,

Zitat von @ajmambo:
Hallo Bieber,
Öhmm, ja es gibt auch einen "Bieber" mit Frisurproblemen, aber ich bin "Biber".
Und auch wenn der andere Bieber und ich gelegentlich die gleiche Zielgruppe ansprechen - ich bevorzuge den Teil davon, der schon lesen und schreiben kann.
Also bring uns bitte nicht durcheinander - es gibt Unterschiede.


es tut mir leid ich raff das nicht....
Ich habe Verstanden und Nachvollzogen das er die Letzte Datei in meinen Ordnern nimmt...
Das stimmt soweit auch weil in darunterliegenden Ordner September nix mehr drin ist.
Das war mein Hauptanliegen - die Ursache für das "unerklärliche Problem" aufzuzeigen.

Eine Möglichkeit währe vor jedem Monat die entsprechende Monats zahl zu machen damit sie in der richtigen reinfolge
währen... das möchte ich aber nicht machen
Die Strategie wäre auch nur meine dritte Wahl.

Dein Schnipsel Kapiere ich jedoch nicht so ganz auch wenn Du es Erklärt hast.

--> for /f %i in ('dir /a-d /b /s b:\*.xls') do ...
> das b:*.xls muss doch nicht sein oder? es kann auch nur *.xls stehen
Ich habe nur bei mir das Laufwerk b:\ genommen, weil da zufällig eine heute geänderte *.xls-Datei vorhanden war.

--> ... echo %~ti|find "%date%">nul
>... echo mir Datum/uhrzeit der Datei %i, pipe das nach "Findstr "heutigesDatum"

>....hier sucht er nach ein Datum was %~ti und >nul machen soll Verstehe ich nicht
Erster Teilsatz: ja.
Zweiter Halbsatz: Er sucht nach Datum/Uhrzeit: ja.
Danach gibt es zwei Möglichkeiten wie meist im Leben: entweder es wurde der String gefunden (wir Geeks nennen den Zustand oft TRUE oder SUCCESS) oder aber es wurde nix gefunden (FALSE oder FAILED)

Das eigentliche Ergebnis "was/welche Zeile wurde gefunden" würde auf dem Bildschirm ausgegeben werden
Da mich das "was" aber gar nicht interessiert schicke ich die Ausgabe mit ">nul" nach dorthin, wohin auch die laufenden Entwicklungskosten für den EuroHawk gebucht werden.

Verwerten will ich dagegen das oben genannte TRUE oder FALSE.
Dafür bietet mir die batchverabeitung zwei Operatoren
a) der Operator "&&", der so viel heisst wie: wenn der vorige Befehl SUCCESS/TRUE zurückgab, dann mach als nächstes...

und das nächste, was gemacht werden soll ist in der demo oben:

--> && echo Isch kopiere %i ...
>... und wenn du das heutige Datum gefunden hast, dann führe aus "echo Isch kopiere Datei %i

>.... Isch kopiere ist doch kein Befehl und was macht %i ? ? ?
... aber "echo isch kopieren" bzw. "echo irgendein text" ist gültig

Ich habe mit dem Schnipsel mal ein bissen Experimentiert aber bei mir macht er nix nur das Dos Fenster auf und zu was ja eindeutig
ein Fehler ist und wenn ich das im CMD Fenster eintrage dann bekomme ich ein Syntax Fehler.
Bitte immer testen im "CMD-Fenster" ==" Start"->"Ausführen"->cmd

Und dort beachten: am CMD-Prompt haben FOR-Laufvariablen immer ein prozentzeichen (%i, %j,...).
Im batch werden zwei Prozentzeichen (%%i, %%j, ..) benötigt.

Ich weiß das ist viel Verlangt aber ich möchte auch Verstehen wie es Funktionier was ich da mache.

Jau, da bist du hier richtig.


for /f %i in ('dir /a-d /b /s C:\Users\Herr und Gebieter\Desktop\Meine Tagesberichte\*.xls') do @echo %~ti|find
"%date%">nul &&
@echo %i ...
Wie oben geschrieben: am CMD immer %i, %j usw - im Batch immer %%i, %%j usw.
Siehst du es?

Und ja es darf gelacht werden...
Na ja, wir Biber sind da absolut humorlos.

Vielen Dank im Vorraus
Jetzt wirst du lachen: genau diese Schreibweise hab ich hier schon 87x angeprangert. face-wink

Grüße
Biber
Mitglied: Endoro
Endoro 30.05.2013 aktualisiert um 23:28:49 Uhr
Goto Top
Hallo ajmambo,
sich hier im Forum "im Vorraus" zu bedanken wird nicht gern gesehen. Wie ich finde zu Recht.

Ich habe ein Skript geschrieben, das passen könnte. Es geht davon aus, dass dein Datums- und Zeitformat auf Deutsch:Standard dd.mm.yyyy hh:mm eingestellt ist, wenn nicht kann das geändert werden. Es hat auch Nachteile: es ist ziemlich langsam. Du musst den Ausgangsordner als %startfolder% eintragen und wenn alles OK ist, das Wort echo vor copy entfernen.
@echo off &setlocal
set "startfolder=C:\Users\Herr und Gebieter\Desktop\Meine Tagesberichte"  
for /r "%startfolder%" %%i in (*.xls) do (  
	set /a cn+=1
	set "st=%%~ti"  
	set "fn=%%~fi"  
	call set "fs=%%st:~6,4%%%%st:~3,2%%%%st:~0,2%%%%st:~11,4%%"  
	call set "$%%fs%%%%cn%%=%%fn%%"  
)
for /f "tokens=1*delims==" %%i in ('set "$"') do set "newest=%%j"  
if defined newest (echo Newest file: "%newest%") else echo Error newest file not found!&goto:eof  
echo copy "%newest%" "C:\Users\Herr und Gebieter\Desktop\A"  

Und bitte: immer nachher bedanken face-wink

Gruss!
Mitglied: ajmambo
ajmambo 31.05.2013 um 00:20:46 Uhr
Goto Top
Guten Morgen Biber,

entschuldige das ich Bieber geschrieben habe es war keine Absicht.

Okay jetzt habe ich wieder ein bisschen mehr gelernt denn noch nur die hälfte verstanden face-sad


ABER ich habe dein Schnipsel schon mal gebaut und habe leider ein neues Problem denn jetzt sucht er ja nach dem Aktuellem Datum

Wie mein Test nach Mitternacht mir gezeigt hat...


Wenn ich aber auf der Arbeit bin dann speicher ich meinen Tagesbericht vom 30.5.13 auf mein Rechner ab schalte ihn aber erst am 31.5.13 wieder ein und dann versucht die Batch die Excel vom 31.5.13 zu kopieren was aber ja nicht gefunden wird.

Ich hatte das leider vorher nicht erwähnt, es tut mir leid.

Denn die Batch soll im Autostart gelegt werden so das sie beim Rechner start den Tagesbericht sofort Kopier

Oder kann man auch in einer Batch schreiben das sie das ganze Kopieren soll wenn der Rechner Runter gefahren wird?
Das währe Natürlich der Hammer.

Der Code sieht nun so aus:

@echo off


for /f %%i in ('dir /a-d /b /s b:\*.xls') do @echo %%~ti|find "%date%">nul && %%i ...
dir
xcopy "%date%" "C:\Users\Herr und Gebieter\Desktop\A"

pause


Entschuldige aber ich checks leider nicht mit welchen befehl ich ein Code Tabelle erzeugen kann [code] [/code] mag er wohl nicht.
Mitglied: ajmambo
ajmambo 31.05.2013 um 00:32:25 Uhr
Goto Top
Hallo Endoro,

ich werde es mir Merken, vielen....

ich habe dein Skript mir angeschaut und getestet aber da macht er leider nix.


---> set "startfolder=C:\Users\Herr und Gebieter\Desktop\Meine Tagesberichte"
-- habe ich so gelassen weil das ja auch mein Start Ordner ist

---> for /r "%startfolder%" %%i in (*.xls) do (
-- habe ich auch so gelassen weil ja oben der Start Ordner schon angegeben wurde

Bei dem Rest verstehe ich wieder mal nur Bahnhof aber ich gehe davon aus das er hier mit dem Datum Uhrzeit Stempel die Aktuelle Datei sucht die er dann Kopieren soll.

Leider Kopiert er bei mir nichts

Ob das Skript langsam ist oder nicht ist egal... wichtig ist nur das habe ich Biber auch eben leider erst geschrieben das ich die Batch so schreiben wollte das er die letzte Excel Datei nimmt weil die Batch soll im Autostart gelegt werden so das wenn der Rechner gestartet wird die Datei kopiert wird.
Mitglied: Endoro
Endoro 31.05.2013 um 00:55:45 Uhr
Goto Top
Hallo ajmambo,

hast du daran gedacht, das Wort echo vor dem copy zu entfernen?
Mitglied: ajmambo
ajmambo 02.06.2013 um 12:10:44 Uhr
Goto Top
Hallo Endoro,

Nein das hatte ich Natürlich Vergessen... ich werde Deine Batch gleich Montag mal Ausprobieren.
Und dann nochmal Berichten.
Mitglied: ajmambo
ajmambo 06.06.2013 um 22:32:34 Uhr
Goto Top
Hallo Endoro,

ich habe jetzt Deine Batch Datei mir genauer in der Praxis angeschaut und ich bin Dir zu Tiefsten Dank verpflichtet.
Sie macht genau das was es soll.

Jetzt muss ich nur noch unseren Admin dazu bekommen das diese Batch auch so eingebunden wird das sie Ausgeführt wird wenn der Rechner runter fährt.

Hab vielen Dank für Deine Hilfe ich würde sagen es kann geschlossen werden.