UserX
- Стаж: 9 лет 8 месяцев
- Сообщений: 861
- Репутация:37[+] [-]
|
89704Вот такой батник получился у меня Ваш ватник типа: "DEL /F /S /Q %Temp%\*.*" не удаляет сами вложенные папки. Только файлы в них. Разве это сложно проверить?
|
rezorustavi
- Стаж: 8 лет 11 месяцев
- Сообщений: 918
- Репутация:55[+] [-]
- Откуда: Грузия, город Рустави
|
kipjatok001, На 63-ей странице в первом сообщении я давал рабочий вариант. А удаление логов можете дописать, я их не прописывал, так как логи всегда отключаю.
|
cartmenezz
- Стаж: 9 лет 3 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
Ander_73, Здравствуйте Спасите помогите, уже сломал себе мозг стоит задача: * возле скрипта есть папка, в ней подпапки * в подпапках файлы, над которыми надо выполнить команду * скрипт должен поочередно заходить в эти подпапки и выполнять эту команду * нюанс в том, что команду нужно выполнить не над каждым файлом по отдельности * нужно так: команда файл1 файл2 файл3 ... * т.е. необходимо получить строку, содержащую вряд имена всех файлов в папке, и подставить к команде * ранее у меня все было немного проще - надо было заходить в одну папку * теперь хочу иметь возможность в виде аргумента передавать сразу несколько шаблонов имени папки * и ничего не получается вот примерный каркас: * команду заменил на "echo", файлы просто на текстовые * на самом деле колдую над установкой split-apk файлов через adb, но тогда чтобы вы мне смогли помочь придется много сопутки скидывать (да и мне самому так проще разобраться)test_2.cmd@echo off cd /d "%~dp0" echo. :1 call :inst "NUM" "NAME" "*var*1*, *var*2*" echo. pause exit /b :inst echo [%~1] INSTALL: %~2 cd /d "%~dp0var" for /D %%A in (%~3) do ( cd /d "%~dp0var\%%~A" echo. echo [*] INSTALLING "%%~A"... SetLocal EnableDelayedExpansion set "list=" for %%B in (*.txt) do set "list=!list! %%~B" set "list=%list:~1%" echo %list% EndLocal ) exit /b рядом с батником папка "var", в ней: папка "var 1" (в ней 1.txt, 11.txt, 111.txt), папка "var 2" (в ней 2.txt, 22.txt, 222.txt) * в именах файлов пробелов не будет нужно получить на выходе:цель[NUM] INSTALL: NAME [*] INSTALLING "var 1"... 1.txt 11.txt 111.txt [*] INSTALLING "var 2"... 2.txt 22.txt 222.txt Для продолжения нажмите любую клавишу . . . ... я как бы предполагаю, что проблема в скобках, поэтому ничего не работает, но как иначе выстроить имена файлов в ряд, понять не могу ... вот мой тестовый комплект (батник+папки+текстовые_пустышки): ссылка Добавлено через 2 минуты 44 секунды: возвращаться к варианту с только одной папкой ну очень не хочется, так как иногда нужна установка сразу из 2х/3х папок и при этом хочется иметь один общий заголовок - - UPD - практически сплю, поэтому на 100% не могу быть уверен, но кажется разобрался:test_3.cmd@echo off cd /d "%~dp0" echo. :1 call :inst "NUM" "NAME" "*var*1*, *var*2*" echo. pause exit /b :inst echo [%~1] INSTALL: %~2 cd /d "%~dp0var" for /D %%A in (%~3) do ( cd /d "%~dp0var\%%~A" echo. echo [*] INSTALLING "%%~A"... SetLocal EnableDelayedExpansion set "list=" for %%B in (*.txt) do set "list=!list! %%~B" set "list=!list:~1!" echo !list! EndLocal ) exit /b
|
Ander_73
- Стаж: 7 лет 10 месяцев
- Сообщений: 3868
- Репутация:127[+] [-]
|
cartmenezz, из того, что я понял:@echo off for /d %%a in (ff\*) do call :dir %%a exit :dir pushd %1 set l=& for %%b in (*.*) do call set l=%%l%% %%b set l=%l:~1% echo %l% popd ff - папка рядом со скриптом, в которой подпапки.
|
cartmenezz
- Стаж: 9 лет 3 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
Ander_73, Большое спасибо, попробую
|
JuraAD
- Стаж: 3 года 5 месяцев
- Сообщений: 86
- Репутация:27[+] [-]
|
89732... for /d %%a in (ff\*) do call :dir %%a ... ff - папка рядом со скриптом, в которой подпапки. -) нет, ff в текущей папке... а скрипт я могу запустить с указанием откуда, типа o:\x\1.cmd o:\x\1.cmd запускаем с o:\@echo off echo %cd% echo %~dp0 echo ### for /d %%a in (*) do echo %%a echo ### dir /b /a:d o:\x\ echo ### dir /b /a:d o:\ результатO:\>O:\x\1.cmd O:\ O:\x\ ### .dhcp .lin sys sys.all sys.old work x ### new win work _soft _tor ### ! $RECYCLE.BIN .dhcp .lin sys sys.all sys.old System Volume Information work x обрати внимание - for /d %%a скрытые папки не показал: ! $RECYCLE.BIN System Volume Information
|
cartmenezz
- Стаж: 9 лет 3 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
89732из того, что я понял Еще раз благодарю, вроде как подправил вашу конструкцию под свои нужды:@echo off echo. cd /d "%~dp0ff" for /d %%a in (*часть*имени*папки*, *часть*имени*папки*) do call :dir "%%a" echo. pause exit /b :dir echo. echo [*] INSTALLING "%~1"... pushd "%1" set l=& for %%b in (*.txt) do call set l=%%l%% %%b set l=%l:~1% echo %l% popd exit /b Не все правда гладко, не могу понять почему так происходит. В реальных условиях с реальными именами папок, наверное, не придется с этим столкнуться, но тем не менее странно... Заметил как обычно случайно)) Для тестов в общей папке "ff" добавил еще пару папок, теперь так:папка "var 1" (в ней 1.txt, 11.txt, 111.txt) папка "var 2" (в ней 2.txt, 22.txt, 222.txt) папка "var a" (в ней a.txt, aa.txt, aaa.txt) папка "var b" (в ней b.txt, bb.txt, bbb.txt) Допустим (как и в предыдущих тестах) я хочу выполнить команду (echo) над файлами (.txt) из вложенных директорий, у которых в названиях есть "var и 1", "var и 2" (в моем случае это папки "var 1" и "var 2"). Правлю соответствующим образом 4ю строку:for /d %%a in (*var*1*, *var*2*) do call :dir "%%a" Ожидая увидеть вот это:[*] INSTALLING "var 1"... 1.txt 11.txt 111.txt [*] INSTALLING "var 2"... 2.txt 22.txt 222.txt Для продолжения нажмите любую клавишу . . . Но вижу вот это:[*] INSTALLING "var 1"... 1.txt 11.txt 111.txt [*] INSTALLING "var 2"... 2.txt 22.txt 222.txt [*] INSTALLING "var a"... a.txt aa.txt aaa.txt [*] INSTALLING "var b"... b.txt bb.txt bbb.txt [*] INSTALLING "var 2"... 2.txt 22.txt 222.txt Для продолжения нажмите любую клавишу . . . Как выяснилось, *var*1* - выдает все папки (и "var 1" и "var 2" и "var a" и "var b"), при этом такого же не происходит с *var*2* или *var*a* или *var*b* Т.е. в данном случае *var*1* обрабатывается как *var* (так же я понял, что то решение к которому я пришел вчера поздней ночью - нерабочее, я думал что там обработались обе папки "var 1" и "var 2" потому что я так прописал, а по факту шаблон второго имени из набора вообще не был учтен, просто *var*1* выдало все папки с "var" в названии, на тот момент у меня их было две, вот и не заметил сразу) В принципе, если заменить 4ю строку на:for /f "tokens=* delims=" %%a in ('dir /b /a:d^| findstr /ir ".*var.*1.* .*var.*2.*"') do call :dir "%%a" то такой проблемы нет, но уже как-то сложненько получается... В общем, пошел читать справку по "FOR /D", наверное там что-то очевидное и я конкретно туплю)) Добавлено через 2 часа 36 минут 45 секунд: как я понял, необычное (для моего уровня знаний) поведение не только в "FOR /D", но и просто в "FOR":
видимо *1* интерпретируется не как "любое кол-во символов + единица + любое кол-во символов", а как-то иначе.. поначалу я решил что это любой символ, что *1* = * ... но почему тогда *1*.txt не показало "X.txt" и "Z.txt" ??? извиняюсь, если вопрос глупый, но мне такая информация нигде не попадалась..
|
sergeysvirid
- Стаж: 10 лет
- Сообщений: 2599
- Репутация:127[+] [-]
- Откуда: 65 регион (GMT+11)
|
89745Допустим (как и в предыдущих тестах) я хочу выполнить команду (echo) над файлами (.txt) из вложенных директорий, у которых в названиях есть "var и 1", "var и 2" (в моем случае это папки "var 1" и "var 2"). Правлю соответствующим образом 4ю строку: for /d %%a in (*var*1*, *var*2*) do call :dir "%%a" cartmenezz, Приветствую! Может как то так тогда подправить:@echo off echo. cd /d "%~dp0ff" for /d %%a in ( "var 1" "var 2" ) do call :dir %%a echo. pause exit /b :dir echo. echo [*] INSTALLING "%~1"... pushd "%1" set l=& for %%b in (*.txt) do call set l=%%l%% %%b set l=%l:~1% echo %l% popd exit /b
|
Отправлено: 14-Ноя-2021 11:19
(спустя 1 час 20 минут)
cartmenezz
- Стаж: 9 лет 3 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
89746for /d %%a in ( "var 1" "var 2" ) do call :dir %%a Здравствуйте к сожалению, четко прописанные имена не подходят, так как планируется вызывать через call все это дело, передавая в качестве параметра именно часть имени папки, так как папка может меняться (будут обновляться версии) .... .... JuraAD, Здравствуйте не думаю, что понял все, что вы хотели сказать.. сейчас на работе, буду проверять догадки вечером, спасибо) ... ...89749обработка "*" вообще в батниках происходит странновато Здравствуйте понял. по идее в реале это не должно повториться, уж "*1*" у меня точно не будет... по несколько звёздочек уже долго использую таким образом, вроде пока проблем не было, надеюсь ничего не изменится)) тут просто так совпало, что для тестов выбрал названия папок попроще, и отличались они цифрой в названии.. и вот такой вот интересный момент всплыл..
|
JuraAD
- Стаж: 3 года 5 месяцев
- Сообщений: 86
- Репутация:27[+] [-]
|
Гык! Прикольненько... Создал:папка "var 1" (в ней 1.txt, 11.txt, 111.txt) папка "var 2" (в ней 2.txt, 22.txt, 222.txt) папка "var a" (в ней a.txt, aa.txt, aaa.txt) папка "var b" (в ней b.txt, bb.txt, bbb.txt) - прогнал:O:\x\work>dir /b /a:d *var*1* var 1 var 2 var a var b O:\x\work>dir /b /a:d *var*2* var 2 O:\x\work>dir /b /a:d *var*a* var a O:\x\work>dir /b /a:d *var*b* var b - чудо m$, нет об'яснения... волшебная комбинация "1" и "*" -))) придется полный вывод фильтровать findstr нацарапал@echo off&setlocal enableextensions enabledelayedexpansion for /f "tokens=* delims=" %%a in ('dir /b /a:d^|findstr /ir ".*var.*1.*"') do call :_dir "%%a" endlocal&exit /b 0 :_dir echo. echo [*] INSTALLING "%~1"... set "l="&for %%b in ("%~1\*.txt") do set "l=!l! "%%b"" set "l=%l:~1%" echo %l% goto :eof вход в каталог если нужно, изменить::_dir echo. echo [*] INSTALLING "%~1"... pushd "%1" set "l="&for %%b in ("*.txt") do set "l=!l! "%%b"" set "l=%l:~1%" echo %l% popd goto :eof ну и чёб с приколами не встречаться и нормальные списки файлов получать:set "l="&for /f "tokens=* delims=" %%b in ('dir /b /a:-d "*.txt"') do set "l=!l! "%%b"" понятно что заменить... и т.д, фильтрация по атрибутам и findstr... зы: хороший баг... полезно было... кому сейчас легко!?...
|
cartmenezz
- Стаж: 9 лет 3 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
JuraAD, еще раз Благодарю за помощь. Все ваши варианты попробовал, все рабочие.89761вход в каталог если нужно да, для меня этот момент важен, так как название каталога - это название программы, и оно нужно в заголовке в чистом виде, без названия родительского каталога (а он даже и не один будет),.. чем потом заморачиваться с "отрезанием" этого пути, проще предварительно зайти, не хочется сильно усложнять..
89761ну и чёб с приколами не встречаться и нормальные списки файлов получать... фильтрация по атрибутам и findstr... Наверное, пока все-таки буду рисковать)) случай с *1* все-таки очень частный, в таком виде поиска папок не будет, да и в принципе цифр в шаблоне имени не будет, они то как раз и будут меняться, поэтому будут прописаны только неизменные части имени... Так что пока вариацию поиска через [FOR /F + DIR] пока просто сохраню до худших времен, на случай если возникнет реальная необходимость.. Ну а про использование *1* в цикле видимо придется просто запомнить (интересно, есть ли там еще подобные приколы))
89761зы: хороший баг... полезно было... это уж точно,.. но по началу было совсем невесело)) В общем, учитывая все плюсы и минусы, остановился на варианте, предложенном товарищем Ander_73, в нем меня все устраивает (так же отсутствие enabledelayedexpansion радует) - Ander_73, sergeysvirid, JuraAD, Еще раз всем спасибо за помощь
|
Страница 64 из 94
Текущее время: 23-Дек 20:19
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|