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

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

 

Ветеран


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

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


Давайте потренируемся:
  1. Зачем? «…и переменная my_file становится file3.format» не является ответом на данный вопрос.
  2. Что делать, если файлов больше десяти? Больше десяти тысяч?
  3. В каталоге присутствуют ещё какие-либо файлы?

Отправлено: 15:02, 06-06-2020 | #2



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

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


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


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

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


Iska,

1. Переменная содержит название файла. Этот файл будет использоваться в строке запуска. Аля "start prog.exe -%my_file%"
2. Больше 1000 вряд ли будет, но больше 100 запросто. А что делать? Так же выводить их в консоль. Так как имена будут в алфавитном порядке, то найти нужный даже при 500 будет не проблемой.
3. Нет.


Давай те немного раскрою карты.

Есть код:

Код: Выделить весь код
For /f "tokens=1-3 delims=/." %%a in ('date /t') do (set mydate=%%a-%%b-%%c)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a-%%b)
set day=%mydate:~0,2%
set month=%mydate:~3,2%
set year=%mydate:~6,4%
set record=%year%-%month%-%day%_%mytime%
Переменная record будет кое где в коде использоваться, в результате чего будут создаваться файлы формата %year%-%month%-%day%_%mytime%-кое_что_ещё

Как можно понять, сортировка будет такая: год-месяц-день-время, а значит, при алфавитной сортировке старые файлы будут верху, а новые - снизу. В общем сколько бы их не было, там сложно будет потеряться.

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

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


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


Ветеран


Contributor


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

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


UnrealMalcolm,
Цитата UnrealMalcolm:
А что делать? »
Выбирайте файл через GUI
Код: Выделить весь код
@Echo Off
Cls

For /f "tokens=2 delims=:" %%i in ('chcp') do (Set "sPrevCP=%%i" &>nul Chcp 1251)

For /f "usebackq delims=" %%i in (
	`@"mshta.exe" "about:<FORM><INPUT type='file' name='qq'></FORM><script>document.forms[0].elements[0].click();var F=document.forms[0].elements[0].value;try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(F)};catch (e){};close();</script>"`
) Do Set "sFileName=%%i"

>nul Chcp %sPrevCP%

if Defined sFileName (Echo Выбран файл: "%sFileName%") Else (Echo Файл не был выбран)

Pause
Exit /B 0
Цитата:
И только на рассвете, когда дописаны были последние строки, я вспомнил, что этот стих уже написал А. Пушкин. Такой удар со стороны классика!

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

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

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


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


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

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


megaloman, в целом, решение не плохое! Спасибо!

Правда не могли бы вы ещё мне помочь, как сделать, чтоб окно выбора файла открывалось в определенной директории? И как сделать, чтоб переменная имела не путь до файла, а только его название?


Хотя конечно решение без mshta.exe тоже было бы не плохо. Всё же хочется задействовать минимум программ.

Последний раз редактировалось UnrealMalcolm, 06-06-2020 в 17:36.


Отправлено: 17:00, 06-06-2020 | #5


Ветеран


Contributor


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

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


Цитата UnrealMalcolm:
чтоб окно выбора файла открывалось в определенной директории »
Пока не знаю. Однако, после скрипта последний путь запоминается в системе.
Цитата UnrealMalcolm:
И как сделать, чтоб переменная имела не путь до файла, а только его название »
Код: Выделить весь код
@Echo Off
Cls

For /f "tokens=2 delims=:" %%i in ('chcp') do (Set "sPrevCP=%%i" &>nul Chcp 1251)

For /f "usebackq delims=" %%i in (
	`@"mshta.exe" "about:<FORM><INPUT type='file' name='qq'></FORM><script>document.forms[0].elements[0].click();var F=document.forms[0].elements[0].value;try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(F)};catch (e){};close();</script>"`
) Do Set "FileName=%%~nxi"  &Set "PathFileName=%%~dpi"

>nul Chcp %sPrevCP%

if Defined FileName (Echo Выбран файл: "%FileName%"  "%PathFileName%") Else (Echo Файл не был выбран)

Pause
Exit /B 0

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


Отправлено: 17:52, 06-06-2020 | #6


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


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

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


Цитата megaloman:
Пока не знаю. Однако, после скрипта последний путь запоминается в системе. »
Тогда, к сожалению, такой вариант не подойдёт. Нужно чтоб сразу работа производилась в нужной директории.

Отправлено: 18:35, 06-06-2020 | #7


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


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

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


В общем я своего добился. Правда получился какой-то говно код, но он работает. Единственный косяк - долго работает цикл. В целом за секунд 10 он покажет ~500 файлов. Но всё же хотелось бы что это было моментально.

Сам код получился таким:

Код: Выделить весь код
@Echo Off
set file=11122.txt

dir /b /a-d "C:\Users\Admin\Desktop\ttt\*" > %file%

for /f "usebackq" %%S in (`find /c /v ""^<"%file%"`) do (set /a last_number=%%S)

set num=1
:start_add_pref
for /f "tokens=*" %%i in ('more +%num% "%file%"') do (echo %num% - %%i&goto next)
:next
set /a num=%num%+1
if %num%==%last_number% (goto:end_add_pref) else (goto:start_add_pref)

:end_add_pref
set /p file_select="-> "
for /f "tokens=*" %%i in ('more +%file_select% "%file%"') do (set my_file=%%i&goto final)

:final
del "%file%" 2>NUL
echo my file is %my_file%

pause
Если всё же кто-то подскажет как его ускорить - буду благодарен. Если нет, то "и так сойдёт".

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


Ветеран


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

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


Цитата UnrealMalcolm:
Если всё же кто-то подскажет как его ускорить… »
Не очень понял Ваш код.

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

set sSourceFolder=C:\Users\Admin\Desktop\ttt

>nul 2>&1 pushd "%sSourceFolder%" && (
	set /a iCount = 0
	echo ---------------------------------------------
	
	for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "*.*"`) do (
		set /a iCount += 1
		set sCount=      !iCount!
		set "aChoice!iCount!=%%~i"
			
		echo !sCount:~-6!. %%~i
	)
	
	echo ---------------------------------------------
	set /p sChoice=Enter number of file: 
	echo.
	
	popd
) || (
	echo Can't find folder [%sSourceFolder%].
	exit /b 1
)

if defined aChoice%sChoice% echo [!aChoice%sChoice%!]

endlocal
exit /b 0

Если без выравнивания — можно и короче.
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:40, 07-06-2020 | #9


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


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

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


Iska, супер! Прям что нужно, спасибо! Правда до последнего хотел избегать setlocal, но что поделать...

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



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




 
Переход