cleverm
Goto Top

Alle Dateien in einem Verzeichnis per Batch verschieben, die einen bestimmten Textinhalt NICHT beinhalten

Hallo,

ich habe folgenden Befehl der alle Dateien in einem bestimmten Verzeichnis mit bestimmten Textinhalt verschiebt und so auch funktioniert:

FOR /F %%i IN ('findstr /M "OK" c:\import\*2016*.txt') DO move /y %%i e:\import\OK

Ich benötige jedoch dies genau umgekehrt:
Alle Dateien die NICHT "OK" im Dateiinhalt enthalten in den Ordner "e:\temp\fehlerhaft" zu verschieben.

Das ganze sollte nach Möglichkeit auf Performance getrimmt sein, da die Batch täglich ca. 2GB und 10.000 Dateien übers Netzwerk verschiebt.

Kann mir bitte jemand helfen?
Danke!

Gruß
cleverm

Content-Key: 316933

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

Printed on: April 26, 2024 at 18:04 o'clock

Mitglied: 131026
131026 Oct 05, 2016 updated at 16:43:28 (UTC)
Goto Top
@echo off
set "quelle=C:\import\*2016*.txt"  
set "ziel=e:\temp\fehlerhaft"  
powershell -Executionpolicy Bypass -Command "gci '%quelle%' | ?{(gc $_.FullName -ReadCount 1000) -notlike '*OK*'} | move-item -Destination '%ziel%' -Force"  
R.
Member: Friemler
Friemler Oct 05, 2016, updated at Oct 06, 2016 at 08:06:40 (UTC)
Goto Top
Hallo cleverm,

teste mal folgendes:
@echo off & setlocal

set "FilesToSearch=c:\import\*2016*.txt"  
set "SearchPattern=OK"  

set "GoodFilesDir=e:\import\OK"  
set "BadFilesDir=e:\temp\fehlerhaft"  
set "GoodFilesLog=%TEMP%\TheGoodFiles.txt"  

> "%GoodFilesLog%" (  
for /f "tokens=* delims=" %%f in ('findstr /m /c:"%SearchPattern%" "%FilesToSearch%" 2^>NUL') do (  
  echo %%f
  move "%%f" "%GoodFilesDir%" 1>NUL 2>CON  
))

for /f "tokens=* delims=" %%f in ('for %%f in ^("%FilesToSearch%"^) do @echo %%~f^|findstr /v /l /g:"%GoodFilesLog%" 2^>NUL') do (  
  move "%%f" "%BadFilesDir%" 1>NUL  
)

del "%GoodFilesLog%" 2>NUL  

Das Script verschiebt zuerst die Dateien, die den Suchbegriff enthalten und protokolliert dabei deren Pfade in einer temporären Logdatei. In einem zweiten Durchgang werden alle zuvor nicht verarbeiteten Dateien verschoben (diejenigen, deren Pfade nicht in der Logdatei stehen).

Grüße
Friemler
Member: cleverm
cleverm Oct 06, 2016 at 09:01:47 (UTC)
Goto Top
Vielen Dank erstmal für die schnelle Antwort!

Die Batch funktioniert teilweise. D. h. die fehlerhaften Dateien werden korrekt verschoben. Leider werden alle Dateien mit "OK" auch in ein Unter-Verzeichnis OK verschoben. Diese müssen jedoch im Originalverzeichnis liegen bleiben. Diese nachträglich wieder ins Originalverzeichnis zu verschieben wäre eine Möglichkeit aber bei großen Datenmengen doch zeitinstensiv.

Grüße
cleverm
Member: Friemler
Friemler Oct 06, 2016 updated at 10:22:47 (UTC)
Goto Top
Moin cleverm,

das Verschieben der "GoodFiles" habe ich eingebaut, weil Dein Eröffnungsposting den Eindruck erweckte, als ob Du diesen Teilschritt benötigst und bereits umgesetzt hast. Aber anscheinend hast Du nur einen irgendwo kopierten Code-Schnipsel eingestellt.

Wenn die "GoodFiles" nicht verschoben werden sollen, ein Tipp: Es genügt, eine Zeile in meinem Script zu löschen, um das zu vermeiden. Welche Zeile das ist, solltest du in der Lage sein selbst herauszufinden.

Grüße
Friemler
Member: cleverm
cleverm Oct 06, 2016 at 10:40:00 (UTC)
Goto Top
Hallo ranger,

nach Korrektur des kleinen Fehlers von

set "ziel="
durch
set "ziel=

funktioniert das Skript einwandfrei.

Vielen vielen Dank für die schnelle und kompetente Lösung!!!

Gruß
cleverm
Mitglied: 131026
131026 Oct 06, 2016 updated at 10:43:21 (UTC)
Goto Top
Zitat von @cleverm:

Hallo ranger,

nach Korrektur des kleinen Fehlers von

set "ziel="
durch
set "ziel=
Ups, Entschuldigung... Schreibfehler, ist oben abgeändert.
Member: cleverm
cleverm Oct 06, 2016 at 11:33:58 (UTC)
Goto Top
Hallo ranger,

Hätte da noch einen Erweiterungswunsch,

ist es möglich mehrere Quellen (ca. 10) anzugeben, Ziel wäre jeweils ein Unterordner der Quellen (fehlerhaft)

Bsp.:
Quelle1
Quelle2
...

Ziel1 = Quelle1\fehlerhaft
Ziel2 = Quelle2\fehlerhaft
...


Gruß und Danke
Mitglied: 131026
Solution 131026 Oct 06, 2016 at 14:34:42 (UTC)
Goto Top
@echo off
set "quellen=C:\quelle1;C:\quelle2;C:\quelle3;C:\quelle4"  
set "filter=*2016*.txt"  
powershell -Executionpolicy Bypass -Command "'%quellen%'.split(';') | %%{$quelle=$_; gci $_ -Filter '%filter%' | ?{(gc $_.FullName -ReadCount 1000) -notlike '*OK*'} | move-item -Destination ($quelle + '\fehlerhaft') -Force}"  
Member: cleverm
cleverm Oct 12, 2016 at 10:30:48 (UTC)
Goto Top
Hallo,

Nachdem obiges einwandfrei funktioniert, hat sich bei einem Fall eine Erweiterung ergeben, die ich so nicht hinkriege.

Und zwar bräuchte ich für obige Quelle1 die Funktion für spezielle Unterordner falls möglich ohne diese in 20 Quellen aufzuteilen.

Quelle1 = quelle1\A*\O\

Bsp.:
Quelle1\abc\O\
Quelle1\abf\O\
Quelle1\abz\O\
...

Ggf. auch als separate Lösung für Quelle1

Danke und Gruß
Cleverm
Mitglied: 131026
131026 Oct 12, 2016 updated at 10:39:42 (UTC)
Goto Top
@echo off
set "quellen=C:\quelle1\A*\O;C:\quelle2;C:\quelle3;C:\quelle4"  
set "filter=*2016*.txt"  
powershell -Executionpolicy Bypass -Command "'%quellen%'.split(';') | %%{$quelle=$_; gci ($_ + '\%filter%') | ?{(gc $_.FullName -ReadCount 1000) -notlike '*OK*'} | move-item -Destination ($quelle + '\fehlerhaft') -Force}"  
Und zwar bräuchte ich
Ich brauch jetzt auch was, nen Kasten Bier ...!!

@cleverm Dein nicname ist schon gewagt was :-P
Member: cleverm
cleverm Oct 12, 2016 at 11:56:22 (UTC)
Goto Top
Hallo ranger,

wenns ne Möglichkeit gibt, lass ich gern was per PayPal oder so rüberkommen.
Zum nicname :-P Was Powershell + Batch Kombi angeht bin ich leider noch totaler Anfänger. Bin eher auf Hardware spezialisiert.

Obige Antwort funktioniert leider nicht (Move-Item : Illegales Zeichen im Pfad).
Löst vermutlich das * nicht richtig auf?

Gruß