nummer5
Goto Top

Filtern von Ordnern

einen schönen guten Tag face-smile

ich brauche wieder mal eure Hilfe!
Ich habe einen Quellordner in dem Order im Format ABCDE012 liegen. Beim durchsuchen des Quellordners wird einerseits der Zielordner im Format ABCDE angelegt
und andererseits die bereits kopierten Ordner in eine Datei eingetragen.
for /f %%a in ('dir /b /a:D "%quelle%" ^| findstr /v /g:%exclude%') do (  
  	 echo. >> %log%
	 echo  [%%a] >> %log%
	 set dir=%%a
	 set dir=!dir:~0,5!
	 robocopy %quelle%\%%a %ziel%\!dir!\%%a   >>%log%
	 echo. #############################################>> %log%
	 echo %%a >>%exclude%
)
Das ging solange die o.g. Struktur stimmte.
Nun kommen aber Order dazu welche einerseits ohne Zahlen und andererseits länger oder auch kürzer sind wie ABCDE. Wie kann ich aus den neu hinzugekommenen
(Quell)Ordnern gleichnamige Zielordner erstellen ohne dabei die alte Funktion zu verändern?
Evtl. müssten die Ordner welche dem Format entsprechen vorher ausgefiltert werden und vorerst nur die anderen kopiert werden. In dem Fall müsste dann Zeile 5 weg.
Wie bekommt man das zusammen? Ich bin mir sicher ihr könnt mir helfen!

Content-Key: 337344

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

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: theunix
theunix 10.05.2017 um 11:47:18 Uhr
Goto Top
und andererseits die bereits kopierten Ordner in eine Datei eingetragen.
Was meinst du genau damit ?

Das ging solange die o.g. Struktur stimmte.
hat sich da etwas geändertg , bzw. kamen hier andere Ordner hinzu ?
Mitglied: nummer5
nummer5 10.05.2017 um 12:09:03 Uhr
Goto Top
Zitat von @theunix:

und andererseits die bereits kopierten Ordner in eine Datei eingetragen.
Was meinst du genau damit ?
die Namen der Ordner werden in die Datei %exclude% eingetragen um beim nächsten Durchlauf der Schleife ausgelassen zu werden, sonst würde immer nur der erste Ordner kopiert
Das ging solange die o.g. Struktur stimmte.
hat sich da etwas geändertg , bzw. kamen hier andere Ordner hinzu ?
ja die Ordner kommen teils neu hinzu
Mitglied: Friemler
Friemler 10.05.2017 um 23:41:13 Uhr
Goto Top
Hallo nummer5,

teste mal folgendes:
>>"%log%" (  
  for /f "tokens=* delims=" %%a in ('dir /b /a:D "%quelle%" ^| findstr /v /g:"%exclude%"') do (  
    echo(
    echo [%%a]

    set "dir=%%a"  

    echo %%a|findstr /r /c:"^.....[0-9][0-9][0-9]$" && (  
      set "dir=!dir:~0,5!"  
    )

    robocopy "%quelle%\%%a" "%ziel%\!dir!\%%a"  
    echo. #############################################

    >>"%exclude%" echo %%a  
  )
)

Ich habe ein paar Verbesserungen hinzugefügt:

  • Die Ausgabe der kompletten FOR-Schleife wird in die Ausgabedatei umgeleitet. Das führt zu einer höheren Performance, da die Ausgabedatei nur einmal geöffnet werden muss.
  • Bei der FOR-Schleife die Optionen "tokens=* delims=" hinzugefügt, damit auch Verzeichnisnamen mit Leerzeichen korrekt verarbeitet werden.
  • Alle Ausdrücke, die Datei-/Verzeichnisnamen darstellen, in Anführungszeichen gesetzt (ebenfalls zur Absicherung von Namen mit Leerzeichen).
  • Die Zuweisungen bei SET-Befehlen in Anführungszeichen gesetzt, damit nicht ungewollt eingegebene Leerzeichen mit in die Zuweisung aufgenommen werden.
  • Durch die Schreibweise echo( wird die Performance erhöht. Der Befehl echo. führt dazu, dass zunächst im aktuellen Verzeichnis und dann in allen Verzeichnissen, die in der PATH-Variablen stehen, nach einer Datei namens Echo.exe gesucht wird. Nur wenn diese Datei nicht gefunden wurde, wird der interne ECHO-Befehl mit der gewünschten Wirkung (Leerzeile ausgeben) ausgeführt.
  • Durch die Schreibweise >>"%exclude%" echo %%a wird beim Schreiben der Verzeichnisnamen in die Datei kein Leerzeichen mehr angehängt.

Grüße
Friemler
Mitglied: nummer5
nummer5 11.05.2017 um 09:53:42 Uhr
Goto Top
Hallo Friemler face-smile
vielen Dank für Dein Bemühen!
Ich habe das jetzt getestet, die Variable aus Zeile 9 wird wohl nicht erstellt bzw. kommt in Zeile 12 nur als !dir! an.
Für die Zeilen 8 u. 9 habe ich mal eine Batch erstellt, entspricht der Ordner ABCDE123, kommt als Variable ABCDE an > passt. Ist der Ordnername anders aufgebaut kommt nichts an und würde mir dann wohl im Zielpfad fehlen, oder?

Grüße nummer5
Mitglied: Friemler
Friemler 11.05.2017 um 13:31:29 Uhr
Goto Top
Hallo nummer5,

ist die verzögerte Variablenerweiterung mittels
setlocal enabledelayedexpansion
in einer Zeile vor der FOR-Schleife aktiviert worden? Nur dann wird aus !dir! etwas sinnvolles.

Wenn Du den Filter in Zeile 8 in einer separaten Batchdatei testen willst, musst Du die Zeilen 6 bis 9 in eine Batchdatei schreiben.

Grüße
Friemler
Mitglied: nummer5
nummer5 11.05.2017 um 14:38:59 Uhr
Goto Top
Hallo Friemler,

die Variablenerweiterung hatte ich natürlich vergessen face-sad.
Ich habe das schnell mal getestet. Sieht ganz gut aus, jedoch habe ich in jeden Order der ohne Zahlen war, den gleichen Ordner noch mal.
Mitglied: nummer5
nummer5 12.05.2017 um 12:52:45 Uhr
Goto Top
nach einigen Versuchen ist nun folgendes entstanden:
@echo on & setlocal enabledelayedexpansion

set log=D:\log.txt
set quelle=D:
set ziel=G:\test
set exclude=G:\temp.txt

>>"%log%" (   
	for /f "tokens=* delims=" %%a in ('dir /b /a:D "%quelle%" ^| findstr /v /g:"%exclude%"') do (  
	echo(
	echo [%%a]

    set "dir=%%a"  
	
    echo %%a|findstr /m /c:"0" && (  
      set "dir=!dir:~0,5!"  
    	robocopy "%quelle%\%%a" "%ziel%\!dir!\%%a"  
		)
	echo %%a|findstr /v /c:"0" && (  
        robocopy "%quelle%\%%a" "%ziel%\%%a"  
		)	
	    echo. #############################################
	
    	echo %%a >>%exclude%
 )
)
im "kleinen Test" geht das. Damit sind die Ordner nicht mehr doppelt vorhanden. Ich hatte noch andere Zeichenfolgen (z.B.[0-9]) probiert, hat aber nicht denn gewünschten Erfolg gebracht. So muss erst mal die "0" herhalten, die in allen Ordnernamen mit Zahlen enthalten ist.

Grüße nummer5
Mitglied: nummer5
nummer5 18.05.2017 um 10:41:00 Uhr
Goto Top
läuft face-smile
Danke an die Mitwirkenden, hat geholfen.

Grüße nummer5