Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Поиск файлов в папке и вывод их списка под номерами

Ответить
Настройки темы
CMD/BAT - [решено] Поиск файлов в папке и вывод их списка под номерами

Аватара для Alex S

Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем привет.
Долго пытаюсь сам решить задачу но не получается, поиск в интернете тоже результата не дал...
Прошу помощи у знающих людей.
Нужно написать скрипт сканирующий директорию на наличие файлов определенного расширения. После определения наличия файлов с нужным расширением, вывести их список с присвоением каждому найденному файлу порядкового номера.
Объясню зачем и как это в планах должно работать.
Скрипт при запуске ищет в директории файлы по расширению(в моём случае *.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

 

Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Alex S,
Если файлов 1<=N<=9
Код: Выделить весь код
@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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 11-02-2019 в 20:52.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:52, 08-02-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Alex S:
Найти не проблема, вывести список тоже, но как из списка сделать выбор одного не знаю как реализовать. »
Надо понимать так, что проблема с нумерацией найденного?
Сделать можно так:
Код: Выделить весь код
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

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:38, 08-02-2019 | #3


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Alex S,
Если файлов 1<=N<=35
Код: Выделить весь код
@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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 11-02-2019 в 20:53.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:40, 08-02-2019 | #4


Аватара для Alex S

Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman, YuS_2 спасибо большое за помощь. Оба варианта прекрасно работают.

Последний раз редактировалось Alex S, 08-02-2019 в 12:39.


Отправлено: 10:51, 08-02-2019 | #5


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Если файлов 1<=N<=35 »
а если их 350 или не дай бог 3500 ?
Вопрос риторический, если что...

-------
scio me nihil scire. Ѫ


Отправлено: 11:00, 08-02-2019 | #6


Аватара для Alex S

Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png Boot.png
(46.3 Kb, 4 просмотров)

А вот появился новый вопрос. Копаюсь тут и не нахожу решения.
Можно ли сделать чтобы последним пунктом, после поиска всегда был пункт выхода из скрипта?

Отправлено: 12:38, 08-02-2019 | #7


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Alex S:
Можно ли сделать чтобы последним пунктом, после поиска всегда был пункт выхода из скрипта? »
Отчего же нельзя... можно.
Цыганочка с выходом :)
Код: Выделить весь код
@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

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:40, 08-02-2019 | #8


Аватара для Alex S

Пользователь


Сообщения: 62
Благодарности: 0

Профиль | Отправить PM | Цитировать


YuS_2 спасибо!
Вопросов больше нет, тема решена.

Отправлено: 13:52, 08-02-2019 | #9


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Код: Выделить весь код
…|findstr /n "."
»
Кстати — логично!
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:14, 08-02-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Поиск файлов в папке и вывод их списка под номерами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход