Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Per Batch Einträge aus einer Liste in eine neue Liste Verschieben und Textteile in weiteren Listen ausgeben

Frage Entwicklung Batch & Shell

Mitglied: romberto

romberto (Level 1) - Jetzt verbinden

20.06.2012, aktualisiert 16:42 Uhr, 2926 Aufrufe, 9 Kommentare

Hallo,

mit der Überschrift habe mich etwas schwer getan. Ich hoffe ich kann das ganze etwas verständlicher erklären:

Ich möchte als erstes Bezug auf folgenden Thread nehmen:

http://www.administrator.de/articles/detail.php?id=186509

dort wird der erste Schritt erläutert. Kurz:

Dateien werden mittels Liste in entsprechende Ordner verschoben!

Nun möchte ich, dass gefundene Einträge aus der Liste "Ursprung" in eine neue Liste "Haben" verschoben werden, so dass nur noch Einträge in der Ursprungsliste stehen die nicht gefunden wurden.

Anschließend möchte ich durch einen extra Befehl die Möglichkeit haben aus "Ursprung" und "Haben" gefilterte Informationen auszugeben und zwar in eine "Have" und eine "Missing" Liste.

Genauer:

Die Einträge in der Ursprungsliste sind wie folgt aufgebaut:

Dateiname=Datum - Genaue_Beschreibung

dies soll auch genauso in die Liste "Haben" verschoben werden.

Nun soll jeweils nur "Genaue Beschreibung" also quasi alles nach " - " in den "Have" und "Missing" Listen ausgegeben werden.

Die Batch von Bastla, die den ersten Teil löst habe ich hier:
01.
@echo off & setlocal 
02.
> set "Ordner=D:\Ordner mit vielen Dateien" 
03.
> set "Liste=D:\Liste.txt" 
04.
>  
05.
> pushd "%Ordner%" 
06.
> for /f "delims=" %%i in ('dir /b/a-d') do for /f "tokens=1* delims==" %%a in ('findstr /ib 
07.
> "%%i" "%Liste%"') do ( 
08.
>     md "%%b" 2>nul && move "%%i" "%%b" 
09.
> ) 
10.
> popd 
11.
> 

Ich hoffe, dass dies irgendwie möglich ist.

Viele Grüße

Robert
Mitglied: Friemler
20.06.2012, aktualisiert um 20:45 Uhr
Hallo Robert,

teste mal die folgenden 2 Scripte.

1. Als Ersatz für obiges Script von bastla, erweitert um das Erzeugen einer Liste der nicht-existierenden Dateien:
01.
@echo off & setlocal 
02.
 
03.
set "Folder=E:\Ordner mit vielen Dateien" 
04.
set "InList=E:\Liste.txt" 
05.
set "ExistList=E:\Liste2.txt" 
06.
set "NotExistList=E:\Liste3.txt" 
07.
 
08.
 
09.
type NUL > "%ExistList%" 
10.
type NUL > "%NotExistList%" 
11.
pushd "%Folder%" 
12.
 
13.
for /f "usebackq tokens=1* delims==" %%a in ("%InList%") do ( 
14.
  dir /b /a:-d "%%a" >NUL 2>&1 && ( 
15.
    call :FileExists "%%a" "%%b" 
16.
  ) || ( 
17.
    call :FileNotExists "%%a" "%%b" 
18.
19.
20.
 
21.
echo move "%NotExistList%" "%InList%" 
22.
popd 
23.
 
24.
exit /b 
25.
 
26.
 
27.
 
28.
:FileExists 
29.
  echo md "%~1" 2>NUL 
30.
  echo move "%~1" "%~2" 
31.
  >>"%ExistList%" echo %~1=%~2 
32.
exit /b 0 
33.
 
34.
 
35.
:FileNotExists 
36.
  >>"%NotExistList%" echo %~1=%~2 
37.
exit /b
Um den Code "scharf" zu schalten, müssen die ECHO-Befehle in den Zeilen 21, 29 und 30 entfernt werden.


2. Um Deine zweite Anforderung zu lösen:
01.
@echo off & setlocal 
02.
 
03.
set "ExistList=E:\Liste2.txt" 
04.
set "HaveList=E:\Have.txt" 
05.
set "NotExistList=E:\Liste.txt" 
06.
set "MissingList=E:\Missing.txt" 
07.
 
08.
 
09.
type NUL > "%HaveList%" 
10.
type NUL > "%MissingList%" 
11.
 
12.
call :ProcessFile "%ExistList%" "%HaveList%" 
13.
call :ProcessFile "%NotExistList%" "%MissingList%" 
14.
exit /b 
15.
 
16.
 
17.
:ProcessFile 
18.
  for /f "usebackq tokens=1* delims==" %%a in ("%~1") do ( 
19.
    call :ProcessLine "%%b" "%~2" 
20.
21.
exit /b 
22.
 
23.
 
24.
:ProcessLine 
25.
  set "line=%~1" 
26.
  set "line=%line:* - =%" 
27.
  >>"%~2" echo %line% 
28.
exit /b
Achtung!! Falls die Dateinamen in der Ursprungsliste Umlaute enthalten, muss die Datei in der Codierung OEM850 abgespeichert werden.

Gruß
Friemler
Bitte warten ..
Mitglied: romberto
20.06.2012, aktualisiert um 19:07 Uhr
Hallo Friemler,

Vielen Dank schonmal. Ich habe das ganze gerade kurz einmal getestet und leider funktioniert das erste Script nicht wie ich es brauche. Die Dateien in der Liste haben teils sehr komische Dateinamen, da diese noch im 8.3 Format sind. z.B. A&B-CDEF.GHI

Nun bekomme ich die Fehlermeldung, dass z.B. B-CDEFI.GHI nicht gefunden wurde und in Liste.txt steht anschließend nur noch A

Sonst passiert leider nichts

Das Miss und Have Liste Script klappt hervoragend! Vielen Dank

EDIT: Ich habe es soeben nochmals ausführlicher getestet: Ohne Sonderzeichen in den Dateinamen funktioniert es wie es soll (auch mit den Listen) -> ABER: die Dateien werden nicht in gleichnamige Ordner verschoben, sondern einfach umbennant.
Bitte warten ..
Mitglied: Friemler
20.06.2012, aktualisiert um 19:38 Uhr
Hallo Robert,

das Problem mit den Dateinamen, die Sonderzeichen enthalten, liegt am Batchscript-Interpreter. Zeichen wie z.B. & gehören zum Sprachschatz von Batchscript und werden bei den ECHO-Befehlen in den Zeilen 31 und 36 als Operator interpretiert.

Btr. Dateien werden einfach umbenannt: Mein Fehler

Beides sollte sich erledigen, wenn Du die beiden Unterprogramme FileExists und FileNotExists durch folgenden Code ersetzt:
01.
:FileExists 
02.
  echo md "%~2" 2>NUL 
03.
  echo move "%~1" "%~2" 
04.
  >>"%ExistList%" <NUL set /p "=%~1=%~2" 
05.
  >>"%ExistList%" echo. 
06.
exit /b 0 
07.
 
08.
 
09.
:FileNotExists 
10.
  >>"%NotExistList%" <NUL set /p "=%~1=%~2" 
11.
  >>"%NotExistList%" echo. 
12.
exit /b
Dadurch, dass die auszugebenden Strings jetzt in Anführungszeichen eingeschlossen sind, sollte das Problem nicht mehr auftreten.

Btr. die Ausgabeliste: Die Datei, deren Name in der Variablen NotExistList eingetragen ist, wird in Zeile 21 über die ursprüngliche Eingabedatei geschrieben.

Gruß
Friemler
Bitte warten ..
Mitglied: romberto
20.06.2012 um 19:59 Uhr
Hallo Friemler,

Super! Das mit den sonderzeichen stellt nun kein problem mehr dar und Listen kuntionieren auch 1a. Nur leider kopiert er mir die Dateien nicht (entweder garnicht oder es wird angezeigt, dass die Datei bereits von einem anderen Prozess verwendet wird) Mit echo vor den befehlen zeigt er mir zwar an was er machen möchte, ohne echo macht er es aber dann nicht. Ich habe auch schon versucht die Zeile von Bastla einzufügen bzw. anzupassen, da macht er mir aber zusätzlich noch einen Ordner mit Dateinamen.
Bitte warten ..
Mitglied: Friemler
20.06.2012 um 20:09 Uhr
Hallo Robert,

warum einfach, wenn es auch umständlich geht?

Das "wird von einem anderen Prozess verwendet" kommt wahrscheinlich von der Art und Weise, wie ich die Existenz der Datei überprüfe. Geht auch einfacher. Ersetze bitte die FOR-Schleife im Hauptprogramm durch folgenden Code:
01.
for /f "usebackq tokens=1* delims==" %%a in ("%InList%") do ( 
02.
  if exist "%%a" ( 
03.
    call :FileExists "%%a" "%%b" 
04.
  ) else ( 
05.
    call :FileNotExists "%%a" "%%b" 
06.
07.
)
Gruß
Friemler
Bitte warten ..
Mitglied: romberto
20.06.2012, aktualisiert um 20:38 Uhr
Hallo Friemler,

Jetzt geht alles einwandfrei, bis auf eine Kleinigkeit: ist es möglich, dass Liste2.txt fortlaufend zu machen? bis jetzt überschreibt er mir diese bei jedem neuen durchgang neu. achja und wäre es möglich beim 2ten scrip den output alphabetisch zu sortieren?

Ich denke dann bin ich wunschlos glücklich

Auf jedenfall vielen Dank für deine Mühen.

Viele Grüße

Robert
Bitte warten ..
Mitglied: Friemler
20.06.2012 um 20:48 Uhr
Hallo Robert,

die Liste2.txt zu sortieren wird schwierig. Um das Überschreiben zu verhindern, könntest Du einfach Zeile 9
type NUL > "%ExistList%"
streichen.

Gruß
Friemler
Bitte warten ..
Mitglied: romberto
20.06.2012 um 21:02 Uhr
SUPER! Vielen, vielen Dank! Bin Wunschlos Glücklich!

Viele Grüße und noch einen schönen Abend

Robert
Bitte warten ..
Mitglied: Friemler
20.06.2012 um 21:05 Uhr
Hallo Robert,

Du hast Dein Posting editiert!!

Die Ausgabe des zweiten Scripts kann man sehr einfach sortieren. Ersetze das Unterprogramm ProcessFile durch folgenden Code:
01.
:ProcessFile 
02.
  for /f "usebackq tokens=1* delims==" %%a in ("%~1") do ( 
03.
    call :ProcessLine "%%b" "%~2" 
04.
05.
 
06.
  sort "%~2" /o "%~2.tmp" 
07.
  move "%~2.tmp" "%~2" 
08.
exit /b
Gruß
Friemler
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...