![]() |
Поиск файлов в папке и вывод их списка под номерами
Всем привет.
Долго пытаюсь сам решить задачу но не получается, поиск в интернете тоже результата не дал... Прошу помощи у знающих людей. Нужно написать скрипт сканирующий директорию на наличие файлов определенного расширения. После определения наличия файлов с нужным расширением, вывести их список с присвоением каждому найденному файлу порядкового номера. Объясню зачем и как это в планах должно работать. Скрипт при запуске ищет в директории файлы по расширению(в моём случае *.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 |
Alex S,
Если файлов 1<=N<=9
Код:
@Echo Off |
Цитата:
Сделать можно так: Код:
dir /b /a-d "%BootFile%\Boot*.wim"|findstr /n "." а это полный код с выбором конкретного файла
Код:
@echo off |
Alex S,
Если файлов 1<=N<=35
Код:
@Echo Off |
megaloman, YuS_2 спасибо большое за помощь. Оба варианта прекрасно работают.
|
Цитата:
Вопрос риторический, если что... |
Вложений: 1
А вот появился новый вопрос. Копаюсь тут и не нахожу решения.
Можно ли сделать чтобы последним пунктом, после поиска всегда был пункт выхода из скрипта? |
Цитата:
Цыганочка с выходом :)
Код:
@echo off |
YuS_2 спасибо!
Вопросов больше нет, тема решена. |
Цитата:
|
подкину и я:
Код:
@echo off Код:
@echo off |
YuS_2,
Цитата:
Цитата:
Для произвольного количества найденных файлов при ограничении количества файлов, отображаемых на экране за одну порцию (имитация скроллинга)
Здесь сделано по 20 штук, можно изменить, лишь бы на экран помещалось
Код:
@Echo Off |
Цитата:
Цитата:
![]() |
«Не ссорьтесь, горячие финские парни»™ ;): CMD/BAT: использование стандартных GUI-диалогов выбора папки и файла.
|
Появился ещё один вопрос, понимаю что не по теме, но он мелкий и не хочется из-за него тему создавать.
Не совсем я понял как происходит поиск информации и запись её в переменную. Слишком много информации из статей и справок в самом начале. Голова закипела... После поиска файлов 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)
Но что-то видать не так делаю... |
Такая конструкция вылетает...
Скрытый текст
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)
|
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 |
Код:
set "src=%BootFile%\*.wim %BootFile%\*.esd" |
Iska, чего-то не едет, словил ошибку...
"Синтаксическая ошибка в имени файла, имени папки или метке тома". |
Alex S, это я не доглядел.
Сделайте так — в set добавим кавычки, а при dir — уберём: Код:
set src="%BootFile%\*.wim" "%BootFile%\*.esd" Код:
… in ('dir /b /a:-d /o:e %src% ^| findstr.exe /n "." ') do … |
Iska спасибо за помощь.
У меня сработало так: Код:
set src=""%BootFile%\*.wim","%BootFile%\*.esd"" |
Запятая не нужна.
|
Спасибо ещё раз за помощь.
|
Всем привет.
Возникла необходимость переделать скрипт для поиска файлов (*.wim *.esd) рекурсивно. Почитал справку, с рекурсивным поиском разобрался используя команду for с ключом /R: Код:
for /R "%SrcFile%" %%a in (*.wim *.esd) do echo.%%~a Теперь снова нужно переделать скрипт так, чтобы при поиске файлов выводился их список (только имена файлов с расширением) с присвоением каждому найденному файлу порядкового номера. Далее, после выбора файла из списка, его путь записать в переменную для дальнейшего использования... Если можно, то реализовать на базе этого, хотя не принципиально: Скрытый текст
Код:
@echo off |
Цитата:
проблема с очередными граблями, а именно: Цитата:
если предполагается делать список в отдельный файл, то ситуация немногим лучше: открыть, прокрутить, найти, запомнить номер, запустить bat, ввести номер - кошмар. Не пробовали подружиться с каким-нибудь файловым менеджером? |
Цитата:
Цитата:
Ну, если это настолько заморочено, буду искать другой способ... Цитата:
Спасибо за ответ! :coffee: :ok: |
Произвольное число файлов
Код:
@Echo Off Если файлов 1<=N<=35
Код:
@Echo Off |
megaloman, спасибо большое! То что нужно! :yahoo:
А можно тут ка-то сделать так, чтобы отображались только имена файлов с расширением(скрыть путь). Это уже не столь важно конечно... |
Alex S, Исправил код. Вместо красной строки записал изменённую. Не понятно, как идентифицировать файл, если имя одно и то же, а путь разный, что выбирать?
|
megaloman, теперь точно в точку. Большего и не надо.
Цитата:
Спасибо большое за помощь, респект и уважуха! :Beer: |
megaloman, никак не пойму где переменная пути?
%FName% содержит имя выбранного файла, а в какой переменной находится путь к этому файлу не разберусь никак... |
Alex S, нет его. Путь потерян - по вашему требованию. Можно, наверное, заново на это имя сделать dir и восстановить путь к файлу, но лучше вернуть файлу путь.
|
Цитата:
|
Имена файлов выводятся, в переменную записывается полный путь.
Код:
@Echo Off |
Последний вариант скрипта отработал отлично. Собственно и выполняет всё как и хотелось. Вопрос решён. :yes:
megaloman, ещё раз респектище и большое спасибо!!! |
Цитата:
Скрытый текст
Код:
local function LoadFile(FindData, FullPath) ![]() |
Цитата:
Нельзя-ли здесь реализовать вариант типа: Скрытый текст
Код:
:choice Или как в самом первом примере. Такой вариант ожидает подтверждения выбора нажатием Enter. Сам пытаюсь прикрутить нечто подобное и никак... |
Выбрать номер файла и нажать Enter. Кол-во файлов произвольное.
Код:
@Echo Off Call :FileName "%BootFile%" 30 "FName" ||Exit /B 1 30 число строк, отображаемых в порции прокрутки (если она потребуется исходя из количества файлов). |
СПАСИБО БОЛЬШОЕ! Теперь всё бесподобно! :cool: :yahoo:
|
Я извиняюсь за назойливость, что изменить в скрипте, чтобы запретить ввод символов?
При запуске и выборе номера из списка случайно (действительно случайно :( ) ввёл какой-то символ вместо цифры(+,-,* - даже не знаю). Получил "Непредвиденное появление (и символ)". Стал проверять... Выяснилось, если при первом запуске ввести например звёздочку - получаем ошибку и выход, а вот если сначала ввести к примеру 5 из 4-х возможных, получаем предупреждение из скрипта и на второй круг. Так вот, странность, если на втором круге ввести ту же звездочку - получаем уже предупреждение из скрипта и на следующий круг. Навело на мысль, что может нужно поменять какие-нибудь строки местами :unsure: ? Ведь символы скрипт не принимает на последующих кругах, а при первом вводе не ожидает их(может проверка на символы идет позже, после проверки цифр :dont-know ). |
Alex S, Всегда можно подобрать данные, способные одурачить любую программу. :)
См. мой код, подправил. Код:
.......... |
Цитата:
megaloman, огромное спасибо за помощь, я Вам очень благодарен!!! :Beer: |
Время: 19:56. |
Время: 19:56.
© OSzone.net 2001-