Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск файлов в папке и вывод их списка под номерами (http://forum.oszone.net/showthread.php?t=339112)

Alex S 07-02-2019 23:47 2856785

Поиск файлов в папке и вывод их списка под номерами
 
Всем привет.
Долго пытаюсь сам решить задачу но не получается, поиск в интернете тоже результата не дал...
Прошу помощи у знающих людей.
Нужно написать скрипт сканирующий директорию на наличие файлов определенного расширения. После определения наличия файлов с нужным расширением, вывести их список с присвоением каждому найденному файлу порядкового номера.
Объясню зачем и как это в планах должно работать.
Скрипт при запуске ищет в директории файлы по расширению(в моём случае *.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

megaloman 08-02-2019 08:52 2856816

Alex S,
Если файлов 1<=N<=9
Код:

@Echo Off                                                                                               
cls
        Set "BootFile=%SYSTEMDRIVE%\Work\Image\sources"
        Set "Mask=Boot*.wim"

        Call :FileName "%BootFile%\%Mask%" "FName" ||Exit /B 1
        Echo %FName%
pause
GoTo :Eof

:FileName
SetLocal
        Set /A N=0
        Set "Spis="
              FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /b /a:-D "%~1"`) DO Set /A N+=1 &(Call Set "@%%N%%=%%f" &Call Set "Spis=%%Spis%%%%N%%")
              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 Set "@FName=%%@%ErrorLevel%%%"
EndLocal& Set "%~2=%@FName%"
Exit /B 0


YuS_2 08-02-2019 09:38 2856824

Цитата:

Цитата Alex S
Найти не проблема, вывести список тоже, но как из списка сделать выбор одного не знаю как реализовать. »

Надо понимать так, что проблема с нумерацией найденного?
Сделать можно так:
Код:

dir /b /a-d "%BootFile%\Boot*.wim"|findstr /n "."
а это полный код с выбором конкретного файла
Код:

@echo off
set "src=d:\111\Boot*.wim"

:begin
cls
for /f "tokens=1* delims=:" %%a in ('dir /b/a-d "%src%"^|findstr /n "." ') do echo.%%~a - %%b
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 not %c% equ %b% (echo некорректное число&pause&goto begin)

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


megaloman 08-02-2019 10:40 2856829

Alex S,
Если файлов 1<=N<=35
Код:

@Echo Off                                                                                               
cls
        Set "BootFile=%SYSTEMDRIVE%\Work\Image\sources"
        Set "Mask=Boot*.wim"

        Call :FileName "%BootFile%\%Mask%" "FName" ||Exit /B 1

        Echo %FName%
pause
GoTo :Eof

:FileName
SetLocal
        Set /A N=0
        Set "Spis="
              FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /b /a:-D "%~1"`) 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=* 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%%%"
EndLocal& Set "%~2=%@FName%"
Exit /B 0

:Symbol
        Set "S=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        Call Set "%~2=%%S:~%1,1%%"
Exit /B


Alex S 08-02-2019 10:51 2856830

megaloman, YuS_2 спасибо большое за помощь. Оба варианта прекрасно работают.

YuS_2 08-02-2019 11:00 2856832

Цитата:

Цитата megaloman
Если файлов 1<=N<=35 »

а если их 350 или не дай бог 3500 ? :)
Вопрос риторический, если что...

Alex S 08-02-2019 12:38 2856860

Вложений: 1
А вот появился новый вопрос. Копаюсь тут и не нахожу решения.
Можно ли сделать чтобы последним пунктом, после поиска всегда был пункт выхода из скрипта?

YuS_2 08-02-2019 13:40 2856872

Цитата:

Цитата Alex S
Можно ли сделать чтобы последним пунктом, после поиска всегда был пункт выхода из скрипта? »

Отчего же нельзя... можно.
Цыганочка с выходом :)
Код:

@echo off
set "src=d:\111\Boot*.wim"

:begin
cls
echo.----------------------------------------------------------------------
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 (echo.Выходим&pause&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


Alex S 08-02-2019 13:52 2856873

YuS_2 спасибо!
Вопросов больше нет, тема решена.

Iska 08-02-2019 18:14 2856896

Цитата:

Цитата YuS_2
Код:

…|findstr /n "."
»

Кстати — логично!

alpap 09-02-2019 02:13 2856946

подкину и я:
Код:

@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


megaloman 09-02-2019 15:27 2857005

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

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

YuS_2 09-02-2019 15:35 2857006

Цитата:

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

Так ведь :choice - не команда, а метка...

Цитата:

Цитата megaloman
Рискую впасть во флуд, но представить монитор с 350 (тем более 3500) строками мне трудновато. »

Ну, мониторы-то сейчас всякие есть, можно и 350 упихать в один экран, но мы же не о DOS говорим, консоль же можно прокручивать:

Iska 09-02-2019 18:44 2857024

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

Alex S 10-02-2019 14:14 2857139

Появился ещё один вопрос, понимаю что не по теме, но он мелкий и не хочется из-за него тему создавать.
Не совсем я понял как происходит поиск информации и запись её в переменную. Слишком много информации из статей и справок в самом начале. Голова закипела...

После поиска файлов 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)

Но что-то видать не так делаю...

Alex S 10-02-2019 14:38 2857153

Такая конструкция вылетает...
Скрытый текст
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)

Alex S 10-02-2019 18:47 2857196

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

Iska 10-02-2019 18:50 2857199

Код:

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

Alex S 10-02-2019 18:55 2857200

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

Iska 10-02-2019 19:43 2857208

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

Сделайте так — в set добавим кавычки, а при dir — уберём:
Код:

set src="%BootFile%\*.wim" "%BootFile%\*.esd"
и:
Код:

… in ('dir /b /a:-d /o:e %src% ^| findstr.exe /n "." ') do …

Alex S 10-02-2019 19:49 2857210

Iska спасибо за помощь.
У меня сработало так:
Код:

set src=""%BootFile%\*.wim","%BootFile%\*.esd""
и так
set src=""%BootFile%\*.wim" "%BootFile%\*.esd""


Iska 10-02-2019 19:54 2857211

Запятая не нужна.

Alex S 10-02-2019 19:56 2857212

Спасибо ещё раз за помощь.

Alex S 28-12-2020 02:12 2944399

Всем привет.
Возникла необходимость переделать скрипт для поиска файлов (*.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 2944443

Цитата:

Цитата Alex S
тут и вся проблема »

не тут
проблема с очередными граблями, а именно:
Цитата:

Цитата Alex S
при поиске файлов выводился их список »

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

Alex S 28-12-2020 18:45 2944458

Цитата:

Цитата alpap
если их много »

Количество может быть от одного до десяти, не более.
Цитата:

Цитата alpap
Не пробовали подружиться с каким-нибудь файловым менеджером? »

Зачем? И так дружу... Задача этого скрипта состоит в автоматизации некоторых действий. Из-за того что имена каталогов искомых файлов иногда разнятся, приходится постоянно открывать скрипт и править переменные с путями. Потому и пришла мысля рекурсивного поиска и автоматической правки переменных с путями... Как-то так!
Ну, если это настолько заморочено, буду искать другой способ...
Цитата:

Цитата alpap
делать список в отдельный файл »

А это мысль...
Спасибо за ответ! :coffee: :ok:

megaloman 28-12-2020 19:46 2944464

Произвольное число файлов
Код:

@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

Если файлов 1<=N<=35
Код:

@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 2944468

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

megaloman 28-12-2020 20:45 2944471

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

Alex S 28-12-2020 20:54 2944472

megaloman, теперь точно в точку. Большего и не надо.
Цитата:

Цитата megaloman
Не понятно, как идентифицировать файл, если имя одно и то же, а путь разный, что выбирать? »

В моём случае в папках будут находиться разноимённые файлы и количеством до пяти штук, поэтому текущий вариант скрипта меня вполне устраивает.

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

Alex S 28-12-2020 23:20 2944486

megaloman, никак не пойму где переменная пути?
%FName% содержит имя выбранного файла, а в какой переменной находится путь к этому файлу не разберусь никак...

megaloman 28-12-2020 23:26 2944487

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

Alex S 28-12-2020 23:32 2944489

Цитата:

Цитата megaloman
но лучше вернуть файлу путь »

Чтож, если все настолько заморочено буду использовать с отображением путей... Спасибо большое еще раз.

megaloman 29-12-2020 00:33 2944492

Имена файлов выводятся, в переменную записывается полный путь.
Код:

@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 2944493

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

Iska 29-12-2020 05:04 2944502

Цитата:

Цитата Alex S
Зачем? … Задача этого скрипта состоит в автоматизации некоторых действий. Из-за того что имена каталогов искомых файлов иногда разнятся, приходится постоянно открывать скрипт и править переменные с путями. »

Затем, что там может быть свой макроязык :), в нём — меню (и прокрутка этого меню), например:
Скрытый текст
Код:

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)


Alex S 29-12-2020 13:15 2944525

Цитата:

Цитата megaloman
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 2944539

Выбрать номер файла и нажать Enter. Кол-во файлов произвольное.
Код:

@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 2944544

СПАСИБО БОЛЬШОЕ! Теперь всё бесподобно! :cool: :yahoo:

Alex S 29-12-2020 23:46 2944576

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

megaloman 30-12-2020 12:24 2944610

Alex S, Всегда можно подобрать данные, способные одурачить любую программу. :)
См. мой код, подправил.
Код:

..........
                If %N2% GTR %N% Set /A N2=%N%
                Set /A i=192837459
                :Begin2
..............


Alex S 30-12-2020 13:26 2944617

Цитата:

Цитата megaloman
См. мой код, подправил »

Теперь точно работает бесподобно. :up: :yes:
megaloman, огромное спасибо за помощь, я Вам очень благодарен!!! :Beer:


Время: 19:23.

Время: 19:23.
© OSzone.net 2001-