2016-10-03 4 views
3

Ich versuche, mehrere Zeichenfolgen in Dateien in einem Verzeichnis zu finden, gibt es Tausende. Ich führe derzeit den folgenden Befehl durch, um das Verzeichnis zu durchsuchen:Batch-Datei, um mehrere Zeichenfolgen mit Findstr zu finden und Dateien in einen Ordner kopieren

findstr /s "customerid" * 

Jetzt kann ich die Datei finden, die diese Zeichenfolge enthält. Ich habe normalerweise zwei Informationen, eine Kundennummer und einen Ereignistyp. Ein Kunde kann bis zu 30 assoziierte Veranstaltungen wie "Website-Registrierung" haben.

Was ich möchte ist, durchsuchen Sie das Verzeichnis für die Kunden-ID und das Ereignis. Kopieren Sie dann die Datei an einen neuen Speicherort. Ist das in einer Batch-Datei möglich?

+0

Werfen Sie einen Blick darauf [Durchsuchen Sie die XML-Dateien im Verzeichnis nach einer bestimmten Zeichenfolge, kopieren Sie dann die Aktion mit dem Bat-Skript] (http://stackoverflow.com/questions/39577430/search-xml-files-in-directory-for -specific-string-then-do-copy-action-using-bat/39579775 # 39579775) – Hackoo

+0

Das ist ein wenig zu verwirrend, ich kenne nur einige einfache Befehle :( – anallyexcel

+0

So versuchen Sie, eine Art von UND-Operation zu tun , also werden nur Dateien kopiert, die beide Suchzeichenfolgen enthalten, richtig? Ist die Position der Suchzeichenfolgen (Kunde, Ereignis) innerhalb der Dateien wichtig? Es wäre auch hilfreich, einen Textdateiausschnitt mit den Übereinstimmungen zu teilen im Text, oder sind sie volle Wörter? – aschipfl

Antwort

3

Angenommen, Sie alle Dateien finden wollen, die beide Wörter enthalten (customer und event in diesem Beispiel), können Sie das folgende Skript verwenden:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "PATTERN=*.txt" 
set "SOURCE=." 
set "TARGET=D:\Data" 
set "STRING1=customer" 
set "STRING2=event" 

pushd "%SOURCE%" && (
    for /F "delims=" %%F in ('findstr /S /M /I /R /C:"\<%STRING1%\>" "%PATTERN%"') do (
     for /F "delims=" %%E in ('findstr /M /I /R /C:"\<%STRING2%\>" "%%F"') do (
      ECHO copy "%%E" "%TARGET%\%%~nxE" 
     ) 
    ) 
    popd 
) 

endlocal 
exit /B 

Nachdem das Skript getestet haben, entfernen Sie die obere -Koffer ECHO vor dem Befehl copy!

2
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "sourceFolder=x:\somewhere" 
    set "targetFolder=y:\another\place" 

    set "customerID=00000000" 
    set "event=eeeeeeeeee" 

    for /f "delims=" %%a in (' 
     findstr /m /s /l /c:"%customerID%" "%sourceFolder%\*" 
     ^| findstr /f:/ /m /l /c:"%event%" 
    ') do (
     ECHO copy "%%~fa" "%targetFolder%" 
    ) 

findstr kann damit umgehen. Wir brauchen nur zwei Instanzen

  1. Die erste wird alle Eingabedateien für die erste Zeichenfolge durchsuchen und nur die Liste der übereinstimmenden Dateien zurückgeben. Diese Liste von Dateien wird in die zweite Instanz geleitet
  2. Die zweite wird die zweite Zeichenfolge suchen, aber nur in den Dateien von der ersten Instanz gefunden, die Liste der Dateien aus dem Standard-Eingangsstrom (/f:/)
  3. zu lesen Der Rest des Codes ist nur ein for /f Wrapping der zwei findstr Befehle, um die Ausgabe des zweiten zu verarbeiten und die Kopie der Datei zu tun.

Nachdem Sie das Skript getestet haben, entfernen Sie den Großbuchstaben vor dem Befehl copy!

+0

Argh, ich habe die '/ F'-Option völlig vergessen ... das scheint der einzige Weg zu sein, nur eine 'for/F'-Schleife zu haben ... +1! – aschipfl

+1

@aschipfl, Manchmal sehe ich nicht die Welt, die mir aus dem Kopf läuft und vergess, das OBVIOUS (wieder in meinem Kopf) einzuschließen * ... entferne das Echo ... *. Vielen Dank. –

Verwandte Themen