Войти

Показать полную графическую версию : [решено] Поиск файлов в папке и вывод их списка под номерами


Страниц : [1] 2 3

Alex S
07-02-2019, 23:47
Всем привет.
Долго пытаюсь сам решить задачу но не получается, поиск в интернете тоже результата не дал...
Прошу помощи у знающих людей.
Нужно написать скрипт сканирующий директорию на наличие файлов определенного расширения. После определения наличия файлов с нужным расширением, вывести их список с присвоением каждому найденному файлу порядкового номера.
Объясню зачем и как это в планах должно работать.
Скрипт при запуске ищет в директории файлы по расширению(в моём случае *.wim), выводит список найденных файлов присвоив им порядковые номера. Затем используя ":choice" выбирается один из найденных для дальнейшей работы с ним...

Найти не проблема, вывести список тоже, но как из списка сделать выбор одного не знаю как реализовать.

@echo off
set BootFile=%SYSTEMDRIVE%\Work\Image\sources
echo Проверка наличия файлов:
echo.
for /f "tokens=* delims=" %%a in ('dir /b /a-d "%BootFile%\Boot*.wim" ') do (
echo.%%~a
)
pause

megaloman
08-02-2019, 08:52
Alex S, @Echo Off
cls
Set "BootFile=%SYSTEMDRIVE%\Work\Image\sources"
Set "Mask=Boot*.wim"

Call :FileName "%BootFile%\%Mask%" "FName" ||Exit /B 1
Echo %FName%
pause
GoTo :Eof

:FileName
SetLocal
Set /A N=0
Set "Spis="
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /b /a:-D "%~1"`) DO Set /A N+=1 &(Call Set "@%%N%%=%%f" &Call Set "Spis=%%Spis%%%%N%%")
If %N%==0 (Echo Files not found "%~1" &Pause &Exit /B 2)

Echo ===== Найдено %N% файлов =====&Echo.
FOR /F "usebackq tokens=* delims=@" %%f IN (`2^>nul Set "@"`) DO Echo %%f
Echo.

Set /A NExit=%N%+1
Set "Spis=%Spis%0"
CHOICE /C %Spis% /N /M "Выберите номер файла, 0(нуль)-Завершить командный файл"
If %ErrorLevel%==%NExit% Exit /B 1
Call Set "@FName=%%@%ErrorLevel%%%"
EndLocal& Set "%~2=%@FName%"
Exit /B 0

YuS_2
08-02-2019, 09:38
Найти не проблема, вывести список тоже, но как из списка сделать выбор одного не знаю как реализовать. »
Надо понимать так, что проблема с нумерацией найденного?
Сделать можно так:
dir /b /a-d "%BootFile%\Boot*.wim"|findstr /n "."

@echo off
set "src=d:\111\Boot*.wim"

:begin
cls
for /f "tokens=1* delims=:" %%a in ('dir /b/a-d "%src%"^|findstr /n "." ') do echo.%%~a - %%b
set "var="
set "b= "
echo.
set /p "b=Введите число, для выбора файла: "
set "b=%b:"=%"
if "%b%"=="" (echo это не число&pause&goto begin)
echo."%b%"|>nul findstr /rc:"[&|^%%]"&&(echo это не число&pause&goto begin)
if "%b:~,2%"=="0x" (
echo.%b:~2%|>nul findstr /rc:"[^0-9a-f]"&&(echo это не число&pause&goto begin)
) else (
echo.%b%|>nul findstr /rc:"[^0-9]"&&(echo это не число&pause&goto begin)
)
set /a c=b
if %c% equ 0 if not %c% equ %b% (echo некорректное число&pause&goto begin)

for /f "tokens=1* delims=:" %%a in ('dir /b/a-d "%src%"^|findstr /n "." ') do if %c% equ %%~a set "var=%%~b"
echo.
if not defined var (echo Не существует файла с таким номером&pause&goto begin)

echo.Выбор сделан: "%var%"
pause

megaloman
08-02-2019, 10:40
Alex S, @Echo Off
cls
Set "BootFile=%SYSTEMDRIVE%\Work\Image\sources"
Set "Mask=Boot*.wim"

Call :FileName "%BootFile%\%Mask%" "FName" ||Exit /B 1

Echo %FName%
pause
GoTo :Eof

:FileName
SetLocal
Set /A N=0
Set "Spis="
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /b /a:-D "%~1"`) DO (
Set /A N+=1
Call :Symbol %%N%% "SS"
Call Set "@%%SS%%=%%f"
Call Set "Spis=%%Spis%%%%SS%%"
)
If %N%==0 (Echo Files not found "%~1" &Pause &Exit /B 2)
Echo ===== Найдено %N% файлов =====&Echo.
FOR /F "usebackq tokens=* delims=@" %%f IN (`2^>nul Set "@"`) DO Echo %%f
Echo.

Set /A NExit=%N%+1
Set "Spis=%Spis%0"
CHOICE /C %Spis% /N /M "Выберите номер файла, 0(нуль)-Завершить командный файл"
If %ErrorLevel%==%NExit% Exit /B 1
Call :Symbol %ErrorLevel% "SS"
Call Set "@FName=%%@%SS%%%"
EndLocal& Set "%~2=%@FName%"
Exit /B 0

:Symbol
Set "S=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Call Set "%~2=%%S:~%1,1%%"
Exit /B

Alex S
08-02-2019, 10:51
megaloman, YuS_2 спасибо большое за помощь. Оба варианта прекрасно работают.

YuS_2
08-02-2019, 11:00
Если файлов 1<=N<=35 »
а если их 350 или не дай бог 3500 ? :)
Вопрос риторический, если что...

Alex S
08-02-2019, 12:38
А вот появился новый вопрос. Копаюсь тут и не нахожу решения.
Можно ли сделать чтобы последним пунктом, после поиска всегда был пункт выхода из скрипта?

YuS_2
08-02-2019, 13:40
Можно ли сделать чтобы последним пунктом, после поиска всегда был пункт выхода из скрипта? »
Отчего же нельзя... можно.
@echo off
set "src=d:\111\Boot*.wim"

:begin
cls
echo.----------------------------------------------------------------------
for /f "tokens=1* delims=:" %%a in ('dir /b/a-d "%src%"^|findstr /n "." ') do echo.%%~a - %%b
echo.0 - Выход
echo.----------------------------------------------------------------------
set "var="
set "b= "
echo.
set /p "b=Введите число, для выбора файла: "
set "b=%b:"=%"
if "%b%"=="" (echo это не число&pause&goto begin)
echo."%b%"|>nul findstr /rc:"[&|^%%]"&&(echo это не число&pause&goto begin)
if "%b:~,2%"=="0x" (
echo.%b:~2%|>nul findstr /rc:"[^0-9a-f]"&&(echo это не число&pause&goto begin)
) else (
echo.%b%|>nul findstr /rc:"[^0-9]"&&(echo это не число&pause&goto begin)
)
set /a c=b
if %c% equ 0 (if %c% neq %b% (echo некорректное число&pause&goto begin) else (echo.Выходим&pause&exit /b))

for /f "tokens=1* delims=:" %%a in ('dir /b/a-d "%src%"^|findstr /n "." ') do if %c% equ %%~a set "var=%%~b"
echo.
if not defined var (echo Не существует файла с таким номером&pause&goto begin)

echo.Выбор сделан: "%var%"
pause&exit /b

Alex S
08-02-2019, 13:52
YuS_2 спасибо!
Вопросов больше нет, тема решена.

Iska
08-02-2019, 18:14
…|findstr /n "." »
Кстати — логично!

alpap
09-02-2019, 02:13
подкину и я:

@echo off
set "d=C:\Papka"
set "ext=txt"

for /f "tokens=1* delims=[]" %%a in ('dir /a-d/b/s "%d%\*.%ext%"^|find /n /v ""') do set "$_%%a=%%b"
for /f "tokens=2* delims=_=" %%a in ('set $_') do echo Нажать: %%a [для выбора "%%~nxb"]
echo:& set /p n=
call :# "%%$_%n%%%"
pause>nul& exit

:#
echo Действия над: "%~1"
exit /b


можно и так, но менее красиво (или кому как)

@echo off
set "d=C:\Papka"
set "ext=txt"

for /f "tokens=1* delims=[]" %%a in ('dir /a-d/b/s "%d%\*.%ext%"^|find /n /v ""') do set "$_%%a=%%b"
for /f "tokens=2* delims=_=" %%a in ('set $_') do echo Нажать: %%a [для выбора "%%~nxb"]
echo:& set /p n=
call echo Действия над: "%%$_%n%%%"
pause>nul

megaloman
09-02-2019, 15:27
YuS_2, а если их 350 или не дай бог 3500 ? Вопрос риторический, если что... »Я ориентировался на Choice, так как в заданииСкрипт ... выводит список найденных файлов .... Затем используя ":choice" выбирается один ...» Рискую впасть во флуд, но представить монитор с 350 (тем более 3500) строками мне трудновато. Поэтому, если без Choice Здесь сделано по 20 штук, можно изменить, лишь бы на экран помещалось@Echo Off
Cls
Set "BootFile=%SYSTEMDRIVE%\Work\Image\sources"
Set "Mask=Boot*.wim"

Call :FileName "%BootFile%\%Mask%" 20 "FName" ||Exit /B 1

Echo %FName%
pause
GoTo :Eof

:FileName
SetLocal
Set /A N=0
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /b /a:-D "%~1"`) DO Set /A N+=1 &Call Set "@%%N%%=%%f"

If %N%==0 (Echo !!! Files not found "%~1" &Pause &EndLocal &Exit /B 2)

Set /A Iter=(%N%+%~2-1)/%~2
Set /A j=0
:Begin
Set /A j+=1
Set /A N1=(%j%-1)*%~2+1
Set /A N2=%j%*%~2
If %N2% GTR %N% Set /A N2=%N%
:Begin2
Cls
Echo == Из %N% файлов показаны с %N1% по %N2% =====&Echo.
FOR /L %%i IN (%N1%,1,%N2%) DO Call Echo %%i=%%@%%i%%
Echo.

Echo == Введите номер файла, Q-Завершить работу, Enter-продолжить просмотр
Set "In=QQ"
Set /P In=
If /I "%In%"=="Q" EndLocal& Exit /B 1
If Not %j%==%Iter% If /I "%In%"=="QQ" GoTo :Begin
If %j%==%Iter% If /I "%In%"=="QQ" Set /A j=0 &GoTo :Begin

2>nul Set /A i=%In%
Set "@FName="
If "%In%"=="%i%" If %i% LEQ %N% Call Set "@FName=%%@%i%%%"
If "%@FName%"=="" (Echo. &Echo !!! Номер файла "%In%" указан неверно &Pause &GoTo :Begin2)
EndLocal& Set "%~3=%@FName%" &Exit /B 0
Exit /B 1
Выбор файла сделал в виде процедурищи, чтобы не загромождать восприятие последующего кода скрипта, который собрался ваять пользовательКлиент посчитал задачу решенной, так что наваял для собственного удовольствия :)

YuS_2
09-02-2019, 15:35
Затем используя ":choice" выбирается один »
Так ведь :choice - не команда, а метка...

Рискую впасть во флуд, но представить монитор с 350 (тем более 3500) строками мне трудновато. »
Ну, мониторы-то сейчас всякие есть, можно и 350 упихать в один экран, но мы же не о DOS говорим, консоль же можно прокручивать:
https://jpegshare.net/thumbs/fb/8b/fb8bbda0e2b77566db8867f628ac6142.jpg (https://jpegshare.net/fb/8b/fb8bbda0e2b77566db8867f628ac6142.png.html)

Iska
09-02-2019, 18:44
«Не ссорьтесь, горячие финские парни»™ ;): CMD/BAT: использование стандартных GUI-диалогов выбора папки и файла (http://forum.script-coding.com/viewtopic.php?id=4514).

Alex S
10-02-2019, 14:14
Появился ещё один вопрос, понимаю что не по теме, но он мелкий и не хочется из-за него тему создавать.
Не совсем я понял как происходит поиск информации и запись её в переменную. Слишком много информации из статей и справок в самом начале. Голова закипела...

После поиска файлов Boot.wim, по плану идет выбор одного из обнаруженных и вывод краткой информации о содержимом файла.
Вывод инфы не проблема, делается стандартными командами Dism.exe, но по мимо всего из общей информации о wim-файле нужно найти общее количество записей содержащих слово Index, точнее определить количество индексов и записать их в переменную.
Для чего это? После вывода краткой информации нужно ввести индекс одной из имеющихся редакций для дальнейшего её монтирования, а если введена неверная цифра индекса (условие сравнивается с переменной содержащей общее количество индексов), то ловим осиновый кол и идем на вторую попытку ввода...
Ниже, для ясности приведу краткий пример:
@echo off
MODE CON COLS=80 LINES=35
set "BootFile=%SYSTEMDRIVE%\Work\Image\sources\Boot.wim"

:wim_info
echo.============================ Содержимое wim-файла =============================
dism /English /LogLevel:1 /Get-WimInfo /WimFile:%BootFile%
echo.===============================================================================

set /p Indx=Введите индекс редакции для продолжения:
if %Indx% GTR 0 if %Indx% LEQ 24 goto :mount_wim
if %Indx% GTR 24 (echo Не существует индекса редакции с таким номером) & Pause>nul|(echo Нажмите любую клавишу чтобы повторить попытку ввода) & goto :wim_info

:mount_wim
echo Mount...
Pause
Exit

Тут как общее число индексов указана цифра 24, но сколько их там на деле неизвестно. Вместо нее сравнение должно брать цифру(общее количество индексов) из переменной, в которой содержится точное число имеющихся. Если больше имеющихся, то смс-ка и на второй круг.

Пробовал так:for /f "tokens=2 delims=: " %%a in ('DISM /Get-WimInfo /WimFile:%BootFile% ^| findstr /i Index') do (set Image_Index=%%a)
Но что-то видать не так делаю...

Alex S
10-02-2019, 14:38
Такая конструкция вылетает...
set /p Indx=Введите индекс редакции для продолжения:
if %Indx% GTR 0 if %Indx% LEQ %Image_Index% goto :mount_wim
if %Indx% GTR %Image_Index% (echo Не существует индекса редакции с таким номером) & Pause>nul|(echo Нажмите любую клавишу чтобы повторить попытку ввода) & goto :wim_info


Вопрос снят!!! Решил. Проблема была в команде поиска индекса, а именно, не указал язык поиска (/English)...
Сработало так:
for /f "tokens=2 delims=: " %%a in ('%DISM% /English /Get-WimInfo /WimFile:%BootFile% ^| findstr /i Index') do (set Image_Index=%%a)

Alex S
10-02-2019, 18:47
YuS_2, разбираю пример с "Цыганочка с выходом :)".
Так сказать задумался о грядущих задачах и захотелось сделать универсальный скрипт.
Возник новый вопрос.
В папке поиска могут быть файлы *.wim, но могут быть и файлы *.esd. Пытался переделать скрипт для поиска и того и того(что найдёт, то и покажет списком), но выходит в итоге список файлами *.wim, а за ним следом, начиная с единицы новый список с файлами *.esd...
Можно ли осуществить поиск так, чтобы всё найденное было в одном списке?

Пробовал так:
@echo off
set BootFile=%SYSTEMDRIVE%\Work\Image\sources
set "src=%BootFile%\*.wim"
set "src2=%BootFile%\*.esd"

:begin
cls
echo Обнаруженные файлы:
echo.
echo.----------------------------------------------------------------------
for /f "tokens=1* delims=:" %%a in ('dir /b/a-d "%src%"^|findstr /n "." ') do echo.%%~a - %%b
for /f "tokens=1* delims=:" %%a in ('dir /b/a-d "%src2%"^|findstr /n "." ') do echo.%%~a - %%b
echo.0 - Выход
echo.----------------------------------------------------------------------
set "var="
set "b= "
echo.
set /p "b=Ваш выбор: "
set "b=%b:"=%"
if "%b%"=="" (echo это не число&pause&goto begin)
echo."%b%"|>nul findstr /rc:"[&|^%%]"&&(echo это не число&pause&goto begin)
if "%b:~,2%"=="0x" (
echo.%b:~2%|>nul findstr /rc:"[^0-9a-f]"&&(echo это не число&pause&goto begin)
) else (
echo.%b%|>nul findstr /rc:"[^0-9]"&&(echo это не число&pause&goto begin)
)
set /a c=b
if %c% equ 0 (if %c% neq %b% (echo некорректное число&pause&goto begin) else (exit /b))

for /f "tokens=1* delims=:" %%a in ('dir /b/a-d "%src%"^|findstr /n "." ') do if %c% equ %%~a set "var=%%~b"
echo.
if not defined var (echo Не существует файла с таким номером&pause&goto begin)

echo.Выбор сделан: "%var%"
pause&exit /b

Iska
10-02-2019, 18:50
set "src=%BootFile%\*.wim %BootFile%\*.esd"
Можете ещё order в dir добавить — /o:n или /o:e.

Alex S
10-02-2019, 18:55
Iska, чего-то не едет, словил ошибку...
"Синтаксическая ошибка в имени файла, имени папки или метке тома".

Iska
10-02-2019, 19:43
Alex S, это я не доглядел.

Сделайте так — в set добавим кавычки, а при dir — уберём:
set src="%BootFile%\*.wim" "%BootFile%\*.esd"
и:
… in ('dir /b /a:-d /o:e %src% ^| findstr.exe /n "." ') do …




© OSzone.net 2001-2012