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

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

 

Ветеран


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

Профиль | Отправить 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
можно и так, но менее красиво (или кому как)
Код: Выделить весь код
@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

Последний раз редактировалось alpap, 09-02-2019 в 02:30.

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

Отправлено: 02:13, 09-02-2019 | #11



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

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


Ветеран


Contributor


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

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


YuS_2,
Цитата YuS_2:
а если их 350 или не дай бог 3500 ? Вопрос риторический, если что... »
Я ориентировался на Choice, так как в задании
Цитата Alex S:
Скрипт ... выводит список найденных файлов .... Затем используя ":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
Выбор файла сделал в виде процедурищи, чтобы не загромождать восприятие последующего кода скрипта, который собрался ваять пользователь
Клиент посчитал задачу решенной, так что наваял для собственного удовольствия

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


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

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

Отправлено: 15:27, 09-02-2019 | #12


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата megaloman:
Затем используя ":choice" выбирается один »
Так ведь :choice - не команда, а метка...

Цитата megaloman:
Рискую впасть во флуд, но представить монитор с 350 (тем более 3500) строками мне трудновато. »
Ну, мониторы-то сейчас всякие есть, можно и 350 упихать в один экран, но мы же не о DOS говорим, консоль же можно прокручивать:

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

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

Отправлено: 15:35, 09-02-2019 | #13


Ветеран


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

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


«Не ссорьтесь, горячие финские парни»™ : CMD/BAT: использование стандартных GUI-диалогов выбора папки и файла.
Это сообщение посчитали полезным следующие участники:

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


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

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


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

Профиль | Отправить 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


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

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


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

Профиль | Отправить 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


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

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


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

Профиль | Отправить 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
Благодарности: 8086

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


Код: Выделить весь код
set "src=%BootFile%\*.wim %BootFile%\*.esd"
Можете ещё order в dir добавить — /o:n или /o:e.

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


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

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


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

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


Iska, чего-то не едет, словил ошибку...
"Синтаксическая ошибка в имени файла, имени папки или метке тома".

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


Ветеран


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

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


Alex S, это я не доглядел.

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

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



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




 
Переход