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

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

    [+] [-]
  • Откуда: Калининград
95752Если вы понимаете, о чём я...
Кажется, чем дальше, тем больше убеждаюсь что вообще ничего не понимаю)) Но тут вроде понял, defined внутри цикла "видит" созданную внутри этого же цикла переменную, без EnableDelayedExpansion, правильно?
...
переделал так:
for /f %%A in ('...findstr...') do (
  set var=& for %%f in (ext1 ext2 ext3 ext4) do if /i "%%~xB"==".%%f" set var=1
  if "%%A"=="..." if defined var (
    ...
    ...
    ...
  ) ELSE (
    echo error
    ...
    ...
    ...
    exit /b
    )
)
продолжение действий
(предполагается, что раз не была определена ошибка и не было выхода, значит все норм)
...
...
...
и понял что в моем случае это не работает, так как в цикле у меня изначально идет поиск определенной строки, и если она она не найдена, то получается что вообще ничего не происходит, в том числе того, что у меня записано после ELSE...
и моя изначальная конструкция работала исключительно на второй проверке:
if /i not "%file_ext%"==".ext1" if /i not "%file_ext%"==".ext2" ^
if /i not "%file_ext%"==".ext3" if /i not "%file_ext%"==".ext4" GoTo :error
а первое "GoTo :error" собственно никогда и не выполнялось...
В общем, затупил
...
можно было бы перенести все оставшиеся действия в цикл, а вывод об ошибке перенести наружу:
for /f %%A in ('...findstr...') do (
  set var=& for %%f in (ext1 ext2 ext3 ext4) do if /i "%%~xB"==".%%f" set var=1
  if "%%A"=="..." if defined var (
    ...
    ...
    ...
    ...
    exit /b
  )
)
echo error
...
...
exit /b
но там после цикла тоже были ветвления из-за условий, так что остановился на таком варианте:
set file_ext=& for /f %%A in ('...findstr...') do (
  if "%%A"=="..." (
    ...
    set "file_ext=%%~xB"
    ...
  )
)
set var=& for %%f in (ext1 ext2 ext3 ext4) do if /i "%file_ext%"==".%%f" set var=1
if not defined var (
  echo error
  ...
  ...
  exit /b
)
продолжение действий
...
...
...
exit /b
думаю это приемлемо, хоть проверки условий и пришлось раскидать, но они обе выполняются/
если подумать, то это примерно тоже самое что в моем изначальном варианте:
1. если строка найдена, если первый токен равен условию, то выполняются действия, в том числе переменная file_ext получает значение ("ELSE GoTo :error" можно просто вырезать)
2. если переменная file_ext не равна ни одному из перечисленный расширений (а она никак не могла получить одно из них, если первый токен не прошел проверку), то сообщение об ошибке и выход
3. продолжение (если одно из расширений совпало с значением переменной file_ext)
Но вариант с:
set var=& for %%f in (ext1 ext2 ext3 ext4) do if /i "%file_ext%"==".%%f" set var=1
понравился больше, компактность рулит))
...
БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ az

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

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

    [+] [-]
cartmenezz, я как раз имел ввиду засунуть цикл проверки extX внутрь цикла. То есть вместо строки:
set "file_ext=%%~xB"

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

    bighead
  • 29484
  • Стаж: 3 года 1 месяц
  • Сообщений: 402
  • Репутация:24

    [+] [-]
Вчера задался вопросом наличие скрипта для сжатия диска системного и создания раздела второго.
В итоге ничего путного не нашёл, но попался скрипт Ander_73 Создание 2-раздельной флешки
Сразу говорю, я хоть для себя батники и делаю, но у меня знаний нет в этом, как и нормального опыта кодинга.
Посмотрел на скрипт нифига не понял, но начал медленно под себя менять. В итоге немного разобрался как работает и подвёл под себя.
Как итог. Проверил работает как надо.
@echo off
if exist %windir%\sysnative\ %windir%\sysnative\cmd /c "%~fs0"& goto :eof
>nul 2>&1 dism|| (
mshta "vbscript:CreateObject("Shell.Application").ShellExecute("%~fs0", "", "", "runas", 1) & Close()"
goto :eof
)
if "%1"=="run" (
title -= Create 2-partition HDD =-
chcp 860
mode 80,40
goto run
)
2>nul (
md %systemroot%\Temp
mklink %systemroot%\Temp\cmd.exe %comspec%
)
for %%i in ("reg add HKEY_CURRENT_USER\Console\%%SystemRoot%%_Temp_cmd.exe /f /v") do (
%%~i "FontSize"  /t REG_DWORD  /d 0x0010000c
%%~i "FontFamily"  /t REG_DWORD  /d 0x00000030
%%~i "FaceName"  /t REG_SZ  /d "Terminal"
)
start %systemroot%\Temp\cmd.exe /c "%~f0" run
goto :eof
:run
cls
>%tmp%\s echo lis volume
diskpart /s %tmp%\s
echo/
set vlm=& set /p "vlm=Select volume number [empty = quit]: "|| goto quit
cls
>%tmp%\s (
echo sel volume %vlm%
echo det volume
)
diskpart /s %tmp%\s
call :isOK|| goto run
:size
echo/
echo/
set gb=& set /p "gb=Vvedite kol-vo GB: "|| goto quit
cls
>%tmp%\s (
echo sel volume %vlm%
echo shrink desired %gb%000
echo create part extended
echo create part logical size=%gb%000
echo format fs=ntfs label=Docs quick
echo assign
echo detail disk
)
diskpart /s %tmp%\s
call :isOK|| goto run
mshta vbscript:Execute("MsgBox ""Successfully completed"",64,"" Information"":close")
goto quit
:isOK
echo/
echo/
choice /m "Is this correct"
if %errorlevel%==2 exit /b 1
exit /b 0
:quit
reg delete HKEY_CURRENT_USER\Console\%%SystemRoot%%_Temp_cmd.exe /f
del /q %systemroot%\Temp\cmd.exe %tmp%\s

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

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

    [+] [-]
  • Откуда: Калининград
95761я как раз имел ввиду засунуть цикл проверки extX внутрь цикла
т.е. еще глубже чем я пробовал? в любом случае, переносить полностью все действия под скобки цикла мне показалось проблематичным, там у меня потом еще идет извлечение файла и работа с ним (и действия разнятся, в зависимости от расширения этого файла)
и действия при ошибке получается придется дублировать:
- если первое условие не выполнено, выводим ошибку и делаем дела
- если первое выполнено, попадаем глубже, если второе не выполнено, выводим ошибку и делаем дела
* вывод ошибки у меня подкрашен, плюс там же обнуление парочки переменных, суммарно 10 строк
* можно конечно это немного закомпактить с помощью &, но у меня так глаз хуже воспринимает, лишний раз не прибегаю
* поэтому у меня изначально и было "GoTo :error", чтобы не дублировать большой кусок
...
сейчас, вроде как, норм:
* GoTo не используется,
* кусок не задублирован,
* идет анализ вывода команды,
* если в выводе найдена нужная строка, то проверяется первое условие (может это даже и лишнее, формат вывода команды довольно стандартизирован, и если строка найдена, то в принципе в 6-ом токене должно быть то что мне нужно, но я все-таки перестраховываюсь и перепроверяю 5-й токен),
* выполняется часть действий (получаю несколько переменных из 6-го токена)
* дальше, уже вне цикла, проверяется одна из полученных переменных (соответствие расширению из списка)
* если совпадения нет, то вывод ошибки и т.д.
* в данном варианте ошибка не выводится после проверки первого условия, но по сути оно тоже проверяется, ведь значение переменной не может совпасть с одним из расширений, если эта переменная не получила это значение после успешной проверки первого условия
...
из тех упрощенных схем, что я приводил, наверное, неочень понятно что мне надо сделать.
вот конкретный кусок из батника:
:banner_2
echo   APK-FILE SELECT...
set apk=& set "banner_fullpath=null"& set "banner_ext=null"& set "banner_name.ext=null"
chcp 1251 >nul
for /f "delims=" %%A in ('FileToOpen "set apk=" "%SystemDrive%\*.apk" "SELECT APK-FILE" /noquote') do %%A
chcp 866 >nul
if not DEFINED apk exit /b
if not EXIST "%apk%" set "banner=null"& set "_banner=not chosen"& GoTo :file_sel_error
for /f "delims=" %%A in ("%apk%") do set "apk_name=%%~nA"
for /f "useback tokens=5,6 delims='" %%A in (`aapt d badging "%apk%"^| findstr /irc:"application: .* banner='res/.*'"`) do (
  if "%%A"==" banner=" (
    set "banner_fullpath=%%B"
    set "banner_ext=%%~xB"
    set "banner_name.ext=%%~nxB"
  )
)
set ext_var=& for %%A in (.png .webp .jpg .jpeg .bmp .gif) do (
  if /i "%banner_ext%"=="%%A" set ext_var=OK
)
if not DEFINED ext_var (
  set "banner=null"
  set "_banner=not chosen"
  echo.
  cocolor 0C
  echo   ERROR: UNABLE TO DETECT BANNER. MAYBE THE APK HAS A "NON-STANDARD" STRUCTURE, OR THE RESOURCES ARE ENCRYPTED,
  echo          OR THERE IS NO BANNER IN THIS APK
  cocolor 07
  echo.
  <nul set /p "=%del_char%  "& pause
  exit /b
)
7z e -ssc -y "%apk%" "%banner_fullpath%" >nul 2>nul
if /i "%banner_ext%"==".webp" (
  convert "%banner_name.ext%" "%Desktop%\%apk_name%_banner.png"
  del /F/Q "%banner_name.ext%" >nul 2>nul
  set "banner=%Desktop%\%apk_name%_banner.png"
  call set "_banner=%%banner%%"
  exit /b
)
move /Y "%banner_name.ext%" "%Desktop%\%apk_name%_banner.png" >nul
set "banner=%Desktop%\%apk_name%_banner.png"
set "_banner=%banner%"
exit /b
или вот так, для наглядности:-PS: не пойму, теги "Эскиз" и "Картинка" не работают? или проблема в фотохостингах что я пробовал? раньше пользовался radikal, но видимо они тоже ушли из Росии))
(жаль что нет возможности прямо на форум фотку залить)
+ + + upd + + +
только что заметил еще одну свою глупость - в конце у меня два варианта:
* если файл с расширением WEBP - пережимается в PNG
* в ином случае, перемещается и сохраняется с расширением PNG
* это при том, что сам я выше допускаю возможность еще нескольких расширений
* может так получиться, что будет найден, например, JPG и он сохранится как PNG
* в общем, глупость... просто, по факту я встречал только PNG и WEBP
* но потом наткнулся на файл с, кажется, JPEG, поэтому добавил в проверку доп расширения (остальные я только предположил)
* ну это я поправлю

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

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

    [+] [-]
  • Откуда: Калининград
Разрешите еще понадоедать ab
Ввиду малого опыта, а так же того что некоторые решения получаются из долгих опытов, чтобы потом не забыть что я понаписал, и почему именно так написал - я частенько добавляю комментарии, и не всегда они получаются компактными, часто их стыдно кому-то показывать))
Захотелось как-нибудь автоматизировать процесс удаления комментариев из батника, пришел к такому варианту:
if EXIST "%~n1_noComment.cmd" del /f /q "%~n1_noComment.cmd"
for /f "delims=" %%A in ('findstr /BV "::" "%~1"') do (
>>"%~n1_noComment.cmd" echo.%%A
)
но вот беда, вырезаются так же пустые строки

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

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

    [+] [-]
-))) пустые строки не попадают в отбор из-за цикла
>"%~n1_noComment.cmd" findstr.exe /BV "::" "%~1"

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

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

    [+] [-]
cartmenezz,
<in.cmd >out.cmd findstr /vbc:"::"

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

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

    [+] [-]
  • Откуда: Калининград
JuraAD, Ander_73, aa
Большое спасибо, оба варианта рабочие
Но второй лучше, не ругается при перетаскивании файла с кириллицей в пути/имени
...
премного благодарен az

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

    wadimus
  • 14910
  • Стаж: 8 лет 1 месяц
  • Сообщений: 749
  • Репутация:91

    [+] [-]
Ander_73, тщёрд .. так бы научиться писать батники ..
ЗЫ. вопрос личный не_по_теме: ты преподаватель? каждый твой код можно в граните отливать az

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

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

    [+] [-]
95805каждый твой код можно в граните отливать
Не, не Медведев af
Не стоит перехваливать, косяков хватает. Но к перфекционизму и минимализму склонен.
Код должен быть красив! Он должен вызывать чувство "ни убавить, ни прибавить"!
Если код вызывает гордость - это верный знак: ты или на пути к успеху, или прямиком в ад! (что, собссно, почти одно и то же) ag

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

    wadimus
  • 14910
  • Стаж: 8 лет 1 месяц
  • Сообщений: 749
  • Репутация:91

    [+] [-]
95806ты или на пути к успеху, или прямиком в ад!
согласен.
вся наука, программизЬм тот же - это от дьявола.
бог - верь!
дьявол - сомневайся! учись, познавай ..
az

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

    wert
  • 23213
  • Стаж: 5 лет
  • Сообщений: 87
  • Репутация:2

    [+] [-]
wadimus, согласен.
вся наука, программизЬм тот же - это от дьявола.
бог - верь!
дьявол - сомневайся! учись, познавай ..
az мм bc aq

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

    dimo70
  • 17296
  • Стаж: 7 лет
  • Сообщений: 3787
  • Репутация:27

    [+] [-]
  • Откуда: BG
Подскажите как через батником можно удалить все изменения в реестр связаные с груп полиси и ресетнуть все по default? Преимущественно для Windows 10 и Windows 11 aa

_________________
Подпись отключена за нарушение правил форума

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

    Gvint64
  • 24573
  • Стаж: 4 года 7 месяцев
  • Сообщений: 626
  • Репутация:72

    [+] [-]
dimo70, Здесь можно почитать

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

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

    [+] [-]
Gvint64, aa
Интересная статья. Кроме вот этого ляпа
В Windows 10 2004 команда rd.exe была удалена из образа, поэтому для удаления каталогов нужно использовать команду rmdir.exe .
остальное вполне полезно. Спасибо!

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


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

Текущее время: 24-Дек 04:26

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


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