cartmenezz
- Стаж: 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 понравился больше, компактность рулит)) ... БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ
|
Ander_73
- Стаж: 7 лет 10 месяцев
- Сообщений: 3868
- Репутация:127[+] [-]
|
cartmenezz, я как раз имел ввиду засунуть цикл проверки extX внутрь цикла. То есть вместо строки:
|
bighead
- Стаж: 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
- Стаж: 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, поэтому добавил в проверку доп расширения (остальные я только предположил) * ну это я поправлю
|
JuraAD
- Стаж: 3 года 5 месяцев
- Сообщений: 86
- Репутация:27[+] [-]
|
-))) пустые строки не попадают в отбор из-за цикла>"%~n1_noComment.cmd" findstr.exe /BV "::" "%~1"
|
Ander_73
- Стаж: 7 лет 10 месяцев
- Сообщений: 3868
- Репутация:127[+] [-]
|
cartmenezz,<in.cmd >out.cmd findstr /vbc:"::"
|
cartmenezz
- Стаж: 9 лет 3 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
JuraAD, Ander_73, Большое спасибо, оба варианта рабочие Но второй лучше, не ругается при перетаскивании файла с кириллицей в пути/имени ... премного благодарен
|
Отправлено: 25-Июн-2022 19:45
(спустя 2 часа 46 минут)
Ander_73
- Стаж: 7 лет 10 месяцев
- Сообщений: 3868
- Репутация:127[+] [-]
|
95805каждый твой код можно в граните отливать Не, не Медведев Не стоит перехваливать, косяков хватает. Но к перфекционизму и минимализму склонен. Код должен быть красив! Он должен вызывать чувство "ни убавить, ни прибавить"! Если код вызывает гордость - это верный знак: ты или на пути к успеху, или прямиком в ад! (что, собссно, почти одно и то же)
|
wert
- Стаж: 5 лет
- Сообщений: 87
- Репутация:2[+] [-]
|
wadimus, согласен. вся наука, программизЬм тот же - это от дьявола. бог - верь! дьявол - сомневайся! учись, познавай .. az мм
|
dimo70
- Стаж: 7 лет
- Сообщений: 3787
- Репутация:27[+] [-]
- Откуда: BG
|
Подскажите как через батником можно удалить все изменения в реестр связаные с груп полиси и ресетнуть все по default? Преимущественно для Windows 10 и Windows 11
_________________ Подпись отключена за нарушение правил форума
|
Gvint64
- Стаж: 4 года 7 месяцев
- Сообщений: 626
- Репутация:72[+] [-]
|
|
Страница 74 из 94
Текущее время: 23-Дек 22:22
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|