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

Datei suchen und nur Datinamen der neusten kopieren

Frage Entwicklung Batch & Shell

(Level 1)

25.11.2007, aktualisiert 27.11.2007, 6498 Aufrufe, 11 Kommentare

Hi,
also ich bin noch ganz neu hier und stehe schon für mich vor einem großen Problem.
Also es geht darum.
ich möchte das ich eine batch starte und dann dort etwas eingebe. das was ich eingegeben habe, soll dann auf den Laufwerken W: und X: gesucht werden und noch mit dem zusatz"*.txt" versehen werden, so dass alle txt dateien gesucht werden welche mit aaa beginnen.
Danach soll mir der Dateiname der Datei mit dem neusten Speicherdatum ohne das ".txt" in die Zwischenablage kopiert werden.

Also auf meinem Laufwerk sind sagen wir die Dateien:
aaa.txt
aaa_1.txt
aaa_2.txt
aaa_3.txt
aaa_4.txt
aaa_5.txt
bbb.txt
bbb_1.txt
ccc.txt
ccc_1.txt
ccc_2.txt
Dies kann bis zu _99 oder noch höher hochgehen.

also wenn ich aaa eingebe, dann soll er mir praktisch "aaa_5" in die zwischenablage kopieren, weil dies die neuste datei ist.

Im Windows explorer ist dies ganz simpel.
ich würde auf suchen gehen.
als Laufwerke würde ich W: und X: auswählen
als suchwort würde ich einfach "aaa*.txt" einegebn
dann bekomme ich alle Dateien.
Dann würde ich sie nach Datum sortieren und dann von der obersten den Dateinamen ohne das ".txt" kopieren.
Das ist eigentlich schon alles.

Das funktioniert im Explorer per Hand echt super, aber ich dachte mir, dass müsste doch auch per batch möglich sein.
Mitglied: Biber
25.11.2007 um 14:00 Uhr
Moin Michael587,

willkommen im Forum.

Realisieren lässt sich der Plan natürlich, aber ganz verstehe ich ihn nicht.
  • der Part mit dem Laufwerke W: und X: nach der jüngsten "SoUndSo"-Datei durchsuchen ist klar und ist auch eine typische Batch-Aufgabe.
  • was ich nicht verstehe I: "wenn ich den Batch starte..." : Wie? Wo? Kontextmenü Explorer? Doppelklick Desktop? Isoliert? Teil eines Gesamt-Prozesses?
  • was ich nicht verstehe II: WTF willst Du mit dem "Dateinamen" ohne Pfad/Laufwerksangabe und Endung in der Zwischenablage?????

Soll nicht heißen, dass ich nicht helfen will, aber Sinn sollte es schon machen...

Grüße
Biber
Bitte warten ..
Mitglied: Biber
25.11.2007 um 15:00 Uhr
Moin MichaelS87,

ein bisschen mehr habe ich verstanden, aber noch nicht alles:

  • wieso können denn die Messreihendatei entweder irgendwo auf W: oder irgendwo auf X: sein?
  • sind die nicht immer in einem bestimmten Pfad? Oder haben W: und X gar keine Unterverzeichnisstruktur?
  • und Du brauchst nicht nur den Datei-Namen (ohne Endung), sondern auch minimal Laufwerk oder sogar Laufwerk/Pfad, richtig?

Sorry für die vielen Rückfragen, aber Bätche funktionieren eben so, dass man/frau vorher alles wissen muss...

Grüße
Biber
Bitte warten ..
Mitglied: Biber
25.11.2007 um 15:47 Uhr
Moin MichaelS87,

bastla hat vorgestern eine Lösung gepostet, die schon fast genau passt. Siehe spezielle Directories mit last modified auflisten.

Die Skizze aus diesem Beitrag:
01.
@echo off & setlocal 
02.
echo.>%temp%\whatever.xyz 
03.
for /d %%A in (D:\Backup\*_EXT) do for /f "tokens=1,2,3 delims=. " %%I in ('echo %%~tA') do echo %%K\%%J\%%I %%A >>%temp%\whatever.xyz 
04.
sort %temp%\whatever.xyz
... diese Skizze müsstest Du nur noch ändern, so dass statt EIN Pfad ("D:\Backup\*_Ext") jetzt zwei FOR-Anweisungen nacheinander ausgeführt werden.
Einmal auf "W:\DeinMessreihenPfad\%suchname%.txt" und einmal auf "X:\DeinesKollegenMessreihenpfad\%suchname%.txt."

Den Suchnamen fragst Du am Anfang ab mit
Set /P Suchname="Bitte Dateinamensmuster für die Suche eingeben: "

Statt "sort %temp%\whatever.xyz" kannst Du schreiben:
for /f "tokens=1,2*" %%i in ('sort /R %temp%\whatever.xyz') do Set "NewestName=%%~nj"
Dann hast Du den neuesten Namen in %NewestName%

Das Senden an die Zwischenablage geht leider nur mit Zusatztools.
Eines davon heißt CLIP.exe, stammt vom sympathischen Weltmarktführer höchstselbst (in einem der ResKits, glaub ich) und sendet einen Text an das ClipBoard.

P.S. Ich bin etwas zögerlich mit der Batch-Variante, weil... sinnvoller scheint mir, das alles im Excel-Makro selbst abzufackeln.
Oder dürft ihr den nicht ändern (Kaufprogramm)??

Grüße
Biber
Bitte warten ..
Mitglied: miniversum
25.11.2007 um 17:59 Uhr
ich habe mir schon ein makro geschrieben in excel, das automatisch die benötigten werte aus diesen txt dateien hohlt, wenn ich aaa oder bbb eingebe.
Mal ne ganz doofe Frage:
Warum machst du den dann überhaubt den Sprung mit Batch und vba (vom Makro)? Erweitere doch das Makro um die Suchfunktion dann brauchst du mit dem copy&past vom Dateinamen nicht rummachen sondern nur einfach das Makro ausführen?

miniversum
Bitte warten ..
Mitglied: miniversum
25.11.2007 um 21:57 Uhr
prinzipiell geht in excelmakros das alles was auch in vbs geht.
Bitte warten ..
Mitglied: bastla
25.11.2007 um 22:09 Uhr
Hallo MichaelS87!

Vielleicht kannst Du ja den folgenden Code Deinen Bedürfnissen anpassen:
01.
Dim Suchmaske As String, Ext As String, SuchLen As Integer 
02.
Dim Zuletzt As Date, Erg As String 
03.
Dim fso As Object 
04.
Dim Ordner As Object, Datei As Object, Dateien As Object, Unter As Object 
05.
 
06.
Sub Suchen() 
07.
Ext = "txt" 'Typ der zu suchenden Datei 
08.
Roots = Array("W:\", "X:\") 'Ordner für Beginn der Suche auf den jeweiligen Laufwerken 
09.
'Eingabe Suchmaske 
10.
Suchmaske = InputBox("Bitte Anfang des Dateinamens als Suchmaske angeben!", "Suchmaske") 
11.
 
12.
'Hilfsvariable 
13.
Suchmaske = LCase(Suchmaske) 
14.
SuchLen = Len(Suchmaske) 
15.
Ext = LCase(Ext) 
16.
 
17.
Set fso = CreateObject("Scripting.FileSystemObject") 
18.
 
19.
Zuletzt = 0 'Initialisierung Zwischenspeicher für jüngstes Dateidatum 
20.
Erg = "" 
21.
 
22.
For Each Root In Roots 
23.
    Set Ordner = fso.GetFolder(Root) 'Start der Suche mit dem jeweiligem Startordner je Laufwerk 
24.
    SearchInFolder Ordner 
25.
Next 
26.
 
27.
If Erg <> "" Then 
28.
    'Voller Pfad der jüngsten passenden Datei steht in Erg 
29.
    Workbooks.Open (Erg) 
30.
Else '... oder auch nicht. 
31.
    MsgBox "Keine zur Suchmaske " & Chr(34) & Suchmaske & "*." & Ext & Chr(34) & _ 
32.
        " passende Datei gefunden!", vbCritical, "Datei nicht gefunden!" 
33.
End If 
34.
End Sub 
35.
 
36.
Sub SearchInFolder(Ordner) 
37.
Set Dateien = Ordner.Files 
38.
' Alle Dateien in diesem Ordner abklappern 
39.
For Each Datei In Dateien 
40.
    'Dateityp prüfen 
41.
    If LCase(fso.GetExtensionName(Datei.Name)) = Ext Then 
42.
        'Beginnt Dateiname mit Suchmaske? 
43.
        If LCase(Left(Datei.Name, SuchLen)) = Suchmaske Then 
44.
            'Änderungsdatum vergleichen ... 
45.
            If Datei.DateLastModified > Zuletzt Then 
46.
                '... und wenn neuer, speichern; 
47.
                Zuletzt = Datei.DateLastModified 
48.
                Erg = Datei.Path 'Dateipfad natürlich auch ;-) 
49.
            End If 
50.
        End If 
51.
    End If 
52.
Next 
53.
 
54.
'Unterordner abklappern, SearchInFolder rekursiv aufrufen 
55.
For Each Unter In Ordner.SubFolders 
56.
    SearchInFolder Unter 
57.
Next 
58.
End Sub
Bitte zu beachten, dass die Variablendeklaration der Einfachheit halber im Deklarationsteil des Moduls (vor dem ersten Sub) erfolgt - so stehen diese Variablen ohne Übergabe als Parameter auch im Sub "SearchInFolder" zur Verfügung.

Das Ermitteln der Länge des Suchstrings und das Umwandeln der Suchmaske bzw der Extension in Kleinbuchstaben als Hilfsvariable bereits vor der Such-Schleife sollte (leicht) die Performance verbessern.

Grüße
bastla
Bitte warten ..
Mitglied: bastla
26.11.2007 um 13:53 Uhr
Hallo MichaelS87!

Wenn es tatsächlich genügt, nach dem Änderungsdatum des Ordners zu sortieren, sollte sich das dann nicht ganz so hinziehen. Der Code dafür sähe etwa so aus:
01.
Dim Suchmaske As String, Ext As String, SuchLen As Integer 
02.
Dim Zuletzt As Date, Erg As String 
03.
Dim fso As Object 
04.
Dim Ordner As Object, UO As Object, As Object, Unter As Object 
05.
 
06.
Sub SuchenOrdner() 
07.
 
08.
Roots = Array("W:\", "X:\") 'Ordner für Beginn der Suche auf den jeweiligen Laufwerken 
09.
'Eingabe Suchmaske 
10.
Suchmaske = InputBox("Bitte Anfang des Ordnernamens angeben!", "Suchmaske") 
11.
 
12.
'Hilfsvariable 
13.
Suchmaske = LCase(Suchmaske) 
14.
SuchLen = Len(Suchmaske) 
15.
 
16.
Set fso = CreateObject("Scripting.FileSystemObject") 
17.
 
18.
Zuletzt = 0 
19.
Erg = "" 
20.
 
21.
For Each Root In Roots 
22.
    Set Ordner = fso.GetFolder(Root) 'Start der Suche 
23.
    SearchInFolder Ordner 
24.
Next 
25.
 
26.
If Erg <> "" Then 
27.
    'Voller Pfad der jüngsten passenden Ordners steht in Erg 
28.
    Worksheets("Tabelle1").Range("A1").Value = Erg 
29.
Else '... oder auch nicht. 
30.
    MsgBox "Keinen zur Suchmaske " & Chr(34) & Suchmaske & "*.*" & Chr(34) & _ 
31.
        " passenden Ordner gefunden!", vbCritical, "Ordner nicht gefunden!" 
32.
End If 
33.
 
34.
End Sub 
35.
 
36.
Sub SearchInFolder(Ordner) 
37.
' Alle Unterordner überprüfen 
38.
For Each UO In Ordner.SubFolders 
39.
    'Beginnt Ordnername mit Suchmaske? 
40.
    If LCase(Left(UO.Name, SuchLen)) = Suchmaske Then 
41.
        'Änderungsdatum vergleichen ... 
42.
        If UO.DateLastModified > Zuletzt Then 
43.
            '... und wenn neuer, speichern; 
44.
            Zuletzt = UO.DateLastModified 
45.
            'Ordnerpfad natürlich auch 
46.
            Erg = UO.Path 
47.
        End If 
48.
    End If 
49.
Next 
50.
 
51.
'Unterordner abklappern, SearchInFolder rekursiv aufrufen 
52.
For Each Unter In Ordner.SubFolders 
53.
    SearchInFolder Unter 
54.
Next 
55.
End Sub
In dieser Fassung wird der gesamte Ordnerpfad in die Zelle A1 der "Tabelle1" geschrieben - soll's wirklich nur der Name sein, dann "Erg = UO.Path" auf "Erg = UO.Name" ändern.

Um das Suchergebnis in die Zwischenablage zu bekommen (geht's denn wirklich nicht anders?) käme die von Dir beschriebene Vorgangsweise oder eine der unter den folgenden Links zu findenden Methoden in Frage:

http://209.85.135.104/search?q=cache:z7BWmbS8JbAJ:mypage.bluewin.ch/rep ...
http://www.aboutvb.de/vba/artikel/vbaclipboard.htm

Grüße
bastla

P.S.: Die "Datei-Such-Variante" hat bei einem Test mit ca 160.000 Dateien bei mir auch knapp 4 Minuten gebraucht (allerdings auf einer lokalen internen SATA-Platte).

[Edit] Den Plan C (Ordnerliste in Batch) können wir ja immer noch versuchen ... [/Edit]
Bitte warten ..
Mitglied: bastla
27.11.2007 um 17:50 Uhr
Hallo MichaelS87!

Soferne die Nummerierung tatsächlich ausreichend ist, um den jüngsten Ordner / die jüngste Datei zu finden (und es nur eine Ordnerebene unterhalb von "W:\m1", etc gibt), müsste es so gehen:
01.
@echo off & setlocal 
02.
set "Start=W:\m1 W:\m2 W:\m3 W:\m4 X:\m1" 
03.
set "Neueste=C:\Neueste.txt" 
04.
 
05.
set "List=%temp%\whatever.xyz" 
06.
set /p "Maske=Bitte Suchmaske eingeben: " 
07.
echo. 
08.
echo. 
09.
if exist "%List%" del "%List%" 
10.
if exist "%Neueste%" del "%Neueste%" 
11.
for %%S in (%Start%) do for /f "delims=" %%A in ('dir /b /ad "%%S\%Maske%*.*" 2^>nul') do echo %%~nA$%%~fA >>"%List%" 
12.
set Neu= 
13.
if exist "%List%" ( 
14.
	for /f "tokens=2 delims=$" %%N in ('sort "%List%"') do set "Neu=%%N" 
15.
	del "%List%" 
16.
17.
if defined Neu ( 
18.
	echo %Neu% 
19.
	echo %Neu% >"%Neueste%" 
20.
	) else ( 
21.
	echo [%Maske%] nicht gefunden! 
22.
	echo. 
23.
	pause 
24.
)
Hoffentlich empfindest Du es nicht als Zwangsbeglückung, wenn Du als Ergebnis nicht die gesamte Liste, sondern nur einen Eintrag (im CMD-Fenster sowie in "C:\Neueste.txt") erhältst .

Ganz wohl fühle ich mich allerdings mit der Strategie "nach Ordnernamen sortieren" nicht:
Wenn Du keine einheitliche Namenskonvention verwendest, geht das nämlich mit 2- oder mehrstelligen Nummern schief, da eine Textsortierung verwendet wird und daher zB gilt: "aaa_12.txt" < "aaa_2.txt". Die angesprochene Konvention müsste lauten: "Die Nummern aller Ordner-/Dateinamen weisen die gleiche Stellenanzahl auf." Im oben genannten Beispiel würde dies bedeuten, dass als Name "aaa_02" (oder als Vorsorge für dreistellige Nummern "aaa_002") zu verwenden wäre.

Grüße
bastla

[Edit] Delimiter "§" durch "$" ersetzt, da "§" > "_" und "$" < "_", was bei Verwendung von "§" und fehlendem "_" im Ordnernamen zu falscher Sortierung führte) [/Edit]
Bitte warten ..
Mitglied: Biber
27.11.2007 um 18:11 Uhr
Moin bastla.

eine Code-Verschlankung schlage ich noch vor.

Statt der beiden hintereinandergeschalteten FOR-Anweisungen einfacher:

01.
... 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
set "Start=W:\m1\# W:\m2\# W:\m3\# W:\m4\# X:\m1\#" 
04.
.... 
05.
for /f "delims=" %%A in ('dir /b /ad "!Start:#=%Maske%*.*" 2^>nul') do echo %%~nA§%%~fA >>"%List%" 
06.
... 
07.
...
....denn der DIR-Befehl lann ja durchaus mehrere Datei/Pfadangaben in einer Zeile verwerten.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
27.11.2007 um 18:21 Uhr
Hallo MichaelS87!

Damit hast Du einen weiteren Hinweis auf die Notwendigkeit der oben erwähnten Konvention. Wenn der Ordner "aaa_0" hieße, würde es klappen.

Grüße
bastla
Bitte warten ..
Mitglied: bastla
27.11.2007 um 18:36 Uhr
Hallo MichaelS87!

Einfachere Lösung: Ersetze die beiden im Batch vorkommenden "§" durch "$" (ich mache das auch gleich oben im Code).

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst XML-Datei: Pfade suchen, verlinkte Dateien kopieren und Pfade ändern (4)

Frage von ELEVATOR zum Thema Batch & Shell ...

Batch & Shell
gelöst Per Batch nur neueste Datei mit bestimmten Dateianfang kopieren (3)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Wert in einer TXT Datei suchen (11)

Frage von nolle99 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...