Fehlt ein Platzhalter, damit dieser Batch-Prozess alle Unterordner durchsucht?

Fehlt ein Platzhalter, damit dieser Batch-Prozess alle Unterordner durchsucht?

Ich habe mir Skriptteile aus dem Internet zusammengesucht und etwas erstellt, das alle Ordner unter einem übergeordneten Ordner durchsucht, bestimmte Dateien findet und sie an einen neuen Speicherort kopiert. (Wir haben ein Verzeichnis mit unzähligen leeren und belegten Ordnern und versuchen, eine Handvoll Dateien zu finden, ohne manuell zu suchen.)

Bisher funktioniert das Skript, aber nur, wenn sich die benannten Dateien (aus dem Dokument Names.txt) direkt im übergeordneten Ordner (...\source) befinden. Wenn sie sich in einem der Ordner innerhalb des übergeordneten Ordners (...\source\folder1\folder2\etc) befinden, werden sie nicht durchsucht und es wird nichts ausgegeben. Was übersehe ich?

@echo off
pushd C:\Users\username\Desktop\TestBatches
set /p SourceFolder=Enter the path of source folder and press 'Enter':
cls
for /f "tokens=* delims=" %%a in ('type Names.txt') do xcopy /hrkvy "%SourceFolder%\%%a" ".\destination"
popd
pause

Setze ich beim Eingeben des Quellpfads in der Eingabeaufforderung ein Platzhalterzeichen ein? Oder gebe ich etwas in den Stapel ein, das dies automatisch erledigt?

Ich bin etwas ratlos. Danke für die Hilfe!

Antwort1

Ich werde Sie hier direkt zu einigen fortgeschrittenen Batch-Konzepten führen.
Im folgenden Beispiel verwende ich BatchFunktionenum diese Aufgabe zu erfüllen. Dies ist nicht der effizienteste Weg, um das Ziel zu erreichen, aber es wird Ihnen die Dinge zeigen, die SieDÜRFENtun. Ich bin immer noch sehr müde, also ist diese Lösung vielleicht dumm (aber sie funktioniert)

Auch wenn Sie diesen Weg nicht gehen, vielleicht "dir /s /b FILEMASK" war das, wonach Sie gesucht haben.

@echo off
:: This assumes that this batch is in the same folder as Names.txt and the .\destination folder
:: This batch DOES NOT check things it should like the existence of %SourceFolder% or if .\destination even exists
Set ThisDir=%~DP0
Set DestinationDir=%ThisDir%\destination
Set NamesFile=%ThisDir%\Names.txt
Set /p SourceFolder=Enter the path of source folder and press [Enter]:
for /f "delims=" %%a in ('type %NamesFile%') do call :SearchName "%%a"
pause
goto :EOF

:: ----------------------------------------------------------------
:SearchName
pushd %SourceFolder%
for /f "delims=" %%f in ('dir /s /b %1') do call :FoundFile "%%f"
popd
goto :EOF

:: ----------------------------------------------------------------
:FoundFile
xcopy /hrkvy "%1" "%DestinationDir%"
goto :EOF

Die erste for-Schleife tut nichts anderes, als eine Funktion aufzurufen:Suchnamefür jeden der Namen in Ihrer Textdatei.

Der:SuchnameFunktion wechselt in das durch "Set /p" angegebene Verzeichnis und führt ein "dir /s /b NAME_PASSED_FROM_TEXT_FILE" aus. Es pumpt die Zeilen, die es erhält (gefundene Dateien), in ein:GefundeneDateiFunktion.

Der:GefundeneDateiFunktion kopiert die ihr übergebene Datei.

verwandte Informationen