[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 9 лет 3 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
89693Что получаем на выходе?
ой... ah ...время было позднее))

[Цитировать]

    kipjatok001
  • 18520
  • Стаж: 6 лет 7 месяцев
  • Сообщений: 144
  • Репутация:0

    [+] [-]
Всем aa
Вот такой батник получился у меня
DEL /F /S /Q %WINDIR%\Temp\*.*
DEL /F /S /Q %SYSTEMDRIVE%\Temp\*.*
DEL /F /S /Q %Temp%\*.*
DEL /F /S /Q %Tmp%\*.*
DEL /F /S /Q %WINDIR%\Prefetch\*.*
DEL /F /S /Q %SYSTEMDRIVE%\*.log
DEL /F /S /Q %SYSTEMDRIVE%\*.bak
DEL /F /S /Q %SYSTEMDRIVE%\*.gid
sfc /cachesize=0
sfc /purgecache
Cleanmgr /sageset:65535 & Cleanmgr /sagerun:65535

[Цитировать]

    UserX
  • 667
  • Стаж: 9 лет 8 месяцев
  • Сообщений: 861
  • Репутация:37

    [+] [-]
89704Вот такой батник получился у меня
Ваш ватник типа:
"DEL /F /S /Q %Temp%\*.*"
не удаляет сами вложенные папки. Только файлы в них. Разве это сложно проверить?

[Цитировать]

    rezorustavi
  • 2337
  • Стаж: 8 лет 11 месяцев
  • Сообщений: 918
  • Репутация:55

    [+] [-]
  • Откуда: Грузия, город Рустави
kipjatok001,
На 63-ей странице в первом сообщении я давал рабочий вариант. А удаление логов можете дописать, я их не прописывал, так как логи всегда отключаю.

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 9 лет 3 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Ander_73, Здравствуйте aa
Спасите помогите, уже сломал себе мозг
стоит задача:
* возле скрипта есть папка, в ней подпапки
* в подпапках файлы, над которыми надо выполнить команду
* скрипт должен поочередно заходить в эти подпапки и выполнять эту команду
* нюанс в том, что команду нужно выполнить не над каждым файлом по отдельности
* нужно так: команда файл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
  • 15549
  • Стаж: 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
  • 1384
  • Стаж: 9 лет 3 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Ander_73, Большое спасибо, попробую

[Цитировать]

    JuraAD
  • 28398
  • Стаж: 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
  • 1384
  • Стаж: 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
  • 104
  • Стаж: 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,
Приветствую! aa
Может как то так тогда подправить:
@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

[Цитировать]

    JuraAD
  • 28398
  • Стаж: 3 года 5 месяцев
  • Сообщений: 86
  • Репутация:27

    [+] [-]
cartmenezz,
pushd "%1"
...
popd
Это зачем?
for %%b in (%~1\*.txt) тоже лучше на dir заменить (dir шаблоны поддерживает), экранировать нужно (пробелы и все такое)
зы: пока не буду скрипт писать, занят...

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 10 месяцев
  • Сообщений: 3868
  • Репутация:127

    [+] [-]
cartmenezz, обработка "*" вообще в батниках происходит странновато. Тоже периодически сталкивался, но просто старался перестроить шаблон выборки, чтобы не глючило. Тем более, что наличие нескольких * вполне может быть нештатной ситуацией. Не знаю точно.

[Цитировать]

    cartmenezz
  • 1384
  • Стаж: 9 лет 3 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
89746
for /d %%a in (
"var 1"
"var 2"
) do call :dir %%a
Здравствуйте aa
к сожалению, четко прописанные имена не подходят, так как планируется вызывать через call все это дело, передавая в качестве параметра именно часть имени папки, так как папка может меняться (будут обновляться версии)
....
....
JuraAD, Здравствуйте aa
не думаю, что понял все, что вы хотели сказать.. сейчас на работе, буду проверять догадки вечером, спасибо)
...
...
89749обработка "*" вообще в батниках происходит странновато
Здравствуйте aa
понял. по идее в реале это не должно повториться, уж "*1*" у меня точно не будет... по несколько звёздочек уже долго использую таким образом, вроде пока проблем не было, надеюсь ничего не изменится)) тут просто так совпало, что для тестов выбрал названия папок попроще, и отличались они цифрой в названии.. и вот такой вот интересный момент всплыл..

[Цитировать]

    JuraAD
  • 28398
  • Стаж: 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
  • 1384
  • Стаж: 9 лет 3 месяца
  • Сообщений: 527
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
JuraAD, еще раз Благодарю за помощь.
Все ваши варианты попробовал, все рабочие.
89761вход в каталог если нужно
да, для меня этот момент важен, так как название каталога - это название программы, и оно нужно в заголовке в чистом виде, без названия родительского каталога (а он даже и не один будет),.. чем потом заморачиваться с "отрезанием" этого пути, проще предварительно зайти, не хочется сильно усложнять..
89761ну и чёб с приколами не встречаться и нормальные списки файлов получать...
фильтрация по атрибутам и findstr...

Наверное, пока все-таки буду рисковать)) случай с *1* все-таки очень частный, в таком виде поиска папок не будет, да и в принципе цифр в шаблоне имени не будет, они то как раз и будут меняться, поэтому будут прописаны только неизменные части имени... Так что пока вариацию поиска через [FOR /F + DIR] пока просто сохраню до худших времен, на случай если возникнет реальная необходимость.. Ну а про использование *1* в цикле видимо придется просто запомнить (интересно, есть ли там еще подобные приколы))
89761зы: хороший баг... полезно было...
это уж точно,.. но по началу было совсем невесело))
В общем, учитывая все плюсы и минусы, остановился на варианте, предложенном товарищем Ander_73, в нем меня все устраивает (так же отсутствие enabledelayedexpansion радует)
-
Ander_73, sergeysvirid, JuraAD, Еще раз всем спасибо за помощь az

Страница 64 из 94


Показать сообщения:    

Текущее время: 23-Дек 20:29

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы