Top-Themen

Aktuelle Themen (A bis Z)

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

(Level 1)

25.11.2007, aktualisiert 27.11.2007, 6821 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 ..
Ähnliche Inhalte
Exchange Server
Such-Index nach Neuerstellung defekt
Frage von CoverianExchange Server

Guten Morgen zusammen, wir haben hier aktuell ein Problem das mir schlaflose Nächte bereitet. Es handelt sich um einen ...

Batch & Shell
Wlan-adapter such algorithmus in batch
gelöst Frage von TicoWriteBatch & Shell7 Kommentare

Hallo zusammen, Ich möchte einen Wlan-adpater such algorithmus in batch erstellen, dazu fehlt mir aber der befehl in Dos. ...

Exchange Server

Exchange-Fehler: 550 No such recipient here

gelöst Frage von GreysonExchange Server3 Kommentare

Hallo administrator.de, habe seit heute an meinem Exchange die Fehlermeldung: #550 No such recipient here Diese Meldung erhalte ich ...

CMS

Mini-Blog-System mit Such- und Druckfunktion zum Selberhosten gesucht

gelöst Frage von DGI-SysAdmCMS1 Kommentar

Moin Gemeinde ;-) Jeden Tag diese neuen Anforderungen und am Besten alles schon gestern installiert Ich bin auf der ...

Neue Wissensbeiträge
iOS
WatchChat für Whatsapp
Tipp von Criemo vor 22 StundeniOS

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor !!!
Tipp von Criemo vor 1 TagiOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Off Topic
Avengers 4: Endgame - Erster Trailer
Information von Frank vor 3 TagenOff Topic2 Kommentare

Ich weiß es ist Off Topic, aber ich freue mich auf diesen Film und vielleicht geht es anderen hier ...

Webbrowser
Microsoft bestätigt Edge mit Chromium-Kern
Information von Frank vor 3 TagenWebbrowser5 Kommentare

Microsoft hat nun in seinem Blog bestätigt, dass die nächste Edge Version kein EdgeHTML mehr für die Darstellung benutzen ...

Heiß diskutierte Inhalte
Exchange Server
Exchange Server 2010: Keine Eingehenden E-MAils
gelöst Frage von gabeBUExchange Server17 Kommentare

Hallo Zusammen Ich habe das kurzen auf dem Exchange 2010 Server das Problem, dass ich keine externen E-Mails mehr ...

Windows Netzwerk
Kerio. Kann keine Mails empfangen aber senden. Wer ist schuld. Kerio oder Windows domäne?
gelöst Frage von frosch2Windows Netzwerk14 Kommentare

Hallo, es existiert ein Problem bei uns mit dem mailen. Alle bestehenden Nutzer können mailen. Raus wie rein. Neuen ...

Server
Server in zwei verschiedene Netzwerke einbinden
gelöst Frage von BennyFServer13 Kommentare

Hallo zusammen, bei uns im Haus sind im Erdgeschoss die Geschäftsräume und ab dem 1. Stock sind unsere privaten ...

Viren und Trojaner
"Erpressermail" über eigenen web.de-Account
gelöst Frage von istike2Viren und Trojaner12 Kommentare

Hallo Zusammen, ein User aus dem Team hat folgende "Erpressermail" scheinbar von dem eigenen Mailaccount bekommen: Da die User ...