2016-03-24 1 views
0

Ich werde das praktische Beispiel zuerst, so dass Sie verstehen, was ich tue. Bitte beachten Sie, dies ist auf meinem Computer und Netzwerk, so dass ich keine Administratorrechte habe.Batch durchsuchen ein Verzeichnis für mehrere Dateinamen

Ich habe eine Liste von Elementen - etwa 1000 Zeilen, derzeit in Excel. Ich habe es ein wenig normalisiert, um Zeichen zu entfernen, die möglicherweise in einer Datei enthalten sind, die auf diese Elemente verweist. Ich habe Zugang zu einem Verzeichnis (über Windows Explorer oder Sharepoint), das bestimmte Dokumente enthält, die diesen Elementen zugeordnet werden können (wenn wir Informationen darüber haben). Dieses Verzeichnis ist wie folgt gegliedert:

  • A:
    • \ A
      • \ Armadillo
        • Armadillo.doc
      • \ Armee
        • Army.doc
    • \ B
      • \ Bull
        • Bull.doc

Ich möchte eine Batch-Suche durchführen, um herauszufinden, ob es einen Datei- oder Verzeichnisnamen gibt, der mit einer Textzeile übereinstimmt, und dies dann für die gesamten 1000 Zeilen.

Zum Beispiel, sagen meine Datei folgende Zeilen Text hat:

Armadillo 
Army 
Baby 
Bull 

Und davon ausgehen, das Verzeichnis hat Dateien, die Armadillo, Armee passen, und Bull, aber nicht Baby-.. Ich würde die Ausgabe wie die Dateinamen und der Ort zum Detail, zum Beispiel:

Armadillo  A:\A\Armadillo\Armadillo.doc 
Army   A:\A\Army\Army.doc 
Baby 
Bull   A:\B\Bull\Bull.doc 
...and so on for every line. 

ich mag nur das Zielverzeichnis und Bericht über das Spiel lesen (oder keine Übereinstimmung) - keine Änderung der Datei zu löschen. Ich muss nicht in die eigentlichen Dateien schauen, nur Dateinamen. Ich möchte auch nichts tun, was das Dateisystem verändern könnte. Ich möchte nur einen Prozess automatisieren, der Zeile für Zeile manuell ausgeführt werden kann.

Ich bin sicher, es gibt eine Reihe von Möglichkeiten, dies mit Makros in Excel, Find in Dateien in Notepad ++, Grep usw. zu tun. Ich habe viele Stunden nach einer Lösung für genau dieses Problem suchen, aber alle Lösungen scheinen ein ähnliches Problem zu lösen, aber nicht exakt. Ich hoffe, dass es einen einfachen Weg gibt, dies zu tun, ohne das Dateisystem zu verändern oder signifikante Last zu verursachen.

+1

'Ich habe viele Stunden damit verbracht, nach einer Lösung zu suchen' Was funktioniert nicht? – findwindow

Antwort

0
for /f "delims=" %A in (filename.txt) do dir /s /b "c:\startingdir\%A" >> results.txt 

Siehe for /? und dir /? um Hilfe. >> bedeutet, an eine Datei anhängen.Verwenden Sie in einer Stapeldatei %%A statt %A, wenn Sie interaktiv eingeben.

& ermöglicht mehrere Befehle.

for /f "delims=" %A in (filename.txt) do echo %A & dir /s /b "c:\startingdir\%A" >> results.txt 
+1

Sie müssen Ihrer DIR-Dateimaske einige Platzhalterzeichen hinzufügen. – dbenham

+0

Nicht in dieser Datei, da die Datei Dateinamen hat. –

+0

Ihr DIR schlägt fehl, weil Armadillo nicht mit Armadillo.doc übereinstimmt. Außerdem überprüfen Sie nicht, dass Armadillo.doc in einem Ordner namens Armadillo ist. Siehe [meine Antwort] (http://stackoverflow.com/a/36262300/1012053) – dbenham

0

Dies tut alles, aber die Dateinamen ausrichten. Es gibt einige subtile Randfälle, die Probleme verursachen könnten, wie "c: \ startingdir \ Armadillo \ Armadillo.x \ somefile" oder "c: \ sartingdir \ Armadillo \ Armadillo.x.txt". Aber ich vermute, das ist gut genug für Ihre Bedürfnisse.

@echo off 
for /f "useback eol=: delims=" %%D in ("file.txt") do (
    for /f "eol=: delims=" %%F in (
    'dir /b /a-d /s "c:\startingdir\%%D.??????????????" 2^>nul^|findstr /li "\\%%D\\%%D."' 
) do echo %%D %%F 
) || echo %%D