d3ns007
Goto Top

Mit welchem Batchbefehl kann ich zwischen Dateien unterscheiden deren Dateinamen mit Buchstaben und Zahlen anfangen?

Mein Problem ist das ich per Batch einige Logfiles ansehen muss. Das Batchprogramm soll unterscheiden zwischen Dateinamen die mit Buchstaben anfangen und Dateinamen die mit Zahlen anfangen. Die Dateinamen die mit Buchstaben anfangen sollen von diesem Ordner in einen anderen kopiert werden.

Ich versuche mich gerade etwas am Batchprogrammieren.
Mein Problem ist das ich zu obiger Frage im Netz leider keine zufriedenstellende Lösung gefunden habe. Hätte jemand einen Befehl zu Hand um da Problem zu lösen?

Ich stelle mir das so vor:

IF Filename==(a-z .*)(
copy files von A nach B)
else(
goto:eof)

Sorry kenne die Batchsyntax nicht so gut... Aber damit Ihr wisst was ich brauche: Hauptaugenmerk dabei sollte der Unterschied zwischen den Dateinamen sein...

Vielen Dank für die Hilfe
Grüße

Content-Key: 160376

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

Printed on: April 23, 2024 at 15:04 o'clock

Member: bastla
bastla Feb 08, 2011 at 12:52:03 (UTC)
Goto Top
Hallo D3ns!007!

Versuch es etwa so (direkt in der CMD-Shell - als Batch mit verdopelten Prozentzeichen):
for /f "delims=" %i in ('dir /b *.log^|findstr /v /b "[0-9]"') do @echo copy "%i" "D:\Zielordner\"
Wegen des "echo" vor dem "copy" wird der Kopierbefehl (zum Testen) nur angezeigt, aber noch nicht ausgeführt ...

Grüße
bastla
Member: Biber
Biber Feb 08, 2011 at 12:57:53 (UTC)
Goto Top
Sorry kenne die Batchsyntax nicht so gut...
Die Forumskonventionen aber auch nicht, sonst hätte die Frage mit "Tach" oder "Gruezi" angefangen.

Beispiel am CMD-Prompt
[nur die erste Zeile ist Eingabe, der Rest Ausgabe. Führendes ">" gehört zum Prompt]
>for /f "delims=" %i in ('dir /b ^|findstr /r "^[0-9]"') do @echo copy "%i" X:\WhereEver\"
copy "01000100..txt" X:\WhereEver\"
copy "0byte.txt" X:\WhereEver\"
copy "1.bat" X:\WhereEver\"
copy "132.bat" X:\WhereEver\"
copy "14.bat" X:\WhereEver\"
copy "22mio.txt" X:\WhereEver\"
copy "34.bat" X:\WhereEver\"

Grüße
Biber

[Edit @bastla] Okay, wenn du die Dateien mit Buchstaben kopierst, dann nehm ich die mit Ziffern.... *g [/Ecit]
Member: D3ns007
D3ns007 Feb 08, 2011 at 13:15:43 (UTC)
Goto Top
Hallo Miteinander (so viel zu Forumskonventionen =)
Könntest Du mir evtl. erklären welcher Befehl da was macht?

Damit ich es verstehe und nicht bloß zusammenzimmer bis es geht..

Danke
Grüße
Member: bastla
bastla Feb 08, 2011 at 13:26:35 (UTC)
Goto Top
Hallo D3ns!007!
for /f "delims=" %i in (' ') do
geht alle Ergebniszeilen (= jeweils %i) des/der in der Klammer (und zwischen den Apostrophen) stehenden Befehle/s durch und führt für jede die nach dem "do" stehende/n Aktion/en aus
dir /b *.log^|findstr /v /b "[0-9]"
listet alle Ordnerinhalte (wenn es sicher nur Dateien sein sollen, wäre zusätzlich "/a-d" zu verwenden) mit dem Typ ".log" auf (nur Name und Typ) und filtert dann mit "findstr", wobei wegen des "/v" alle Zeilen übrigbleiben, die nicht dem Filterkriterium entsprechen
@echo copy "%i" "D:\Zielordner\"
no comment ... face-wink

Näheres findest Du unter Verwendung der Online-Hilfe, etwa mit "findstr /?" oder sowie ausführlich für "for" im Tutorial zur FOR-Schleife.

Grüße
bastla
Member: D3ns007
D3ns007 Feb 08, 2011 at 14:20:39 (UTC)
Goto Top
Danke bastla,
wenn das Programm jetzt vor dem kopieren prüfen soll ob die Dateien schon im Zielordner enthalten sind.
Wie geht das?

Grüße+Danke
D3ns!007
Member: bastla
bastla Feb 08, 2011 at 14:52:59 (UTC)
Goto Top
Hallo D3ns!007!!

"if exist" oder "if not exist" - was eben grad besser passt ...

Grüße
bastla
Member: D3ns007
D3ns007 Feb 08, 2011 at 15:07:24 (UTC)
Goto Top
Mhmm ja ok ist klar.
Aber der soll ja in Ordner A reinschauen und mit den Dateien aus Ordner B vergleichen.
Weißt Du wie das geht?

grüße
Member: bastla
bastla Feb 08, 2011 at 15:32:10 (UTC)
Goto Top
Hallo D3ns!007!!

Gib einfach den Pfad mit an ...

Grüße
bastla

P.S.: Vielleicht beschreibst du einmal den ganzen weiteren Plan ...
Member: D3ns007
D3ns007 Feb 09, 2011 at 07:54:42 (UTC)
Goto Top
Ja ok ich versuchs mal...

Also wir kopieren diese Logfiles von einem Ordner in einen anderen. Bevor die Dateien kopiert werden wäre es nicht schlecht wenn ein Abgleich anhand des Dateinamens zwischen den Ordnern gemacht wird. Falls es ein Log gibt das doppelt vorkommt (Dateinamen) dann möchte ich das Ja nicht überschreiben.

Momentaner Quelltext ist dieser:
@echo off
set "src=\\Test\Source"  
set "dst=\\Test\destination"  
echo Bitte warten Sie während das Programm die Dateien kopiert...
REM.
color 8F
for /f "delims=" %%i in ('dir /b *.log^|findstr /v /b "[0-9]"') do copy %%i %dst%  
echo Nun koennen Sie mit beliebigen Tastendruck das Fenster schließen. Der Copy-Job ist durchgefuehrt.
pause

Wenn das Programm den Vergleich noch hinbekommen würde dann bin ich glücklich =)
Member: bastla
bastla Feb 09, 2011 at 08:10:51 (UTC)
Goto Top
Hallo D3ns!007!!

Etwa so:
@echo off & setlocal
set "src=\\Test\Source"  
set "dst=\\Test\destination"  
echo Bitte warten Sie während das Programm die Dateien kopiert...
REM.
color 8F
for /f "delims=" %%i in ('dir /b "%src%\*.log"^|findstr /v /b "[0-9]"') do if not exist "%dst%\%%i" copy "%src\%%i" "%dst%\"  
echo Nun koennen Sie mit beliebigem Tastendruck das Fenster schliessen. Der Copy-Job ist durchgefuehrt.
pause
Grüße
bastla
Member: D3ns007
D3ns007 Feb 09, 2011 at 09:31:37 (UTC)
Goto Top
Hallo Bastla,
mir ist gerade noch etwas beim testen aufgefallen.

Nach dem Vergleich der Daten soll die Datei trotzdem kompiert werden.
Also im Zielverzeichnis soll Log1.txt und Log1(1).txt stehen.

Ist das möglich? Hast Du eine Idee.

Danke!
Grüße

D3ns!007
Member: bastla
bastla Feb 09, 2011 at 10:13:51 (UTC)
Goto Top
Hallo D3ns!007!

Ungetestet:
@echo off & setlocal
set "src=\\Test\Source"  
set "dst=\\Test\destination"  
echo Bitte warten Sie während das Programm die Dateien kopiert...
REM.
color 8F
for /f "delims=" %%i in ('dir /b "%src%\*.log"^|findstr /v /b "[0-9]"') do call :ProcessFile "%%i"  
echo Nun koennen Sie mit beliebigem Tastendruck das Fenster schliessen. Der Copy-Job ist durchgefuehrt.
pause
goto :eof

:ProcessFile
set /a Nr=0
set "Zusatz="  
:Loop
if not exist "%dst%\%~n1%Zusatz%%~x1" goto :CopyIt  
    set /a Nr+=1
    set "Zusatz=(%Nr%))"  
goto :Loop

:CopyIt
copy "%src%\%~1" "%dst%\%~n1%Zusatz%%~x1"  
goto :eof
Das hier verwendete Unterprogramm "ProcessFile" verhält sich wie ein weiterer Batch - daher kommt der beim Aufruf übergebene Dateiname (inkl. Typ) als %1 an und kann entsprechend weiterverarbeitet =aufgeteilt in "%~n1" (=nur Name) und "%~x1" (= nur Typ bzw "extension") werden.

Mit der Zählervariablen %Nr% bzw der daraus erzeugten Variablen %Zusatz% kann dann solange "probiert" werden, bis ein Zusatz gefunden wird, der noch nicht vorhanden ist - im Optimalfall (wenn es die zu kopierende Datei im Zielordner noch nicht gibt) bleibt dabei %Zusatz% leer.

Grüße
bastla

P.S.: Ob "das möglich ist" bzw ich eine "Idee dazu" habe, ergibt sich eigentlich ohnehin aus meiner (im Negativfall nicht gegebenen) Antwort ... face-wink

[Edit] Fehlendes Prozentzeichen in Zeile 22 ergänzt [/Edit]
[Edit2] ... und %%i durch %~1 ersetzt [/Edit2]
Member: D3ns007
D3ns007 Feb 09, 2011 at 10:46:58 (UTC)
Goto Top
Bitte warten Sie wõhrend das Programm die Dateien kopiert...
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Nun koennen Sie mit beliebigem Tastendruck das Fenster schliessen. Der Copy-Job ist durchgefuehrt.
Drücken Sie eine beliebige Taste . . .

Das hier sind die Meldungen die mir ausgegeben werden.
Es werden keine Dateien mehr kopiert (auch nicht ersetzt). Bekomme aber keine große Fehlermeldung...

Woran kann das liegen?
Member: Biber
Biber Feb 09, 2011 at 11:25:10 (UTC)
Goto Top
Zitat von @D3ns007:
Woran kann das liegen?
Eventuell ein Fehler im Script?
Ergänze doch mal in Zeile 22
copy "%src\%%i" "%dst%\%~n1%Zusatz%%~x1"
...ein Prozentzeichen nach den drei Buchstaben "src"

Kleiner Tipp. Wenn beim Kopieren vom OS die Fehlermeldung "Das System kann die angegebene Datei nicht finden" kommt,
dann dürfte es sich dabei handeln um
[_] die Zieldatei?
[_] die Protokolldatei?
[_] die Batchdatei?
[_] die Quelldatei?
Member: bastla
bastla Feb 09, 2011 at 11:34:30 (UTC)
Goto Top
@Biber

Danke für's Aushelfen face-smile

Ich trage das mal oben nach, belasse es aber beim Status "Ungetestet" face-wink ...

Grüße
bastla
Member: D3ns007
D3ns007 Feb 09, 2011 at 12:11:38 (UTC)
Goto Top
Hallo,
also ich hab es nochmals durchgespielt und auch das %-Zeichen nachgetragen.
Die Fehlermeldung ist die gleiche....

Grüße
Member: Biber
Biber Feb 09, 2011 at 12:20:01 (UTC)
Goto Top
Moin D3ens!007,
Zitat von @D3ns007:
Hallo,
also ich hab es nochmals durchgespielt und auch das %-Zeichen nachgetragen.
Die Fehlermeldung ist die gleiche....
Dann ist im Gegensatz zu vorher diesmal wahrscheinlich die zu kopierende Datei nicht da.
Ersetze doch das "%%i" in der vorhin korrigierten Zeile durch %1.

Kannst du denn nicht Testen, beispielsweise indem du statt des "copy vonirgendwoMitVariablen nachirgenwoMitVariablen"
ein "ECHO copy vonirgendwoMitVariablen nachirgenwoMitVariablen" machst?

Grüße
Biber
Member: bastla
bastla Feb 09, 2011 at 12:22:43 (UTC)
Goto Top
Hallo D3ns!0047!

Ich habe ja auch nicht nur einen Fehler eingebaut ... face-sad

Da sich die Zeile nicht mehr in der Schleife befindet, gibt's natürlich auch kein "%%i" mehr - wieder etwas richtiger face-wink sollte die Zeile dann so aussehen:
copy "%src%\%~1" "%dst%\%~n1%Zusatz%%~x1"
Grüße
bastla

[Edit] @Biber: Thx again - heute hab ich aber ordentlich Gelegenheit zum Ausbügeln gelassen ... [/Edit]
Member: D3ns007
D3ns007 Feb 09, 2011 at 15:10:49 (UTC)
Goto Top
Hallo Miteinander,
jetzt gehts.

Danke für die Tatkräftige Unterstützung!

Grüße
Der D3ns!007