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

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

Автор: lorents
Дата сообщения: 06.03.2010 22:17
У меня есть один код

Код: chcp 1251
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
Rem    pngcrush -rem alla -brute -reduce src.png dest.png
    optipng.exe -o7 "%%~fi"
    advdef.exe -z -4 "%%~fi"
    deflopt.exe "%%~fi"
    pngout.exe "%%~fi"
    advdef.exe -z -4 "%%~fi"
    deflopt.exe "%%~fi"
)
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
Rem    jpegtran -copy none -progressive "%%~fi" "%%~fi"
Rem    jpegtran -copy none -optimize "%%~fi" "%%~fi"
    jhead -purejpg "%%~fi"
)
Автор: wolf0425
Дата сообщения: 07.03.2010 00:41

Цитата:
Объясните пожалуйста, что значат выделенные строки
все же старайся не лениться читать хэлп сам - половину ответов ты мог сам найти.
Цитата:
@ECHO OFF
отключить эховывод

Цитата:
if a%1==a goto help
if b%2==b goto help
проверка наличия переданных команднику параметров, если даже первого нет - отправляем читать хэлп. Потом - второго.
Вообще говоря первая проверка - лишняя в таком раскладе, если второго параметра нет - то первого нет с гарантией.

Цитата:
%kBinary% %kRecursive% %kVerbose% %kBlockSplit% %TEMP%\%1k *.*
if not errorlevel 0 goto kzipError
это ошибка, пример того как писать не надо.
правильный вариант проверки - if errorlevel 1 goto kzipError
(или if not .%errorlevel% equ .0 goto kzipError - но это имеет ограничения)

назначение команды - переход на метку если программа из переменных вернула код ошибки больше 0 (исходный вариант - переход если вернула отрицательный код, чего у kzip.exe не бывает).
Аналогично - в следующих двух случаях.

Цитата:
:kzipError
от метки и дальше - печать сообщений, которые должен выдавать батник если обнаружил ошибку во входных параметрах или в процессе выполнения.
Автор: Dimca
Дата сообщения: 07.03.2010 17:22
Что прописать в батнике чтоб выключить прогу? В виндовс ХР. Например прога C:\Programme\DVBViewer\DVBViewer.exe
Автор: lorents
Дата сообщения: 07.03.2010 17:27
wolf0425
Спасибо, что объяснили
Не могли бы Вы помочь мне с предыдущими двумя вопросами, просто очень надо
Автор: wolf0425
Дата сообщения: 07.03.2010 20:15

Цитата:
При запуске pngcrush исходное изображение было бы "%%~fi", а результирующее изображение - название исходного изображения, но расширение было бы tmp, и чтобы находился в той же папке, что и "%%~fi",
прочитать for /? самостоятельно - совсем никак?
pngcrush -rem alla -brute -reduce "%%~fi" "%%~dpni.tmp"
move /y "%%~dpni.tmp" "%%~fi"

Цитата:
и чей размер файла меньше тот остается, другой удаляется
второй параметр "%%~fi" - результирующее изображение
как-то так:

Код: for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
    jpegtran -copy none -progressive "%%~fi" "%tmp%\_select_p.jpg"
    jpegtran -copy none -optimize "%%~fi" "%tmp%\_select_o.jpg"
    for "delims=" %%a in ('dir /b /a-d /o-s "%tmp%\_select_?.jpg"') do move /y "%tmp%\%%~a" "%%~fi"
    jhead -purejpg "%%~fi"
)
Автор: Dimca
Дата сообщения: 07.03.2010 20:35

Цитата:
Что прописать в батнике чтоб выключить прогу? В виндовс ХР. Например прога C:\Programme\DVBViewer\DVBViewer.exe



Хотелось бы через батник реализовать нажатие кнопок ALT+F4.
Так почемуто не работает:

Set WshShell = WScript.CreateObject("WScript.Shell")
If WshShell.AppActivate("DVBViewer") Then
WshShell.SendKeys "%{F4}"
End If
Автор: wolf0425
Дата сообщения: 07.03.2010 21:54
Dimca пробуй так:

Цитата:
Set WshShell = WScript.CreateObject("WScript.Shell")
If WshShell.AppActivate("DVBViewer") Then
WScript.Sleep 200
WshShell.SendKeys "%{F4}"
End If

Кстати, а имя окна у программы DVBViewer - точно DVBViewer, имя файла и прочее там не затесались?
Автор: Dimca
Дата сообщения: 07.03.2010 22:06
Я пробую уже на Exel, все равно не получается. Я думаю батник закрывает активное приложение и в момент активации его, получается что он сам себе ALT+F4 делает. Или я не прав?

Автор: wolf0425
Дата сообщения: 07.03.2010 22:13

Цитата:
Я пробую уже на Exel, все равно не получается.
калькулятор попробуй

свой пример я выдрал из реального цикла, которым закрывал нужные окна копий программы

Цитата:
Я думаю батник закрывает активное приложение и в момент активации его, получается что он сам себе ALT+F4 делает.
А батнику то что? его смд исполняет, ему на альтф4 - наплевать, и фокус на себя батник переключать не умеет. Ну и между батником и строками на бейсике - прокладка же, наверно?


Код: if WshShell.AppActivate("Microsoft Excel") then
wScript.sleep 250
WshShell.SendKeys "%{F4}"
wScript.sleep 250
end if
Автор: Dimca
Дата сообщения: 07.03.2010 22:27
Ниче не понимаю, у меня не закрывает
Автор: lorents
Дата сообщения: 07.03.2010 22:38
wolf0425

Цитата:
pngcrush -rem alla -brute -reduce "%%~fi" "%%~dpni.tmp"
move /y "%%~dpni.tmp" "%%~fi"

Большое спасибо, все прекрасно работает

Цитата:
кривоватенько, но сойдет.
кривизна в том, что move сначала переносит на место более длинный, потом поверх более короткий файл, а выносить цикл в call - будет громоздко.

у меня не работает, проблема в

Код: for "delims=" %%a in ('dir /b /a-d /o-s "%tmp%\_select_?.jpg"') do move /y "%tmp%\%%~a" "%%~fi"
Автор: Dimca
Дата сообщения: 07.03.2010 22:48
wolf0425
пробую VBScript-ом, не могу прописать чтоб закрывал определенную прогу:

set osh = wscript.CreateObject("wscript.Shell")
osh.Sendkeys "%{F4}"

а как дальше не знаю, поможеш?
Автор: wolf0425
Дата сообщения: 08.03.2010 05:40

Цитата:
у меня не работает, проблема в
Код:
for "delims=" %%a in
a, действительно, /f потеряно.
for /f "delims=" %%a ...


Добавлено:

Цитата:
не могу прописать чтоб закрывал определенную прогу:
переключение проги куда отправится кнопка - это в твоем случае osh.AppActivate("microsoft e") перед Sendkeys
разбирайся почему у тебя не переключает фокус.
Автор: Dimca
Дата сообщения: 08.03.2010 07:31
wolf0425


Заработало!

set osh = wscript.CreateObject("wscript.Shell")
osh.AppActivate("Microsoft Excel")
osh.Sendkeys "%{F4}"

Спасибо за помощь.

П.С. Еще вопрос, как прописать правильно чтоб закрывалось любое активное приложение?
Автор: lorents
Дата сообщения: 08.03.2010 09:31
wolf0425

Цитата:
a, действительно, /f потеряно.
for /f "delims=" %%a ...

Спасибо большое, работает

Добавлено:
wolf0425
А можно в этом коде кое-что изменить

Код: for /f "delims=" %%a in ('dir /b /a-d /o-s "%tmp%\_select_?.jpg"') do move /y "%tmp%\%%~a" "%%~fi")
Автор: wolf0425
Дата сообщения: 08.03.2010 11:22

Цитата:
Можно ли сделать без поиска
можно, тогда придется самому вычислять и запоминать размеры в переменных, делать сравнение, бороться с неизменностью %переменных% в теле for. получится сильно длиннее. Нафига оно тебе?
Если боишься что лишний файл с такой маской найдется в твоем юзеровском темп.мусоре - то можно какое-нибудь одноразовое место организовать, но это же параноя.

хотя есть идея как сократить. сейчас попробую...

Добавлено:
проверяй
Код: @echo off
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
jpegtran -copy none -progressive "%%~fi" "%tmp%\_select_p.jpg"
jpegtran -copy none -optimize "%%~fi" "%tmp%\_select_o.jpg"
call :compare "%tmp%\_select_p.jpg" "%tmp%\_select_o.jpg" "%%~fi"
jhead -purejpg "%%~fi"
)
exit

:compare
if %~z1 leq %~z2 ( copy %1 %3 & echo progressive ) else (copy %2 %3 & echo optimize )
del %1
del %2
exit /b
Автор: lorents
Дата сообщения: 08.03.2010 11:38

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

вот я как раз этого и боюсь

Цитата:
проверяй

вроде как все работает
Большое спасибо!)
Автор: king_stiven
Дата сообщения: 08.03.2010 11:55
lorents

Код: for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
jpegtran -copy none -progressive "%%~fi" "%%~dpi_select_ZZZZZZZZ1.jpg"
jpegtran -copy none -optimize "%%~fi" "%%~dpi_select_ZZZZZZZZ2.jpg"
call :compare "%%~dpi_select_ZZZZZZZZ1.jpg" "%%~dpi_select_ZZZZZZZZ2.jpg" "%%~fi" "%%~nxi"
jhead -purejpg "%%~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
)
Автор: lorents
Дата сообщения: 08.03.2010 12:04
king_stiven
а чем ваш код отличается от wolf0425
я имею ввиду вот в этой части

Код: 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
)
Автор: king_stiven
Дата сообщения: 08.03.2010 12:17
lorents
Имеет смысл если папка Images и %tmp% находятся на разных дисках. То есть меньше головки юзаться будут у жесткача, меньше записывания стирания если файлов много.
Автор: lorents
Дата сообщения: 08.03.2010 12:31
king_stiven

Цитата:
Имеет смысл если папка Images и %tmp% находятся на разных дисках. То есть меньше головки юзаться будут у жесткача, меньше записывания стирания если файлов много.

понятно, я уже сделал так что все файлы будут находится в папке Images

Код: for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
    jpegtran -copy none -progressive "%%~fi" "%%~dpni_pro.tmp"
    jpegtran -copy none -optimize "%%~fi" "%%~dpni_opt.tmp"
    call :compare "%%~dpni_pro.tmp" "%%~dpni_opt.tmp" "%%~fi"
    jhead -purejpg "%%~fi"
)
exit
:compare
if %~z1 leq %~z2 (copy %1 %3 & echo progressive) else (copy %2 %3 & echo optimize)
del %1
del %2
exit /b
Автор: king_stiven
Дата сообщения: 08.03.2010 12:58
lorents

Цитата:
Надеюсь я все правильно сделал

нет, впрчем если тебя не смущают лишние переписывания, то оставь. А полностью мой вариант в части:

Цитата:
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
)

религия не позволяет использовать?
Автор: lorents
Дата сообщения: 08.03.2010 13:08
king_stiven

Цитата:
нет, впрчем если тебя не смущают лишние переписывания, то оставь. А полностью мой вариант в части:

я не совсем вас понял, что Вы хотели сказать?
Автор: king_stiven
Дата сообщения: 08.03.2010 13:24

Цитата:
я не совсем вас понял, что Вы хотели сказать?


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

в твоём варианте

Цитата:
:compare
if %~z1 leq %~z2 (copy %1 %3 & echo progressive) else (copy %2 %3 & echo optimize)
del %1
del %2
exit /b

как раз идут лишние переписывания.
Автор: lorents
Дата сообщения: 08.03.2010 13:44
king_stiven
ааа, понятно, спасибо
Автор: pandomnik
Дата сообщения: 08.03.2010 18:47
подскажите пожалуйста как будет выглядеть код батника для подключения и отключения сетевых ресурсов?
заранее всем премного благодарен)
Автор: wolf0425
Дата сообщения: 08.03.2010 20:38
pandomnik куришь net use /?
и сам пишешь.
Автор: IndianaJonESS
Дата сообщения: 08.03.2010 21:25
немного не в тему: но срочно
копирую пакетный файл с ПК ВистыПремиум на ПК с WinXP и при копировании он меняет атрибуты: вместо "Пакетный файл Windows" становится "MS-DOS" из-за этого не запускается прога (К+ ломаный);
точнее: копирую пакетный файл на флэшку и он сохраняет свои атрибуты, а когда я флэшку вставляю в ПК с WinXP , то на этой же флэшке атрибуты:вместо "Пакетный файл Windows" становится "MS-DOS" из-за этого не запускается прога (К+ ломаный);
как быть? просто не знаю, может кто подскажет и не ругайте ))
Автор: wolf0425
Дата сообщения: 08.03.2010 21:36

Цитата:
он меняет атрибуты: вместо "Пакетный файл Windows" становится "MS-DOS"

для тебя является новостью, что аттрибутов "Пакетный файл Windows" и "MS-DOS" - в файловой системе не существует?


Цитата:
из-за этого не запускается прога (К+ ломаный);

у проги может быть тысяча причин запускаться на одном компьютере и не запускаться на другом, но буковки которыми эксплорер обзывает файлы с расширением .bat - не влияют совершенно ни на что.
Автор: IndianaJonESS
Дата сообщения: 08.03.2010 21:47
других причин не запуститься я не вижу ))
на висте он запускается в режиме совместимости с WinXP SP2, а на ХР в режиме совместимости с Win95 ну и с теми атрибутами о которых выше писал; когда запускаю на ХР, то на мгновение появляется черное окно ДОС со строкой запуска (быстр , не успеваю прочесть, но вроде ...)и вроде сообщением, что файл "не тот", ну не тот формат или не поддерживается...как то так; что скажешь?
пс: думаю, что если поправить атрибуты, то запустится!
>>для тебя является новостью, что аттрибутов "Пакетный файл Windows" и "MS-DOS" - в файловой системе не существует?
да, это не атрибуты, но в Свойствах так отображается! то есть по разному в висте и хр

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

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


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