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 Suchstring Suche aus CSV Datei mit CMD

Mitglied: Lupora

Lupora (Level 1) - Jetzt verbinden

08.10.2019 um 16:13 Uhr, 316 Aufrufe, 18 Kommentare, 2 Danke

Hallo zusammen,

ich habe ein Problem und habe 90% der Lösung bereits hier mit der Suche gefunden.
Die letzten 10% fehlen mir noch

Problem: Ich möchte eine Ordnerstruktur samt Unterordner nach einem exakten Suchstring durchsuchen. Wann immer er eine Datei findet, die auf den Suchstring machted, soll er die Datei in ein Zielverzeichnis kopieren.
Zusatz: Ich möchte den Suchstring nicht nur einmal fix definieren, sondern möchte eine CSV mit Suchstrings bereitstellen. In dieser sind in alle Suchstrings gelistet (immer einer pro Zeile).
Er soll die Suchstrings Zeile für Zeile abarbeiten und jedesmal bei einem Treffer die entsprechende Dateien kopieren. Wenn er die Ordnerstruktur samt Unterordner mit einem String fertig durchsucht hat, holt er sich aus der CSV den nächsten Suchstring.

Das ist mein Script aktuell:

@echo off & setlocal
set "Dateifilter=*MeinSuchString*.pdf"
set "Quelle=C:\RootOrdner"
set "Ziel=C:\Zielordner"
for /f "delims=" %%a in ('dir /s /b /a-d "%Quelle%\%Dateifilter%"') do @(
copy "%%a" "%Ziel%"
)

Wie müsste man meine gewünschte Funktion implementieren? Habe schon rumprobiert aber ohne Erfolg :/

Meine Suchstring CSV Datei sähe so aus:
*MeinSuchString1*.pdf
*MeinSuchString2*.pdf
*MeinSuchString3*.pdf

usw.
Mitglied: erikro
08.10.2019 um 16:56 Uhr
Moin,

warum einfach, wenn es auch kompliziert geht. Auf der Powershell ist das ein Einzeiler:

01.
get-content C:\woauchimmer\suchstrings.txt | %{get-childitem $_ | Copy-Item -Destination c:\zielordner}
Das im Quellordner ausführen und gut ist.

Zitat von Lupora:
Meine Suchstring CSV Datei sähe so aus:
*MeinSuchString1*.pdf
*MeinSuchString2*.pdf
*MeinSuchString3*.pdf

BTW: Das ist keine CSV, sondern eine einfache Textdatei. Eine CSV hat Spaltenüberschriften und Trennzeichen zwischen den Überschriften und den einzelnen Attributen eines Datensatzes.

hth

Erik
Bitte warten ..
Mitglied: Friemler
08.10.2019 um 18:18 Uhr
Hallo @Lupora,

falls es eine Batch-Lösung sein muss, wickele noch eine Schleife drumherum:

01.
@echo off & setlocal
02.

03.
set "SuchStrings=C:\SuchStrings.txt"
04.
set "Quelle=C:\RootOrdner"
05.
set "Ziel=C:\Zielordner"
06.

07.
for /f "usebackq delims=" %%a in ("%SuchStrings%") do (
08.
  for /f "delims=" %%b in ('dir /s /b /a:-d "%Quelle%\%%~a" 2^>NUL') do (
09.
    copy "%%~b" "%Ziel%"
10.
  )
11.
)
Siehe auch mein Tutorial zur FOR-Schleife.

Grüße
Friemler
Bitte warten ..
Mitglied: 141320
08.10.2019, aktualisiert um 19:03 Uhr
Zitat von erikro:
01.
> get-content C:\woauchimmer\suchstrings.txt | %{get-childitem $_ | Copy-Item -Destination c:\zielordner}
02.
> 

Eine Alternative zu der Variante etwas abgewandelt dann ist die Suche mit Get-ChildItem nur ein Aufruf.
01.
Get-ChildItem 'C:\Rootordner\*' -Include (gc 'D:\suchstrings.txt') -File | copy-item -Destination 'C:\zielordner'
Auch in der Batch nutzbar wenn's sein muss
01.
@echo off
02.
powershell -EP Bypass -NoP -C "Get-ChildItem 'C:\Rootordner\*' -Include (gc 'D:\suchstrings.txt') -File | copy-item -Destination 'C:\zielordner'"
Bitte warten ..
Mitglied: Lupora
08.10.2019 um 21:23 Uhr
Hallo zusammen,

erstmal danke für all eure Antworten. Ihr seid ja voll die Profis

Tatsächlich sollte es eine Batch Datei sein.

@Friemler
Enthält dein Code bereits die Liste die hinterlegt werden muss?
Suche in deinem Code die Stelle wo er die Textdatei einliest?

@erikro
Du hast also den Powershell Aufruf direkt in die Batch integriert?

Könnte man noch einen Befehl dazu packen, damit er alle gefundenen Bilder (die auf Suchstrings matchen) nicht in einen gemeinsamen Zielordner verschiebt? Sondern das er jeweils einen Ordner angelegt wird mit dem Namen des Suchstrings? Falls Ordner schon vorhanden, kopiert er die gefundenen Dateien da rein. Falls nicht, wird der Ordner erstellt?
Bitte warten ..
Mitglied: 141320
08.10.2019, aktualisiert um 21:56 Uhr
Zitat von Lupora:


Könnte man noch einen Befehl dazu packen, damit er alle gefundenen Bilder (die auf Suchstrings matchen) nicht in einen gemeinsamen Zielordner verschiebt? Sondern das er jeweils einen Ordner angelegt wird mit dem Namen des Suchstrings? Falls Ordner schon vorhanden, kopiert er die gefundenen Dateien da rein. Falls nicht, wird der Ordner erstellt?
Kann man, aber dann muss man auch die Sonderzeichen wie das Sternchen usw. durch entsprechend gültige Zeichen ersetzen, denn sonst lässt sich ein Ordner mit so einem Suchstring erst gar nicht anlegen!

01.
gc 'D:\suchstrings.txt' | ?{$_ -notmatch '^\s*$'} | %{
02.
    $dest = "c:\zielordner\$($_ -replace '[<>:"/\\|\?\*]','_')"
03.
   if(!(Test-Path $dest)){md $dest -force | out-null}
04.
    gci "c:\Rootordner\$_" -File | copy-item -Destination $dest
05.
}
Bitte warten ..
Mitglied: Lupora
10.10.2019 um 09:18 Uhr
Herzlichen Dank hierfür! Das ist voll nett von dir!

Noch eine Detailfrage: Das Script erstellt in jedem Falle einen Unterordner. Auch wenn es zu dem Suchstring keine Dateien gefunden hat.
Kann man es so abändern, dass es nur einen Ordner erstellt, wenn es tatsächlich auch eine Datei gefunden hat die auf den String matched?

Und letzte Frage:
Kann ich in der Textdatei auch mit dem Wildcard * beliebige Suchstrings zusammen setzen?

z.b.

*Bilder*Oktober*Mon

Er würde dann einen Ordnererstellen der heißt evtl. "Bilder_Oktober_Mon" und dort drin wären Bilder die z.b. heißen
"Fest_Bilder_32434_Oktober_Montag.jpg

Geht das ?
Bitte warten ..
Mitglied: 141320
10.10.2019, aktualisiert um 15:10 Uhr
Klar
01.
gc 'D:\suchstrings.txt' | ?{$_ -notmatch '^\s*$'} | %{
02.
    $files = gci "c:\Rootordner\$_" -File -recurse
03.
    if ($files){
04.
         $dest = "c:\zielordner\$($_ -replace '[<>:"/\\|\?\*]','_')"
05.
         if(!(Test-Path $dest)){md $dest -force | out-null}
06.
         $files | copy-item -Destination $dest -Force -verbose
07.
    }
08.
}
Bitte warten ..
Mitglied: Lupora
10.10.2019 um 15:03 Uhr
irgendwas ist seltsam. Durchsucht die Powershell auch alle Unterordner? Im Zweifel ist der Rootordner ein Ordner mit vielen unterordnern in denen jeweils Bilddateien liegen.

Das Programm scheint nicht zu starten
Bitte warten ..
Mitglied: 141320
10.10.2019, aktualisiert um 15:12 Uhr
Zitat von Lupora:

irgendwas ist seltsam. Durchsucht die Powershell auch alle Unterordner?
Nein diese Anforderung hast du nicht erwähnt, dafür musst du im Get-Childitem Befehl den Parameter -recurse setzen. Hab ich dir oben ergänzt.
Das Programm scheint nicht zu starten
Hier geht's einwandfrei. Du machst also was falsch.
Bitte warten ..
Mitglied: Lupora
10.10.2019 um 15:24 Uhr
Also das Script wird ausgeführt. Meine Suchstring Datei sieht so aus:

*Bilder*
*Registerdaten*Januar

Die Wildcards habe ich selber gesetzt. Sind die falsch? Ich will das er bei *Bilder* alles findet, wo dieser Substring drin sind.

Ist das falsch?
Bitte warten ..
Mitglied: Lupora
10.10.2019 um 15:44 Uhr
Ok, habe es nochmal überprüft. Wenn ich die Sternchen in der Suchstring.txt weglasse, funktioniert es. Kann ich denn mehrere Suchstrings kombinieren?

Also z.B.

Bilder*Oktober*2019

Dann würde er einen Ordner erstellen "Bilder_Oktober_2019" und darin wären folgende Bilder:

Bilder_Canon_Oktober_324234_sdfsdf_2019_TopShot1.jpg
Bilder_Canon_Oktober_324234_sdfsdf_2019_TopShot2.jpg
Bilder_Canon_Oktober_324234_sdfsdf_2019_TopShot3.jpg

geht so etwas ?
Bitte warten ..
Mitglied: 141320
LÖSUNG 10.10.2019, aktualisiert um 17:05 Uhr
Die Wildcards habe ich selber gesetzt. Sind die falsch?
Jepp falsch
Bilder*Oktober*2019
Müsste lauten *Bilder*Oktober*2019*, da ja bei deinen Beispielen am Ende noch andere Strings kommen .
*Bilder*
Das ist korrekt und funktioniert auch!

Solltest du mal lesen
Supported Wildcards for the Windows File System

Tschö.

Erst mal lesen bevor du nur im dunklen stocherst
Bitte warten ..
Mitglied: Lupora
11.10.2019 um 07:40 Uhr
Danke für den Hinweis!

Jetzt noch letzte zwei Fragen: Das Script braucht teilweise sehr lange, da ich wirklich gigantische Ordner Mengen habe (> 5k Ordner).
Frage hierzu: Kann ich in der Powershell ein ECHO ausgeben wie bei CMD? Damit ich sehe wo er gerade steht. Ich starte das SCript und 60 Minuten passiert nichts :/ Ich weiß dann nicht, ob er sich aufgehängt hat oder gerade wo hängt. Kann ich die Ausgabe irgendwie sehen?

Zweite Frage: Kann man das Script auch umbauen (für einen anderen Anwendungsfall): Dass er alle Ordnerstrukturen durchsucht und immer wenn er einen Ordner findet, der auf den Suchstring matched, wird dieser komplett kopiert? Also das er nicht alle Dateien durchsucht. Sondern sucht "Ah, da gibts einen Ordner dessen Name auf meinen Suchstring matched, den kopiere ich in Zielordner" ?
Bitte warten ..
Mitglied: TomTomBon
11.10.2019 um 10:48 Uhr
Moin Moin,

PS unterstützt alle CMD aspekte, auch "echo"

Es gibt natürlich bessere aspekte, inkl. archivierung in eine csv.
Nur da müßte man wirklich gut sein in PS um das aus dem Ärmel zu schütteln, bin ich nicht,
oder das gesamte Skript sehen und einen Ansatz kriegen.

Auch dann muss Ich es mit viel Arbeit analysieren..

So long
Tom
Bitte warten ..
Mitglied: erikro
11.10.2019 um 12:49 Uhr
Moin,

Zitat von Lupora:
Jetzt noch letzte zwei Fragen: Das Script braucht teilweise sehr lange, da ich wirklich gigantische Ordner Mengen habe (> 5k Ordner).
Frage hierzu: Kann ich in der Powershell ein ECHO ausgeben wie bei CMD? Damit ich sehe wo er gerade steht. Ich starte das SCript und 60 Minuten passiert nichts :/ Ich weiß dann nicht, ob er sich aufgehängt hat oder gerade wo hängt. Kann ich die Ausgabe irgendwie sehen?

Dafür gibt es die schöne Funktion write-progress.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

hth

Erik
Bitte warten ..
Mitglied: Friemler
LÖSUNG 11.10.2019, aktualisiert um 15:55 Uhr
Hallo Lupora,

Ich starte das Script und 60 Minuten passiert nichts

Aufgrund dessen könnte es sinnvoll sein, eine alternative Lösung in Batchscript zu testen. Ich habe in dem Code unten bereits Deinen Zusatzwunsch nach dem Anlegen eines Verzeichnisses, das so benannt ist wie die Suchmaske, integriert. Wenn keine Dateien kopiert wurden, wird das Verzeichnis wieder gelöscht.

01.
@echo off & setlocal
02.

03.
:: -----------------------------------------------------------------------------
04.
:: Benutzerkonfiguration
05.
:: -----------------------------------------------------------------------------
06.
set "SuchStrings=C:\SuchStrings.txt"
07.
set "Quelle=C:\RootOrdner"
08.
set "Ziel=C:\Zielordner"
09.
:: -----------------------------------------------------------------------------
10.

11.

12.
:: -----------------------------------------------------------------------------
13.
:: Hauptscript
14.
:: -----------------------------------------------------------------------------
15.
set "VBScript=%TEMP%\ReplaceWildcards.vbs"
16.

17.
call :WriteVBScript
18.

19.
for /f "usebackq delims=" %%a in ("%SuchStrings%") do (
20.
  call :ProcessSearchTerm "%%~a"
21.
)
22.

23.
del "%VBScript%" 2>NUL
24.

25.
exit /b 0
26.

27.

28.

29.
:: -----------------------------------------------------------------------------
30.
:: Unterprogramme
31.
:: -----------------------------------------------------------------------------
32.
:ProcessSearchTerm
33.
  set "SearchTerm=%~1"
34.
  set "DirName="
35.

36.
  for /f "delims=" %%z in ('cscript /nologo "%VBScript%" "%~1"') do (
37.
    set "DirName=%%~z"
38.
  )
39.

40.
  if "%DirName%" equ "" exit /b 0
41.

42.
  md "%Ziel%\%DirName%" 2>NUL
43.
  set /a FilesCopied=0
44.
  
45.
  for /f "delims=" %%z in ('dir /s /b /a:-d "%Quelle%\%SearchTerm%" 2^>NUL') do (
46.
    copy "%%~z" "%Ziel%\%DirName%"
47.
    set /a FilesCopied=1
48.
  )
49.
  
50.
  if %FilesCopied% equ 0 (
51.
    rd "%Ziel%\%DirName%" 2>NUL
52.
  )
53.
exit /b 0
54.

55.

56.
:WriteVBScript
57.
  > "%VBScript%" echo strInput  = WScript.Arguments(0)
58.
  >>"%VBScript%" echo strOutput = Replace(strInput, "*", "_")
59.
  >>"%VBScript%" echo strOutput = Replace(strOutput, "?", "_")
60.
  >>"%VBScript%" echo WScript.Echo strOutput
61.
exit /b 0
Im Abschnitt Benutzerkonfiguration musst Du die Pfade zu Deinen Verzeichnissen und (in Zeile 6) den Pfad zu der Datei mit den Suchstrings eintragen.

Das sollte dann auch Deine Frage von oben beantworten:

Enthält dein Code bereits die Liste die hinterlegt werden muss?
Suche in deinem Code die Stelle wo er die Textdatei einliest?

Die Datei wird im Kopf der FOR-Schleife in Zeile 19 eingelesen (in meinem alten Script von weiter oben war es Zeile 7).

Grüße
Friemler
Bitte warten ..
Mitglied: Lupora
14.10.2019 um 20:53 Uhr
Hallo Friemler,

erstmal WOW !!!! Du hast dir ja mega Mühe gegeben. Herzlichen Dank für deine tolle Arbeit!

Das Skript funktioniert toll. Ich hätte noch einen Verbesserungsvorschlag:

Das Script erzeugt ja Ordner, entsprechend dem Suchstring.
Am Anfang und ENde des Ordnernamens setzt er immer einen Unterstrich. Kann man das noch entfernen?

Die Ordner wo die Bilder drin liegen, sehen immer so aus:

_Oktober_
_BilderausdemUrlaubXY_
Bitte warten ..
Mitglied: Friemler
14.10.2019 um 21:15 Uhr
Hallo @Lupora,

die _-Zeichen werden dort eingesetzt, wo Dein Suchbegriff Wildcard-Zeichen (also * oder ?) enthält, da diese Zeichen für Verzeichnis- bzw. Dateinamen verboten sind.

Aber OK, wenn Du eine Ausnahme für führende und angehängte _-Zeichen haben möchtest, ersetze das Unterprogramm WriteVBScript durch folgenden Code:

01.
:WriteVBScript
02.
  > "%VBScript%" echo strInput  = WScript.Arguments(0)
03.
  >>"%VBScript%" echo strOutput = Replace(strInput, "*", "_")
04.
  >>"%VBScript%" echo strOutput = Replace(strOutput, "?", "_")
05.
  >>"%VBScript%" echo(
06.
  >>"%VBScript%" echo If Left(strOutput, 1)  = "_" Then strOutput = Mid(strOutput, 2)
07.
  >>"%VBScript%" echo If Right(strOutput, 1) = "_" Then strOutput = Mid(strOutput, 1, Len(strOutput) - 1)
08.
  >>"%VBScript%" echo(
09.
  >>"%VBScript%" echo WScript.Echo strOutput
10.
exit /b 0

Was mich noch interessieren würde: Wie lange benötigt mein Batchscript im Vergleich zur PowerShell-Lösung? Um vergleichbare Ergebnisse zu erhalten müsstest Du allerdings zuerst den Befehl

dir /s /b /a:-d "Pfad-des-Quellverzeichnisses\*.*"
in einem CMD.exe-Fenster ausführen. Dadurch füllt der NTFS-Dateisystemtreiber seinen Cache mit den Daten der zu verarbeitenden Verzeichnisstruktur und sowohl mein Batchscript als auch das PowerShell-Script starten mit den gleichen Voraussetzungen.

Grüße
Friemler
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Vergleich von 2 CSV Dateien und Schreiben der Differenz in neue CSV Datei mit batch (cmd)

Frage von FMairhoffBatch & Shell3 Kommentare

Hallo zusammen, ich habe das Problem das ich immer wieder 2 Dateien bekommen mit Sensordaten 01_AA_1bin_bma_OLD.csv sensor_id,sqn,mcu_timestamp,bma_accel_x,bma_accel_y,bma_accel_z,bma_temp,RealTimestamp 6,0,1554376149,93,65,4334,0,2019-04-04 13:09:09 ...

Batch & Shell

Batch-Datei CMD prüfen

Frage von JimmyNailBatch & Shell1 Kommentar

Hallo erstmal alle zusammen. Ich habe folgende Aufgabenstellung. Ich habe eine Batch-Datei, die als Loop läuft. Jedesmal startet diese ...

Batch & Shell

CSV-Datei nach Excel importieren

Frage von mrvfbnummer2Batch & Shell5 Kommentare

Hallo Leute, ich möchte CSV-Dateien in eine Excel-Datei mit PowerSell importieren. Ich habe bereits viel ausprobiert aber habe noch ...

Batch & Shell

Per batch datei CSV auslesen

gelöst Frage von Newplay123Batch & Shell10 Kommentare

Hallo, ich will mit einer Batch dabei eine .csv datei auslesen. Dafür benutzt ich diesen Code: In der CSV ...

Neue Wissensbeiträge
Humor (lol)
Das IoT wird schlimmer
Erfahrungsbericht von Henere vor 20 StundenHumor (lol)3 Kommentare

Nun auch schon über den WSUS:

Sicherheit

Win10 1809 und höher erlauben nun das Sperren und Whitelisten von bestimmten Geräten

Tipp von DerWoWusste vor 1 TagSicherheit1 Kommentar

Vor 1809 konnten nur Geräteklassen gesperrt werden, nun können endlich einzelne Device instance IDs gewhitelistet werden (oder andersherum: gesperrt ...

Windows 10

Hands-On: What is new in the Windows 10 November 2019 Update?

Information von DerWoWusste vor 1 TagWindows 10

Die wenigen (aber zum Teil interessanten) Neuheiten werden in diesem Video sehr schnell erklärt und vorgeführt.

Grafik

Gute Spiele aus der Ubuntu Repository: SuperTuxKart

Information von NetzwerkDude vor 2 TagenGrafik2 Kommentare

Fall jemand die Firmenpolicy hat das man Linux Software nur aus dem default Repository installieren kann: Ich habe festgestellt ...

Heiß diskutierte Inhalte
Ubuntu
Ubuntu-Putty hilfe
gelöst Frage von Nickolas.GroheUbuntu53 Kommentare

Hallo Wie ändere ich einen ssh Port auf Linux Ubuntu? LG Nickolas

Windows 7
Festplatte in einen anderen PC umziehen lassen
Frage von Ghost108Windows 729 Kommentare

Hallo zusammen, ich bekomme die nächsten Tage einen neuen PC (komplett andere Hardware als in meinem jetzigen) Was für ...

LAN, WAN, Wireless
10G Netzwerk konfigurieren für maximalen Datendurchsatz
Frage von hukimanLAN, WAN, Wireless29 Kommentare

Guten Morgen, in unserem Betrieb wurde das Netzwerk auf 10G (Kupfer) umgerüstet. Grund dafür sind große Laserscandaten die sehr ...

Microsoft Office
Abfrage ist beschädigt. Error-Code 3340 in Access2013
gelöst Frage von RomualdMicrosoft Office16 Kommentare

Hallo Foren-Mitglieder, ich hätte da mal ein Problem Seit heute am Morgen (13.11.2019) erhalte ich die Fehlermeldung "Abfrage '' ...