Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 8

Автор: lorents
Дата сообщения: 22.03.2010 20:35
king_stiven
Вот посмотрите это мой проект
http://webfile.ru/4376150
У меня следующая проблема

Код: for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do if /i "_%%~i" equ "_" goto:loop2
Автор: wolf0425
Дата сообщения: 22.03.2010 20:57

Цитата:
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do if /i "_%%~i" equ "_" goto:loop2
надо сделать, что если нет файлов png в папке Images или его подпапках, то запрос не должен вводится
этот for и так что-то проверяет только если есть файл, попадающий под маску Images\*.png.
с учетом того что "_%%~i" никогда не может быть равно "_" - переход никогда не выполнится, строка не делает совершенно ничего.

Автор: mugil_cephalus
Дата сообщения: 22.03.2010 21:01
wolf0425

Цитата:
она не срабатывает только если имя каталога указывать в неправильной кодировке - что делать никто не заставляет.

а как указать "правильную" кодировку в блокноте, где и пишутся, в основном, bat-файлы ? только поставив предварительно - chcp.
1) на 1-ом скрине - команда cd работает, потому что команда chcp меняет исходную - 866 - кодировку на 1251
2) на 2-ом скрине - команда cd работает по этой же причине, но, не возвращая кодировку с 1251 на исходную - 866, - появляются кракозябры в "версия"
3) на 3-ей скрине - команда cd не работает, потому что команда chcp не меняет исходную - 866 - кодировку на 1251
Автор: lorents
Дата сообщения: 22.03.2010 21:05
wolf0425

Цитата:
с учетом того что "_%%~i" никогда не может быть равно "_" - переход никогда не выполнится, строка не делает совершенно ничего.

а как тогда надо?
Автор: wolf0425
Дата сообщения: 22.03.2010 21:15

Цитата:
а как указать "правильную" кодировку в блокноте, где и пишутся, в основном, bat-файлы ? только через chcp.
никогда не писал bat-файлы в блокноте - как-то предпочитал нормальные редакторы, и батники в 866 кодировке - чтобы ничего никуда не переключать.
последний год регулярно пишу в 1251 - но опять же не в блокноте.

Цитата:
1) на 1-ом скрине - команда cd работает, потому что команда chcp меняет исходную - 866 - кодировку на 1251
и какое это имеет отношение к "%~dp0Docs\pngcrush.exe" ?

Цитата:
2) на 2-ом скрине - команда cd работает по этой же причине, но, не возвращая кодировку с 1251 на исходную - 866, - появляются кракозябры в "версия"
кракозябры там появляются потому что у тебя выбранный фонт не умеет отображать символы в 1251 - в которой, в соответствии со сделанным тобой выбором, ver тебе пишет свой вывод.
он пишет ровно то что ты от него просил, с нормальным фонтом - выглядит всё нормально, смотри скриншоты. 866 и 1251 надписи - вперемешку и без кракозябр.

Цитата:
3) на 3-ей скрине - команда cd не работает, потому что команда chcp не меняет исходную - 866 - кодировку на 1251
не работает потому что в команде cd путь указан в неправильной кодировке - не той что выбрана. Указывать в правильной - не проблема, к выбору cp это отношения не имеет.
примеров что можно указывать в правильной кодировке, оставаясь в 866, и иметь вывод без кракозябр - там полстраницы.




Добавлено:lorents
Цитата:
а как тогда надо?
а мне то откуда знать - я же не знаю что ты там вообще хочешь.
писать за тебя батник целиком мне откровенно лень - с таким количеством помощников ты должен был сам давно разобраться и написать.
Автор: mugil_cephalus
Дата сообщения: 22.03.2010 21:27
wolf0425

Цитата:
никогда не писал bat-файлы в блокноте - как-то предпочитал нормальные редакторы, и батники в 866 кодировке - чтобы ничего никуда не переключать.
последний год регулярно пишу в 1251 - но опять же не в блокноте.

позавидовать можно

Цитата:
и какое это имеет отношение к "%~dp0Docs\pngcrush.exe" ?

если "%~dp0Docs\pngcrush.exe" раскроется в c:\кириллица\Docs\pngcrush.exe и Текущая кодовая страница: 866

Цитата:
кракозябры там появляются потому что у тебя выбранный фонт не умеет отображать символы в 1251 - в которой, в соответствии со сделанным тобой выбором, ver тебе пишет свой вывод.
он пишет ровно то что ты от него просил.

и как я на фонт повлияю?

Цитата:
не работает потому что в команде cd путь указан в неправильной кодировке - не той что выбрана. Указывать в правильной - не проблема,

в блокноте, где и пишу скрипты, я этого не смогу
Автор: wolf0425
Дата сообщения: 22.03.2010 21:30
dronxumuk

Цитата:

Цитата: что значит не идет? замечательно идет - robocopy сначала скопируй куда надо.
Что Вы имеете в виду?
Автор: lorents
Дата сообщения: 22.03.2010 21:31
wolf0425

Цитата:
а мне то откуда знать - я же не знаю что ты там вообще хочешь.
писать за тебя батник целиком мне откровенно лень - с таким количеством помощников ты должен был сам давно разобраться и написать.

Я все понимаю, я очень благодарен Всем кто мне помогал, выходит остается решить последнюю проблему
Автор: wolf0425
Дата сообщения: 22.03.2010 21:45
mugil_cephalus
Цитата:

Цитата: и какое это имеет отношение к "%~dp0Docs\pngcrush.exe" ?

если "%~dp0Docs\pngcrush.exe" раскроется в c:\кириллица\Docs\pngcrush.exe и Текущая кодовая страница: 866
Автор: king_stiven
Дата сообщения: 22.03.2010 22:07
lorents
if not exist "Images\*.png" goto loop2


if not exist "Images\*.png" goto loop3
Автор: mugil_cephalus
Дата сообщения: 22.03.2010 22:28
wolf0425

Цитата:
она раскроется правильно - в соответствии с той кодовой страницей, которая будет выбрана на момент исполнения. Будет 866 - подставится c:\кириллица* в 866, будет 1261 - подставится c:\кириллица* в 1251, будет 20866 - подставится c:\кириллица* в кои-8. Во всех случаях имя будет соответствовать текущей кодировке и ошибки не будет.
Чем спорить - давно бы проверил, а не писал примеры где не cmd подставляет правильное имя, а ты напрямую прописываешь неправильное и пытаешься лечить то при подстановке правильного имени - работать перестанет... Или внимательно смотрел те скрины что я давал - там было что-то на тему %~dp0.

проверил через %~dp0 - да, ты прав
Автор: Punktir
Дата сообщения: 22.03.2010 22:31
Нужно все файлы с именем 123.txt во вложенных директориях заменить файлом c:\123.txt
Надеюсь, что батником возможно. Спасибо.
Автор: wolf0425
Дата сообщения: 22.03.2010 22:38
king_stiven
Цитата:
lorents
if not exist "Images\*.png" goto loop2
не стыкуется с заданием
Цитата:
если нет файлов png в папке Images или его подпапках
нужно ли именно такое задание - науке неизвестно, но зачем-то вписал же.

Автор: lorents
Дата сообщения: 22.03.2010 22:39
wolf0425

Цитата:
вместо строки с for вставь

Все работает, спасибо
А можно не много по другому, если нет файлов png, то просто не выводим запрос без перехода к loop2
А почему если в папке есть и файлы png и jpeg, то выводится запрос только по файлу png?
Просто у меня задача обработать, все файлы png и jpeg
Автор: wolf0425
Дата сообщения: 22.03.2010 22:45

Цитата:
А можно не много по другому, если нет файлов png, то просто не выводим запрос без перехода к loop2
впиши переход куда надо - какие проблемы то?


Цитата:
А почему если в папке есть и файлы png и jpeg, то выводится запрос только по файлу png?
потому что у тебя goto:eof стоит после обработки png.
И кстати метка :loop2 стоит после фор-проверки, а не перед.

и на втором выборе у тебя опять переход по меткам :1 :2 :3 - сработают те метки что в начале файла. Переименовывай.



Автор: lorents
Дата сообщения: 22.03.2010 22:50
wolf0425

Цитата:
потому что у тебя goto:eof стоит после обработки png.
И кстати метка :loop2 стоит после фор-проверки, а не перед.

Вы не могли бы показать это на моем примере, не сочтите за наглость, я честно уже не соображаю
[more]
Код: Rem 22/03/2010
@echo off

1>nul 2>nul dir /b /s /a-d Images\*.png || goto:loop2

:loop1
echo [1] PNG Interlace - Noninterlaced
echo [2] PNG Interlace - Adam7

set /p png="Choose a task by number: "

if not defined png goto:eof
if %png%==1 goto:1
if %png%==2 goto:2
if /i "_%png%" neq "_1" if /i "_%png%" neq "_2" goto:loop1
goto:eof

:1
echo 1
Rem Optimization PNG (Interlace - Noninterlaced)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
    call png.bat "%%~fi"
    "%~dp0Docs\advdef.exe" -z -4 "%%~fi"
    "%~dp0Docs\deflopt.exe" "%%~fi"
    "%~dp0Docs\pngcrush.exe" -rem alla -brute -reduce "%%~fi" "%%~dpni.tmp"
    move /y "%%~dpni.tmp" "%%~fi"
    "%~dp0Docs\advdef.exe" -z -4 "%%~fi"
    "%~dp0Docs\deflopt.exe" "%%~fi"
    "%~dp0Docs\optipng.exe" -zc1-9 -zm1-9 -zs0-3 -f0-5 "%%~fi"
    "%~dp0Docs\advdef.exe" -z -4 "%%~fi"
    "%~dp0Docs\deflopt.exe" "%%~fi"
    "%~dp0Docs\pngout.exe" "%%~fi"
    "%~dp0Docs\advdef.exe" -z -4 "%%~fi"
    "%~dp0Docs\deflopt.exe" "%%~fi"
)
goto:eof

:2
echo 2
Rem Optimization PNG (Interlace - Adam7)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
    "%~dp0Docs\optipng.exe" -i1 "%%~fi"
    "%~dp0Docs\pngcrush.exe" -rem alla -brute -reduce "%%~fi" "%%~dpni.tmp"
    move /y "%%~dpni.tmp" "%%~fi"
    "%~dp0Docs\advdef.exe" -z -4 "%%~fi"
    "%~dp0Docs\deflopt.exe" "%%~fi"
    "%~dp0Docs\optipng.exe" -zc1-9 -zm1-9 -zs0-3 -f0-5 "%%~fi"
    "%~dp0Docs\advdef.exe" -z -4 "%%~fi"
    "%~dp0Docs\deflopt.exe" "%%~fi"
)
goto:eof

:loop2
echo [1] JPEG - Optimize
echo [2] JPEG - Progressive
echo [3] JPEG - Progressive vs. Optimize

set /p jpeg="Choose a task by number: "

if not defined jpeg goto:eof
if %jpeg%==1 goto:1
if %jpeg%==2 goto:2
if %jpeg%==3 goto:3
if /i "_%jpeg%" neq "_1" if /i "_%jpeg%" neq "_2" if /i "_%jpeg%" neq "_3" goto:loop2
goto:eof

:1
echo 1
Rem Optimization JPEG (Optimize)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
    "%~dp0Docs\jpegtran.exe" -copy all -optimize "%%~fi" "%%~fi"
    "%~dp0Docs\jhead.exe" -dc -de -di -dx -du "%%~fi"
)
goto:eof

:2
echo 2
Rem Optimization JPEG (Progressive)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
    "%~dp0Docs\jpegtran.exe" -copy all -progressive "%%~fi" "%%~fi"
    "%~dp0Docs\jhead.exe" -dc -de -di -dx -du "%%~fi"
)
goto:eof

:3
echo 2
Rem Optimization JPEG (Progressive vs. Optimize)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
    "%~dp0Docs\jpegtran.exe" -copy all -progressive "%%~fi" "%%~dpni_pro.tmp"
    "%~dp0Docs\jpegtran.exe" -copy all -optimize "%%~fi" "%%~dpni_opt.tmp"
    call :compare "%%~dpni_pro.tmp" "%%~dpni_opt.tmp" "%%~fi" "%%~nxi"
    "%~dp0Docs\jhead.exe" -dc -de -di -dx -du "%%~fi"
)
goto :eof
:compare
if %~z1 LSS %~z2 (
    DEL /F /Q %2
    DEL /F /Q %3
    REN %1 %4
) else (
    DEL /F /Q %1
    DEL /F /Q %3
    REN %2 %4
)
goto:eof
Автор: king_stiven
Дата сообщения: 22.03.2010 23:04

Цитата:
если нет файлов png в папке Images или его подпапках

проглядел
Автор: wolf0425
Дата сообщения: 22.03.2010 23:51

Цитата:
Вы не могли бы показать это на моем примере

[more=как-то так, v2]
Код: Rem 22/03/2010
@echo off

1>nul 2>nul dir /b /s /a-d Images\*.png || goto:jpeg

:loop1
echo [1] PNG Interlace - Noninterlaced
echo [2] PNG Interlace - Adam7

set /p png="Choose a task by number: "

if not defined png goto:eof
if %png%==1 goto:Noninterlaced
if %png%==2 goto:Adam7
goto:loop1

:Noninterlaced
echo Noninterlaced
Rem Optimization PNG (Interlace - Noninterlaced)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
call png.bat "%%~fi"
"%~dp0Docs\advdef.exe" -z -4 "%%~fi"
"%~dp0Docs\deflopt.exe" "%%~fi"
"%~dp0Docs\pngcrush.exe" -rem alla -brute -reduce "%%~fi" "%%~dpni.tmp"
move /y "%%~dpni.tmp" "%%~fi"
"%~dp0Docs\advdef.exe" -z -4 "%%~fi"
"%~dp0Docs\deflopt.exe" "%%~fi"
"%~dp0Docs\optipng.exe" -zc1-9 -zm1-9 -zs0-3 -f0-5 "%%~fi"
"%~dp0Docs\advdef.exe" -z -4 "%%~fi"
"%~dp0Docs\deflopt.exe" "%%~fi"
"%~dp0Docs\pngout.exe" "%%~fi"
"%~dp0Docs\advdef.exe" -z -4 "%%~fi"
"%~dp0Docs\deflopt.exe" "%%~fi"
)
goto:jpeg

:Adam7
echo Adam7
Rem Optimization PNG (Interlace - Adam7)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
"%~dp0Docs\optipng.exe" -i1 "%%~fi"
"%~dp0Docs\pngcrush.exe" -rem alla -brute -reduce "%%~fi" "%%~dpni.tmp"
move /y "%%~dpni.tmp" "%%~fi"
"%~dp0Docs\advdef.exe" -z -4 "%%~fi"
"%~dp0Docs\deflopt.exe" "%%~fi"
"%~dp0Docs\optipng.exe" -zc1-9 -zm1-9 -zs0-3 -f0-5 "%%~fi"
"%~dp0Docs\advdef.exe" -z -4 "%%~fi"
"%~dp0Docs\deflopt.exe" "%%~fi"
)

:jpeg
1>nul 2>nul dir /b /s /a-d Images\*.jpg Images\*.jpeg || goto:eof

:loop2
echo [1] JPEG - Optimize
echo [2] JPEG - Progressive
echo [3] JPEG - Progressive vs. Optimize

set /p jpeg="Choose a task by number: "

if not defined jpeg goto:eof
if %jpeg%==1 goto:Optimize
if %jpeg%==2 goto:Progressive
if %jpeg%==3 goto:P_Optimize
goto:loop2

:Optimize
echo JPEG - Optimize
Rem Optimization JPEG (Optimize)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
"%~dp0Docs\jpegtran.exe" -copy all -optimize "%%~fi" "%%~fi"
"%~dp0Docs\jhead.exe" -dc -de -di -dx -du "%%~fi"
)
goto:eof

:Progressive
echo JPEG - Progressive
Rem Optimization JPEG (Progressive)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
"%~dp0Docs\jpegtran.exe" -copy all -progressive "%%~fi" "%%~fi"
"%~dp0Docs\jhead.exe" -dc -de -di -dx -du "%%~fi"
)
goto:eof

:P_Optimize
echo JPEG - Progressive vs. Optimize
Rem Optimization JPEG (Progressive vs. Optimize)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
"%~dp0Docs\jpegtran.exe" -copy all -progressive "%%~fi" "%%~dpni_pro.tmp"
"%~dp0Docs\jpegtran.exe" -copy all -optimize "%%~fi" "%%~dpni_opt.tmp"
call :compare "%%~dpni_pro.tmp" "%%~dpni_opt.tmp" "%%~fi" "%%~nxi"
"%~dp0Docs\jhead.exe" -dc -de -di -dx -du "%%~fi"
)
goto :eof

:compare
if %~z1 LSS %~z2 (
DEL /F /Q %2
DEL /F /Q %3
REN %1 %4
) else (
DEL /F /Q %1
DEL /F /Q %3
REN %2 %4
)
goto:eof
Автор: lorents
Дата сообщения: 23.03.2010 00:30
wolf0425
Спасибо большое!
Не знаю как Вас благодарить
А можно сделать, чтобы все запросы на ввод, выводились сразу а не по частям?
и можно сделать, если в папке Images или в подпапках нет файлов png и jpeg, выводилось сообщение что файлов нет, и батник закрывался
Еще раз спасибо
Автор: lorents
Дата сообщения: 23.03.2010 09:34
Объясните, пожалуйста, почему если я прописываю

Код: call png.bat "%%~fi"
Автор: wolf0425
Дата сообщения: 23.03.2010 10:16

Цитата:
call "%~dp0Docs\png.bat" "%%~fi"
то уже не работает?
так так прописываешь ты это где? в каком батнике?
где лежит этот батник и где лежит png.bat?
судя по тексту png.bat = он запускается когда текущий каталог тот же, где лежал "Web Image Optimizer.bat"
и судя по тому что без %~dp0Docs\ он запускается - то в одном каталоге с "Web Image Optimizer.bat" он и лежит, зачем ты командуешь искать другой батник, Docs\png.bat - не очень понятно.

в подобных случаях для локализации ошибки
заменяешь call "%~dp0Docs\png.bat" "%%~fi"
на echo call "%~dp0Docs\png.bat" "%%~fi"
(или просто добавляешь рядом)
и смотришь что печатает - проверяешь сформировался ли путь и параметры так, как тебе было нужно.
Автор: METAJIJI
Дата сообщения: 23.03.2010 11:39
Вот читаю я текстовый файлик

Код:
variable=123
строка 2

строка 3
строка4
Автор: wolf0425
Дата сообщения: 23.03.2010 12:37

Цитата:
FOR /F %%i IN ('type "file.ini"') DO ( ECHO %%i
А хочется видеть такой:
Подскажите что поменять\дополнить.

Код: for /f "tokens=1* delims=]" %%h in ('find /n /v "" ^< "file.ini"') do ( ECHO.%%i
Автор: Iacoyn
Дата сообщения: 23.03.2010 12:50
Народ, подскажите как из командной строки обновить systray - после выполнения taskkill там висят иконки выгружененых принудительно программ - если над ними провести мышкой - они исчезают.
Автор: murzik
Дата сообщения: 23.03.2010 13:38
Бат файл запускается с CD-ROM.
Как определить букву устройства этого CD-ROM'а ?
Автор: king_stiven
Дата сообщения: 23.03.2010 13:44
murzik
echo %~d0
Автор: murzik
Дата сообщения: 23.03.2010 16:00
king_stiven

Цитата:
echo %~d0

спасибо - это то, что мне и требовалось.
Автор: lorents
Дата сообщения: 23.03.2010 21:14
wolf0425
А нельзя ли объединить оба батника в один, т.е. таким образом проблема отпадет сама собой?
Автор: mugil_cephalus
Дата сообщения: 23.03.2010 21:29
Iacoyn

Цитата:
Народ, подскажите как из командной строки обновить systray - после выполнения taskkill там висят иконки выгружененых принудительно программ - если над ними провести мышкой - они исчезают.


Код: taskkill /f /im explorer.exe && start explorer.exe
Автор: wolf0425
Дата сообщения: 24.03.2010 10:56

Цитата:
А нельзя ли объединить оба батника в один, т.е. таким образом проблема отпадет сама собой?
так объедини, если раздельно они не нужны. дописываешь

Код: goto :eof
:png
rem текст батника png

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

Предыдущая тема: XP не видит второй раздел на съемном USB-HDD


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.