Имя пользователя:
Пароль:
 | Правила  

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

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

Новый участник


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

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


Всем добрый день.

Уважаемые форумчане, не поможете ли вы в написании небольшого скриптика на .bat
К сожалению я в нём почти ничего не понимаю

Суть вот в чём. Скажем в папке C:/info/ есть следующие файлы: file1.format, file2.format, file3.format, file4.format и т.д.
Нужно сначала получить список всех файлов и присвоить каждому номер. Выводится через echo должно так:
1 - file1.format
2 - file2.format
3 - file3.format
4 - file4.format

Далее я нахожу нужный мне файл и вписываю его номер через set /p my_file="-> ". В итоге если я выбрал, скажем, file3.format, то я пишу "3" и переменная my_file становится file3.format.

Только вот как всё это записать правильно, я не знаю.

Уточню некоторые моменты:
1 - файлов может быть много
2 - могут отличатся количеством символов
3 - названия на английском языке
4 - в названиях имеются спец символы, а именно "_" и "-"
5 - начало файлов состоит из цифр (но это не точно, в будущем может и с букв начинаться )


В теории, я думаю должно работать всё как-то так:
1 - попадаем в папку
2 - переименовываем все файлы в алфавитном порядке(0-9 / a-z) из "file1" -> "1 - file1", "file2" -> "2 - file2" и т.д.
3 - выводим список всех файлов через echo
4 - задаём переменную my_file
5 - по всем файлам ищем начало как в my_file.
6 - запоминаем в другую переменную название файла
7 - переименовываем все обратно(убираем "1 -", "2 -" и т.д.)
8 - убираем n-ое кол-во символов(аля "1 -" 3 символа или "55 -" 4 символа) в переменной и получаем собственно то, что мне надо.

Хотя я думаю можно всё проще сделать. Но, как я уже сказал, я сам это никак не сделаю

Отправлено: 13:51, 06-06-2020

 

Новый участник


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

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


И ещё вопрос, как лучше использовать

Код: Выделить весь код
setlocal enableextensions enabledelayedexpansion
?

В начале .bat файла и без endlocal или перед началом данного скрипта с закрытием endlocal?

.bat файл большой, там ещё много всего. Но нигде не используется setlocal и так же нет call функции.

Ещё немного упростил ваш скрипт, не очень понял зачем создавались некоторые функции и строки.

Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set work_folder=%userprofile%\documents\Files


set /a prefix = 0
echo ---------------------------------------------

for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "%work_folder%\*.*"`) do (
	set /a prefix += 1
	set "choice!prefix!=%%~i"
	echo !prefix! - %%~i
)

echo ---------------------------------------------
set /p file_number=Enter file number: 
echo.
	


if defined choice%file_number% set my_file=!choice%file_number%:~17,-4!



echo %prefix%
echo %my_file%

endlocal

Отправлено: 11:56, 07-06-2020 | #11



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

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


Ветеран


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

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


Цитата UnrealMalcolm:
как лучше использовать setlocal enableextensions enabledelayedexpansion? В начале .bat файла и без endlocal или перед началом данного скрипта с закрытием endlocal?»
Лучше использовать по назначению.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:44, 07-06-2020 | #12


Ветеран


Contributor


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

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


UnrealMalcolm, По идее мне не нравится идея : 500 файлов промелькнёт на экране мигом, а как номер выбирать? Я наваял вывод квантами, например, по 30 штук. В принципе, количество выводимых за раз строк можно поставить 100000, и получится как у Iska
Код: Выделить весь код
@Echo Off
Cls

Set "BoxIn=E:\_Скопировано.wd\201309_Испания_Барселона"
Set /A Quota=30

Set /A N=0
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\" /b /A:-d`) DO (
	Set /A N+=1
	Call Set "Num=$$$$$$%%N%%" 
	Call Set "%%Num:~-5%%=%%~nxf"
)

Set /A iN=0
Set "MyName="
FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "$"`) DO Set "Num=%%i" &Call :OutName "MyName" "%%Num:$= %%" "%%~nxj" ||GoTo :End
:End

If Not "%MyName%"=="" (Echo "%MyName%") Else (Echo File not selected)
Pause
Exit /B

:OutName
	Set /A iN+=1
	Echo %~2 %~3

	If %iN% EQU %Quota% Call :MyPause %1 %2 %3 ||Exit /B 1
	If %iN% EQU %N%     Call :MyPause %1 %2 %3 ||Exit /B 1
Exit /B 0

:MyPause
	Set /A iN=0, jN=0
	Set /P jN=Type number 1-%N% of file, or Q-Quit, or Enter or any key to continue:
	If /I "%jN%"=="Q" Exit /B 2 
	Set /A jN=jN*1
	If %jN% EQU 0 Exit /B 0
	If 1 LEQ %jN% If %jN% LEQ %N% (GoTo :Rezult) Else (Echo Wrong number %jN% &GoTo :MyPause) 

	:Rezult
		Set "jN=$$$$$$%jN%"
		Call Set "jN=%%%jN:~-5%%%"
		Call Set "%~1=%%jN%%"
Exit /B 1

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

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

Отправлено: 14:48, 07-06-2020 | #13


Ветеран


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

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


Цитата megaloman:
, а как номер выбирать? »
Прокручивать. Если мне не изменяет память, там окно в три тысячи строк. Хотя могу и ошибаться. Проверять, сбрасывая на умолчания, не хочу.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:10, 07-06-2020 | #14


Ветеран


Contributor


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

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


UnrealMalcolm,
Цитата Iska:
Прокручивать. Если мне не изменяет память, там окно в три тысячи строк. Хотя могу и ошибаться. Проверять, сбрасывая на умолчания, не хочу. »
Если это Вас устраивает, вот мой вариант без разбиения на экраны:
Код: Выделить весь код
@Echo Off 
Cls

Set "BoxIn=E:\_Скопировано.wd\201309_Испания_Барселона"

Set /A N=0
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\" /b /A:-D`) DO (
	Set /A N+=1
	Call Set "Num=$$$$$$%%N%%"
	Call Set "Num=%%Num:~-5%%"
	Call Echo %%Num:$= %%  %%~nxf
	Call Set "%%Num%%=%%~nxf"
)
Set /P jN=Type number 1-%N% of file:
Set "Num=$$$$$$%jN%"

Set "MyName="
If 1 LEQ %jN% If %jN% LEQ %N% Call Set "MyName=%%%Num:~-5%%%" 
If Not "%MyName%"=="" (Echo %Num:$= %="%MyName%") Else (Echo File %jN% not selected)

Pause
Exit /B

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


Последний раз редактировалось megaloman, 07-06-2020 в 16:16.

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

Отправлено: 16:10, 07-06-2020 | #15


Новый участник


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

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


megaloman, спасибо за предложенный вариант, но я уже остановился на варианте Iska.

Немного под себя переделал, добавил пару проверок на наличие папки, файлов, ввода корректного номера файла и т.д. Всё работает отлично.

Наверное последнее чего я не понял, как обработать вывод "%%~i".

Код: Выделить весь код
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "%my_folder%\*.*"`) do (
	set /a prefix += 1
	set "choice!prefix!=%%~i"
	echo !prefix! - %%~i
)
Как мне в строке "echo !prefix! - %%~i" - обработать %%~i чтоб убрать формат? Т.е. нужно как-то прицепить вот эту штуку -> :~0,-4, чтобы убрать с конца 4 символа. А так всё супер.

EDIT: это было просто, вчера голова уже совсем не сображала.
Код: Выделить весь код
set file_tmp=%%~i
echo !prefix! - !file_tmp:~0,-4!
Всем спасибо кто помогал, на этом всё.

/close

Последний раз редактировалось UnrealMalcolm, 08-06-2020 в 13:04. Причина: Решил.


Отправлено: 16:47, 07-06-2020 | #16


Ветеран


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

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


Код: Выделить весь код
%%~ni
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:58, 07-06-2020 | #17



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - sfcscannow не может восстановить некоторые файлы - как получить список этих файлов? bugme Microsoft Windows 7 3 12-02-2019 08:01
PHP - получить список файлов директории по фильтру xNiSSaNx Вебмастеру 1 18-06-2013 06:34
CMD/BAT - [решено] Получить список файлов с определенным расширением 3StYleR Скриптовые языки администрирования Windows 1 18-07-2012 18:02
Разное - [решено] Как получить список файлов находящихся в каталоге? Kocuk Microsoft Windows 2000/XP 8 27-02-2012 23:25
Удаленно получить список процессов Dronec Сетевые технологии 1 25-09-2004 12:49




 
Переход