Войти

Показать полную графическую версию : [решено] Поиск файлов в папке и вывод их списка под номерами


Страниц : 1 [2] 3

Alex S
10-02-2019, 19:49
Iska спасибо за помощь.
У меня сработало так:
set src=""%BootFile%\*.wim","%BootFile%\*.esd""
и так
set src=""%BootFile%\*.wim" "%BootFile%\*.esd""

Iska
10-02-2019, 19:54
Запятая не нужна.

Alex S
10-02-2019, 19:56
Спасибо ещё раз за помощь.

Alex S
28-12-2020, 02:12
Всем привет.
Возникла необходимость переделать скрипт для поиска файлов (*.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

alpap
28-12-2020, 15:03
тут и вся проблема »
не тут
проблема с очередными граблями, а именно:
при поиске файлов выводился их список »
если их много, то информация замыливается или вообще не умещается на экране
если предполагается делать список в отдельный файл, то ситуация немногим лучше: открыть, прокрутить, найти, запомнить номер, запустить bat, ввести номер - кошмар.
Не пробовали подружиться с каким-нибудь файловым менеджером?

Alex S
28-12-2020, 18:45
если их много »
Количество может быть от одного до десяти, не более.Не пробовали подружиться с каким-нибудь файловым менеджером? »
Зачем? И так дружу... Задача этого скрипта состоит в автоматизации некоторых действий. Из-за того что имена каталогов искомых файлов иногда разнятся, приходится постоянно открывать скрипт и править переменные с путями. Потому и пришла мысля рекурсивного поиска и автоматической правки переменных с путями... Как-то так!
Ну, если это настолько заморочено, буду искать другой способ...
делать список в отдельный файл »
А это мысль...
Спасибо за ответ! :coffee: :ok:

megaloman
28-12-2020, 19:46
@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
@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

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

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

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

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

Alex S
28-12-2020, 23:20
megaloman, никак не пойму где переменная пути?
%FName% содержит имя выбранного файла, а в какой переменной находится путь к этому файлу не разберусь никак...

megaloman
28-12-2020, 23:26
Alex S, нет его. Путь потерян - по вашему требованию. Можно, наверное, заново на это имя сделать dir и восстановить путь к файлу, но лучше вернуть файлу путь.

Alex S
28-12-2020, 23:32
но лучше вернуть файлу путь »
Чтож, если все настолько заморочено буду использовать с отображением путей... Спасибо большое еще раз.

megaloman
29-12-2020, 00:33
@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"
Call Set "@%%SS%%=%%f"
Call Set "Spis=%%Spis%%%%SS%%"
)
If %N%==0 (Echo Files not found "%~1" &Pause &Exit /B 2)
Echo ===== Найдено %N% файлов =====&Echo.
FOR /F "usebackq tokens=1* delims=@=" %%f IN (`2^>nul Set "@"`) DO Echo %%f --^> %%~nxg

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

Alex S
29-12-2020, 00:44
Последний вариант скрипта отработал отлично. Собственно и выполняет всё как и хотелось. Вопрос решён. :yes:
megaloman, ещё раз респектище и большое спасибо!!!

Iska
29-12-2020, 05:04
Зачем? … Задача этого скрипта состоит в автоматизации некоторых действий. Из-за того что имена каталогов искомых файлов иногда разнятся, приходится постоянно открывать скрипт и править переменные с путями. »
Затем, что там может быть свой макроязык :), в нём — меню (и прокрутка этого меню), например:
local function LoadFile(FindData, FullPath)
Files[#Files + 1] = {text = FindData.FileName}
end

Properties = {Title = 'Choose file:'}
Files = {}

far.RecursiveSearch([[C:\Мои проекты]], '*.vbs', LoadFile, far.Flags.FRS_RECUR)

Item, Position = far.Menu(Properties, Files)
far.Message(Item.text)

https://i.imgur.com/rZphVII.png

Alex S
29-12-2020, 13:15
CHOICE /C %Spis% /N /M "Выберите номер файла, 0(нуль)-Завершить командный файл" »результаты тестов показывают, что такая конструкция не очень удобна. При выборе происходит мгновенный переход к действию.
Нельзя-ли здесь реализовать вариант типа:
:choice
echo --------------------------------------------------------------------------------
echo.
set /p "c=Ваш выбор: "
if "%C%"=="0" goto Exit
if "%C%"=="2" set ...
if "%C%"=="1" set ...

Или как в самом первом примере. Такой вариант ожидает подтверждения выбора нажатием Enter. Сам пытаюсь прикрутить нечто подобное и никак...

megaloman
29-12-2020, 15:20
@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)

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"
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%
Set /A i=192837459
:Begin2
Cls
Echo == Из %N% файлов показаны с %N1% по %N2% =====&Echo.
FOR /L %%i IN (%N1%,1,%N2%) DO (
FOR /F "usebackq delims=" %%x IN (`Call Echo %%@%%i%%`) DO Echo %%i --^> %%~nxx
)
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
В строке
Call :FileName "%BootFile%" 30 "FName" ||Exit /B 1
30 число строк, отображаемых в порции прокрутки (если она потребуется исходя из количества файлов).

Alex S
29-12-2020, 16:37
СПАСИБО БОЛЬШОЕ! Теперь всё бесподобно! :cool: :yahoo:

Alex S
29-12-2020, 23:46
Я извиняюсь за назойливость, что изменить в скрипте, чтобы запретить ввод символов?
При запуске и выборе номера из списка случайно (действительно случайно :( ) ввёл какой-то символ вместо цифры(+,-,* - даже не знаю).
Получил "Непредвиденное появление (и символ)". Стал проверять... Выяснилось, если при первом запуске ввести например звёздочку - получаем ошибку и выход, а вот если сначала ввести к примеру 5 из 4-х возможных, получаем предупреждение из скрипта и на второй круг.
Так вот, странность, если на втором круге ввести ту же звездочку - получаем уже предупреждение из скрипта и на следующий круг.
Навело на мысль, что может нужно поменять какие-нибудь строки местами :unsure: ? Ведь символы скрипт не принимает на последующих кругах, а при первом вводе не ожидает их(может проверка на символы идет позже, после проверки цифр :dont-know ).




© OSzone.net 2001-2012