2016-10-14 2 views
2

Ich habe versucht, ein Stapelscript zu schreiben, das alle Pfade von Dateien findet, die denselben Namen wie die Eingabezeichenfolge haben. Im Moment kann es nur die erste gefundene Datei finden, und ich kann mir keine Möglichkeit vorstellen, mehrere Dateien aufzulisten. Ich bin nicht sehr erfahren und brauche Hilfe.Suche nach mehreren Dateipfaden mit einer einzelnen Zeichenfolge

dies ist Teil des Script-Code:

:start 
    cls 
    echo Enter file name with extension: 
    set /p filename= 
    echo Searching... 

for %%a in (C D E F G H U W) do (
    for /f "tokens=*" %%b in ('dir /s /b "%%a:\%filename%"') do (
     set file=%%~nxb 
     set datapath=%%~dpb\ 
     ::the path of the file without the filename included "C:\folder\folder\" 
     set fullpath=%%b 
     ::the path of the file with the filename included "C:\folder\folder\file" 
     goto break 
) 
) 
:notfound 
    cls 
    echo Enter file name with extension: 
    echo %filename% 
    echo File Not Found! 
    ping localhost -n 4 >nul 
    goto start 

:break 
    if "%datapath:~-1%"=="\" set datapath=%datapath:~,-1% 
    cls 
    echo 3 %filename% found 
    echo %fullpath1% 
    echo %fullpath2% 
    echo %fullpath3% 
    --- || --- 

Ich mag das Skript den Computer durchsuchen und alle auftretenden Dateien mit dem gleichen Namen auflisten und ich möchte in der Lage sein, diese Dateien Pfade in verschiedenen setzen Variablen.
Zum Beispiel, wenn readme.txt die Eingabe ist, dann möchte ich die Liste aller Pfade aller Dateien mit diesem spezifischen Namen (readme.txt) und ich möchte die Variable für jeden Pfad festlegen, so dass ich es nach verwenden kann Das.

input: 
readme.txt 

output: 
3 files found 
C:\folder\folder\readme.txt 
C:\folder\folder\folder\readme.txt 
D:\folder\readme.txt 
+0

'für %% einer in (CDEFGHUW) tun dir/s/b% % a: \% Dateiname% 2> nul' - kurz genug? – Stephan

+0

ja, es ist gut. Das Problem ist jedoch, dass das Skript auch die Möglichkeit hat, die Datei zu kopieren oder zu löschen. Deshalb habe ich den vollständigen Pfad und den Datenpfad hinzugefügt, aber mit dieser Zeile listet er sie einfach auf und ich kann die Pfade nicht verwenden. Aber danke für deine Hilfe! –

Antwort

0
@echo off 
set filename=readme.txt 
for %%a in (C D E F G H U W) do (
    for /f "tokens=*" %%b in ('dir /s /b "%%a:\%filename%"') do (
    echo you can do something here with %%~nxb in %%~dpb 
    echo full name: %%b 
) 
) 

Ich sehe keine Notwendigkeit, die Dateinamen Variablen zu setzen, wie Sie sie in Ihrer Schleife verarbeiten können. Aber wenn Sie wirklich brauchen (aus irgendeinem Grund) in Variablen:

@echo off 
setlocal enabledelayedexpansion 
set filename=readme.txt 
set count=0 
for %%a in (C D E F G H U W) do (
    for /f "tokens=*" %%b in ('dir /s /b "%%a:\%filename%" 2^>nul') do (
    set /a count+=1 
    set _file[!count!]=%%b 
) 
) 
set _file 
+0

Danke! aber das löste nur das Längen- und Effizienzproblem ... Ich brauche immer noch Hilfe bei den mehreren Dateien mit dem gleichen Namen ... –

+0

verstehe ich nicht; Jede Suche ist einzigartig (Laufwerk + Pfad + Dateiname + Erweiterung). Wenn Sie nur den Dateinamen verwenden möchten, sollten Sie in der Lage sein, etwas [hier] hilfreich zu finden (http://stackoverflow.com/search?q=%5Batch-file%5D+copy+ohne Overwrite). – Stephan

+0

Ich möchte, dass das Skript den Computer durchsucht und alle gefundenen Dateien mit demselben Namen auflistet, und ich möchte die Pfade dieser Dateien in verschiedene Variablen einfügen können. Wenn zum Beispiel readme.txt die Eingabe ist, dann möchte ich die Liste aller Pfade aller Dateien mit diesem spezifischen Namen (readme.txt) und ich möchte die Variable für jeden Pfad setzen, damit ich sie danach verwenden kann. –

0

Sie können mit diesem Code versuchen:

@echo off 
Title Searching for the path with the same file name 
Mode con cols=80 lines=3 & Color 9E 
SET /a Count=0 
set /a cnt=1 
set "FileName=Readme.txt" 
set "Report=%~dp0Report.txt" 
set "Folder2Copy=%~dp0Readme_Folder" 
set "Result2Copy=%~dp0Result2Copy.txt 
If exist %Folder2Copy% RD /S /Q %Folder2Copy% 
If Exist %Report% Del %Report% 
If Exist %Result2Copy% Del %Result2Copy% 
echo(
Echo    Searching for the path with the same file name 
Rem Looking for fixed drives and store them into variables 
SETLOCAL enabledelayedexpansion 
For /f "skip=1" %%a IN ('wmic LOGICALDISK where driveType^=3 get deviceID') DO (
    for /f "delims=" %%b in ("%%a") do (
    SET /a "Count+=1" 
    set "Drive[!Count!]=%%b" 
    ) 
) 

:Display 
for /L %%i in (1,1,%Count%) do (
    cls 
    Title Please wait a while ... Searching for "%FileName%" on "!Drive[%%i]!\" 
    echo(
    echo   Please wait a while ... Searching for "%FileName%" on "!Drive[%%i]!\" 
    Call :FindPathFile !Drive[%%i]!\ %FileName% >> %Report% 
) 
Start "" %Report% 
Goto :AskQuestion 
::*************************************************************************************** 
:FindPathFile <Location> <FileName> 
Where.exe /r %1 %2 
Goto :eof 
::*************************************************************************************** 
:AskQuestion 
cls & Mode con cols=100 lines=5 
echo(
echo Did you want to make copy of all files found as name "%FileName%" 
echo saved on "%Report%" ? (Y/N) ? 
set /p "Input=" 
If /I "%INPUT%"=="Y" (
    for /f "delims=" %%i in ('Type "%Report%"') do (
     Call :MakeCopy "%%~i" "%Folder2Copy%\" 
    ) 
) 
Call :Explorer "%Folder2Copy%\" & exit 
If /I "%INPUT%"=="N" (
     Exit 
) 
Goto :eof 
::*************************************************************************************** 
:MakeCopy <Source> <Target> 
If Not Exist "%~2\" MD "%~2\" (
    if not exist "%2\%~n1" ( 
    echo copying "%~1" to "%~2" 
    copy /N /B "%~1" "%~2" >>%Result2Copy% 2>&1 
    ) else ( 
     call :loop "%~1" "%~2" 
    ) 
) 
::*************************************************************************************** 
:loop 
set "fname=%2\%~n1(%cnt%)%~x1" 
if exist "%fname%" set /a cnt+=1 && goto :loop 
copy "%~1" "%fname%" 
exit /b 
::*************************************************************************************** 
:Explorer <file> 
explorer.exe /e,/select,"%~1" 
Goto :EOF 
::*************************************************************************************** 
+1

Es hat gut funktioniert, danke! Ich verstehe nur einige der Dinge im Code nicht. Wie auch immer, ich habe einen Weg gefunden, mehrere Wege zu haben, indem ich Schleifen benutze und eine zu der Zeit finde und sie in eine Variable setze, die sich ändert, nachdem ich die nächste gefunden habe. Nicht sehr effizient, aber auch nicht sehr kompliziert. –

Verwandte Themen