![]() |
Получить список файлов
Всем добрый день.
Уважаемые форумчане, не поможете ли вы в написании небольшого скриптика на .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 символа) в переменной и получаем собственно то, что мне надо. Хотя я думаю можно всё проще сделать. Но, как я уже сказал, я сам это никак не сделаю :( |
Давайте потренируемся:
|
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) Как можно понять, сортировка будет такая: год-месяц-день-время, а значит, при алфавитной сортировке старые файлы будут верху, а новые - снизу. В общем сколько бы их не было, там сложно будет потеряться. Как я говорил ранее, задача состоит в том, чтобы каждому файлу в папке присвоить номер, при выборе которого создавалась переменная, значение которой было бы названием этого самого файла. |
UnrealMalcolm,
Цитата:
Код:
@Echo Off Цитата:
|
megaloman, в целом, решение не плохое! Спасибо!
Правда не могли бы вы ещё мне помочь, как сделать, чтоб окно выбора файла открывалось в определенной директории? И как сделать, чтоб переменная имела не путь до файла, а только его название? Хотя конечно решение без mshta.exe тоже было бы не плохо. Всё же хочется задействовать минимум программ. |
Цитата:
Цитата:
Код:
@Echo Off |
Цитата:
|
В общем я своего добился. Правда получился какой-то говно код, но он работает. Единственный косяк - долго работает цикл. В целом за секунд 10 он покажет ~500 файлов. Но всё же хотелось бы что это было моментально.
Сам код получился таким: Код:
@Echo Off |
Цитата:
Скрытый текст
Код:
@echo off Если без выравнивания — можно и короче. |
Iska, супер! Прям что нужно, спасибо! Правда до последнего хотел избегать setlocal, но что поделать...
|
И ещё вопрос, как лучше использовать
Код:
setlocal enableextensions enabledelayedexpansion В начале .bat файла и без endlocal или перед началом данного скрипта с закрытием endlocal? .bat файл большой, там ещё много всего. Но нигде не используется setlocal и так же нет call функции. Ещё немного упростил ваш скрипт, не очень понял зачем создавались некоторые функции и строки. Код:
@echo off |
Цитата:
|
UnrealMalcolm, По идее мне не нравится идея :) : 500 файлов промелькнёт на экране мигом, а как номер выбирать? Я наваял вывод квантами, например, по 30 штук. В принципе, количество выводимых за раз строк можно поставить 100000, и получится как у Iska
Код:
@Echo Off |
Цитата:
|
UnrealMalcolm,
Цитата:
Код:
@Echo Off |
megaloman, спасибо за предложенный вариант, но я уже остановился на варианте Iska.
Немного под себя переделал, добавил пару проверок на наличие папки, файлов, ввода корректного номера файла и т.д. Всё работает отлично. Наверное последнее чего я не понял, как обработать вывод "%%~i". Код:
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "%my_folder%\*.*"`) do ( EDIT: это было просто, вчера голова уже совсем не сображала. Код:
set file_tmp=%%~i /close |
Код:
%%~ni |
Время: 07:51. |
Время: 07:51.
© OSzone.net 2001-