2016-11-08 1 views
1

Ich möchte ein Batch-Skript erstellen, das eine Liste aller Dateien in einem Verzeichnis erstellen wird.Batch-Skript, um eine Liste aller Dateien in mehreren Unterverzeichnissen zu erhalten

Bisher ist hier, was ich habe:

@echo off 

dir c:\users\documents\* /b > filelist.txt 

Das perfekt mit einem kleinen Haken funktioniert. Die Dateien, die ich für die Liste erhalten möchte, sind in mehrere Benutzerverzeichnisse eingebettet, die in zwei Verzeichnissen (A-L/M-Z) eingebettet sind. Ich kann die zwei alphabetischen Verzeichnisse leicht umgehen, indem ich einfach zwei Zeilen dafür schreibe. Ich bin mir jedoch nicht sicher, wie ich eine Liste der Dateien in den Unterverzeichnissen bekommen soll.

BONUS: Dies ist ein zusätzliches Bit, das ich noch nicht erforscht habe, aber dachte, ich würde es dort hineinwerfen. Ich werde versuchen, dieses Skript zu bekommen, um die "filelist.txt" an eine E-Mail anzuhängen und sie automatisch zu senden.

EDIT: Vergessen Sie ein viel wichtiger Bonus-Problem.

Hier ist eine wirklich erbärmliche Illustration der Dateistruktur.

enter image description here

Ich möchte in der Lage sein, eine Liste zu haben, die das übergeordnete Verzeichnis zu den Dateien zeigt so, dass es so etwas wie dies in der filelist.txt auftauchen würde: „A Name \ File1.ext "

EDIT: Mit dir /b/s scheint alle Unterverzeichnisse, Dateien aufzulisten und gibt die vollständige Pfadlänge. Gibt es eine Möglichkeit, nur eine Liste zurückzugeben, wenn sich etwas in einem bestimmten "Namensverzeichnis" befindet? Also, wenn alles andere als „D-Name“ leer ist, wird es nur zurückkehren

\D Name\file1.ext 
\D Name\file2.ext 
+0

Geben Sie 'dir /?' Ein und lesen Sie die Hilfe. Das ist eine dumme Frage. –

Antwort

1

alle Unterverzeichnisse rekursiv zu suchen, verwenden Sie den /s Schalter für dir.

Aber ich kenne keine Möglichkeit, eine E-Mail von einer Batchdatei ohne zusätzliche Programme zu senden. Wenn Sie nicht mit der Idee, Batchdateien zu verwenden, verheiratet sind, können Sie dies einfach mit PowerShell tun (und ich empfehle diese Methode, da PowerShell der Weg für Microsoft ist).

Get-ChildItem -File -Recurse | Select-Object -ExpandProperty FullName | Out-File -FilePath c:\filelist.txt; 
Send-MailMessage -To YOURADDRESS -From YOURADDRESS -SmtpServer YOURSMTPHOST -Subject Filelist -Attachments c:\filelist.txt; 
+0

Es ist mehr eine Frage der Einfachheit der Charge. Wenn ich damit durchkommen kann, wird es viel einfacher sein, dies zu tun, wenn ich keine Programme installieren muss. Mindestens eine Maschine, auf der ich das tun muss, ist nicht mit dem Internet verbunden. – David

+0

Sie müssen nichts installieren - PowerShell ist seit Windows 7 Teil von Windows (und ist bis zu XP als separate Installation verfügbar). Wenn Sie über Systeme verfügen, auf denen PowerShell noch nicht installiert ist, liegen sie wahrscheinlich ohnehin hinter EOL und sollten trotzdem ersetzt/aktualisiert werden. Was für eine Maschine, die nicht mit dem Internet verbunden ist, wie haben Sie geplant, die E-Mail zu versenden, unabhängig davon, ob es sich um eine Charge zu PS handelt? Batch ist tot - PowerShell macht moderne Windows-Automatisierung möglich. – alroc

+3

Wenn der Stapel leer ist, warum hat MS in Windows 10 neue Funktionen zu cmd.exe hinzugefügt? Alles hat seine Stärken und Schwächen. – Squashman

1

dir hat keinen Code, um einen Teil zu entfernen, der sie ausgegeben ist. Deshalb müssen Sie seinen Ausgang mit einem for Schleife analysieren, die die Entfernung tut:

@echo off 
setlocal enabledelayedexpansion 
pushd "c:\users\documents\" 
(
    for /r %%a in (*) do (
    set x=%%a 
    echo !x:%cd%=! 
) 
)>filelist.txt 
popd 

für die automatische Mails finden Sie auf unserer search function, die gut in der oberen rechten Ecke dieser Seite versteckt ist (bitte nicht sagen, jeder oder wir werden viel weniger Duplikate bekommen ;)).

EDIT für I don't suppose there's anyway I can limit how far down in subdirectories this works?
wo ein Wille ist, ist es eine Möglichkeit, ...

@echo off 
setlocal enabledelayedexpansion 
set /p lv="max Levels deep [0...n]= " 
set /a lv+=2 
pushd "c:\users\theo\" 
(
    for /r %%a in (*.bat) do (
    set x=%%a 
    set x=!x:%cd%=! 
    for /f "tokens=1,%lv% delims=\" %%b in ("!x!") do if "%%c"=="" echo !x! 
) 
)>filelist.txt 
popd 

Eine Eingabe von "0" bedeutet "in diesem Ordner nur, kein Unterordner"; "2" bedeutet "in diesem Ordner und seinen Unterordnern, max. Tiefe = 2"

Der innere for prüft, ob das Token "% lv% + 2" (also set /a lv+=2) leer ist.Wenn ja, ist die Tiefe kleiner oder gleich %lv% und die Zeichenfolge wird angezeigt. Wenn es nicht leer ist, ist die Tiefe größer als %lv% - kein Echo.

+0

Das scheint nichts anderes zu tun als 'Verzeichnis c: \ Benutzer \ Dokumente \ */b/s> Dateiliste.txt' Ich bekomme immer noch eine Textdatei, die eine Liste aller Unterverzeichnisse enthält, Dateien in denen Unterverzeichnisse, Verzeichnisse in diesen Unterverzeichnissen usw. – David

+0

NVM Ich hatte etwas falsch. Dies funktioniert größtenteils. Ich nehme an, dass es sowieso keine Beschränkungen gibt, wie weit unten in Unterverzeichnissen das funktioniert. Wo es nur 1 oder 2 Ebenen nach unten zeigt? – David

+0

"Ja, wir können" - * Barrack Obama *. "Wir schaffen das" - Angela Merkel * - siehe meine Bearbeitung, bitte. – Stephan

Verwandte Themen