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

Компьютерный форум 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

 

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

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


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

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


Iska спасибо за помощь.
У меня сработало так:
Код: Выделить весь код
set src=""%BootFile%\*.wim","%BootFile%\*.esd""
и так
set src=""%BootFile%\*.wim" "%BootFile%\*.esd""

Отправлено: 19:49, 10-02-2019 | #21



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

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


Ветеран


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

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


Запятая не нужна.

Отправлено: 19:54, 10-02-2019 | #22


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

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


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

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


Спасибо ещё раз за помощь.

Отправлено: 19:56, 10-02-2019 | #23


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

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


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

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


Всем привет.
Возникла необходимость переделать скрипт для поиска файлов (*.wim *.esd) рекурсивно.
Почитал справку, с рекурсивным поиском разобрался используя команду for с ключом /R:
Код: Выделить весь код
for /R "%SrcFile%" %%a in (*.wim *.esd) do echo.%%~a
Список выводится с полными путями, тут и вся проблема.
Теперь снова нужно переделать скрипт так, чтобы при поиске файлов выводился их список (только имена файлов с расширением) с присвоением каждому найденному файлу порядкового номера. Далее, после выбора файла из списка, его путь записать в переменную для дальнейшего использования...
Если можно, то реализовать на базе этого, хотя не принципиально:
Скрытый текст
Код: Выделить весь код
@echo off
set SrcFile=%SYSTEMDRIVE%\Work
set src=""%SrcFile%\*.wim" "%SrcFile%\*.esd""

:begin
cls
echo Обнаруженные файлы:
echo.
echo.----------------------------------------------------------------------
:: Используя нижнюю заком-ю стоку нужно решить задачу...
::for /R "%SrcFile%" %%a in (*.wim *.esd) do echo.%%~a
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 (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

Отправлено: 02:12, 28-12-2020 | #24


Ветеран


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

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


Цитата Alex S:
тут и вся проблема »
не тут
проблема с очередными граблями, а именно:
Цитата Alex S:
при поиске файлов выводился их список »
если их много, то информация замыливается или вообще не умещается на экране
если предполагается делать список в отдельный файл, то ситуация немногим лучше: открыть, прокрутить, найти, запомнить номер, запустить bat, ввести номер - кошмар.
Не пробовали подружиться с каким-нибудь файловым менеджером?
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:03, 28-12-2020 | #25


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

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


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

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


Цитата alpap:
если их много »
Количество может быть от одного до десяти, не более.
Цитата alpap:
Не пробовали подружиться с каким-нибудь файловым менеджером? »
Зачем? И так дружу... Задача этого скрипта состоит в автоматизации некоторых действий. Из-за того что имена каталогов искомых файлов иногда разнятся, приходится постоянно открывать скрипт и править переменные с путями. Потому и пришла мысля рекурсивного поиска и автоматической правки переменных с путями... Как-то так!
Ну, если это настолько заморочено, буду искать другой способ...
Цитата alpap:
делать список в отдельный файл »
А это мысль...
Спасибо за ответ!

Последний раз редактировалось Alex S, 28-12-2020 в 18:52. Причина: Добавка текста


Отправлено: 18:45, 28-12-2020 | #26


Ветеран


Contributor


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

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


Произвольное число файлов
Код: Выделить весь код
@Echo Off
Cls
	Set "BootFile=%SYSTEMDRIVE%\Work\Image\sources\*.wim *.esd"

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

	Echo %FName%
pause
GoTo :Eof

:FileName
SetLocal
	Set /A N=0
	Pushd "%~dp1" ||(Echo !!! Folder not found "%~dp1" &Pause &EndLocal &Exit /B 2)

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

       	Popd

       	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
Если файлов 1<=N<=35
Код: Выделить весь код
@Echo Off                                                                                                 
cls
	Set "BootFile=%SYSTEMDRIVE%\Work\Image\sources\*.wim *.esd"

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

	Echo %FName%
pause
GoTo :Eof

:FileName
SetLocal
	Set /A N=0
	Set "Spis="

	Pushd "%~dp1"

       	FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /b /S /a:-D %~nx1`) DO (
		Set /A N+=1
		Call :Symbol %%N%% "SS"

rem		Call Set "@%%SS%%=%%f"
		Call Set "@%%SS%%=%%~nxf"

		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%%%"

	Popd
EndLocal& Set "%~2=%@FName%"
Exit /B 0

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

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


Последний раз редактировалось megaloman, 28-12-2020 в 20:51.

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

Отправлено: 19:46, 28-12-2020 | #27


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

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


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

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


megaloman, спасибо большое! То что нужно!
А можно тут ка-то сделать так, чтобы отображались только имена файлов с расширением(скрыть путь).
Это уже не столь важно конечно...

Отправлено: 20:20, 28-12-2020 | #28


Ветеран


Contributor


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

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


Alex S, Исправил код. Вместо красной строки записал изменённую. Не понятно, как идентифицировать файл, если имя одно и то же, а путь разный, что выбирать?

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


Отправлено: 20:45, 28-12-2020 | #29


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

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


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

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


megaloman, теперь точно в точку. Большего и не надо.
Цитата megaloman:
Не понятно, как идентифицировать файл, если имя одно и то же, а путь разный, что выбирать? »
В моём случае в папках будут находиться разноимённые файлы и количеством до пяти штук, поэтому текущий вариант скрипта меня вполне устраивает.

Спасибо большое за помощь, респект и уважуха!

Последний раз редактировалось Alex S, 28-12-2020 в 22:14.


Отправлено: 20:54, 28-12-2020 | #30



Компьютерный форум 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




 
Переход