|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Поиск файлов в папке и вывод их списка под номерами |
|
CMD/BAT - [решено] Поиск файлов в папке и вывод их списка под номерами
|
![]() Пользователь Сообщения: 69 |
Всем привет.
Долго пытаюсь сам решить задачу но не получается, поиск в интернете тоже результата не дал... Прошу помощи у знающих людей. Нужно написать скрипт сканирующий директорию на наличие файлов определенного расширения. После определения наличия файлов с нужным расширением, вывести их список с присвоением каждому найденному файлу порядкового номера. Объясню зачем и как это в планах должно работать. Скрипт при запуске ищет в директории файлы по расширению(в моём случае *.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 |
|
Отправлено: 23:47, 07-02-2019 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать подкину и я:
@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 |
Последний раз редактировалось alpap, 09-02-2019 в 02:30. Отправлено: 02:13, 09-02-2019 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать YuS_2,
Цитата YuS_2:
Цитата Alex S:
Для произвольного количества найденных файлов при ограничении количества файлов, отображаемых на экране за одну порцию (имитация скроллинга)
Здесь сделано по 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 ![]() |
||
------- Последний раз редактировалось megaloman, 11-02-2019 в 20:53. Отправлено: 15:27, 09-02-2019 | #12 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Цитата megaloman:
![]() |
||
------- Отправлено: 15:35, 09-02-2019 | #13 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать «Не ссорьтесь, горячие финские парни»™
![]() |
Отправлено: 18:44, 09-02-2019 | #14 |
![]() Пользователь Сообщения: 69
|
Профиль | Отправить PM | Цитировать Появился ещё один вопрос, понимаю что не по теме, но он мелкий и не хочется из-за него тему создавать.
Не совсем я понял как происходит поиск информации и запись её в переменную. Слишком много информации из статей и справок в самом начале. Голова закипела... После поиска файлов 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)
Но что-то видать не так делаю... |
Отправлено: 14:14, 10-02-2019 | #15 |
![]() Пользователь Сообщения: 69
|
Профиль | Отправить PM | Цитировать Такая конструкция вылетает...
Скрытый текст
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)
|
Отправлено: 14:38, 10-02-2019 | #16 |
![]() Пользователь Сообщения: 69
|
Профиль | Отправить PM | Цитировать 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 |
Отправлено: 18:47, 10-02-2019 | #17 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 18:50, 10-02-2019 | #18 |
![]() Пользователь Сообщения: 69
|
Профиль | Отправить PM | Цитировать Iska, чего-то не едет, словил ошибку...
"Синтаксическая ошибка в имени файла, имени папки или метке тома". |
Отправлено: 18:55, 10-02-2019 | #19 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 19:43, 10-02-2019 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - Поиск с созданием списка файлов с последующим их копированием. | rengaboy | Скриптовые языки администрирования Windows | 12 | 29-05-2018 15:35 | |
CMD/BAT - Поиск цифр в текстовом файле и последующий их поиск в названии файлов массива (лог.) | antares_80@vk | Скриптовые языки администрирования Windows | 10 | 25-10-2015 11:34 | |
CMD/BAT - [решено] Вывод списка файлов с указанным расширением | kelevara | Скриптовые языки администрирования Windows | 8 | 27-04-2013 03:59 | |
Любой язык - [решено] Вывод списка файлов и их размеров в байтах из заданной папки | Vadikan | Скриптовые языки администрирования Windows | 6 | 18-03-2011 23:16 | |
[решено] Вывод списка файлов с полными путями и размерами | Grenky | Программное обеспечение Windows | 16 | 03-07-2005 22:14 |
|