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

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

Автор: res2001
Дата сообщения: 28.06.2010 11:05
lorents

Цитата:
не выходит, это сообщение просто является в запущенном батнике

Наверное в конце команды нет оператора перенаправления >>%logfile%

Добавлено:
извини, забыл экранировать символ процента. Вот так правильно:

echo File name;Original Size;Output Size;Change in Bytes;%% of Original >>%logfile%
Автор: lorents
Дата сообщения: 28.06.2010 11:30
res2001
получилось, но одна проблема, теперь это строка появляется в отчете каждый раз, как только запускается batch, как сделать чтобы эта строка была только в первой строчке?
Думаю можно сделать так, если отчет уже создан, то ничего не надо писать, а если его нет, то создать отчет, и вписать в первую строчку

Код: echo File name;Original Size;Output Size;Change in Bytes;%% of Original >>%logfile%
Автор: res2001
Дата сообщения: 28.06.2010 11:35
lorents

Цитата:
Думаю можно сделать так, если отчет уже создан, то ничего не надо писать, а если его нет, то создать отчет, и вписать в первую строчку


Код: if not exist %logfile% echo File name;Original Size;Output Size;Change in Bytes;%% of Original >>%logfile%
Автор: wolf0425
Дата сообщения: 28.06.2010 11:44

Цитата:
извини, забыл экранировать символ процента. Вот так правильно:
echo File name;Original Size;Output Size;Change in Bytes;%% of Original >>%logfile%
учишь вас, учишь, а привычки вписывать перенаправление в начало команды, а не в хвост - привить так и не удается.
хороший пример разницы.
Автор: lorents
Дата сообщения: 28.06.2010 11:45
res2001
получилось, спасибо.
Вроде все остальное работает как надо :applause:

Добавлено:
wolf0425
может ты посмотришь, если есть время и желание, весь batch и скажешь свои замечания и предложения?

[more=ImageOptimizer.bat]
Код: @echo off
1>nul chcp 1251
TITLE ImageOptimizer 1.1.0.0 от 01.07.2010

echo Image Optimizer - сборник программ для оптимизации/сжатии картинок формата PNG и JPEG без потери качества, состоящий из следующих программ:
echo * AdvPng (входит в состав AdvanceComp 1.15 от 01.11.2005);
echo * DeflOpt 2.07 от 05.09.2007;
echo * Jhead 2.90 от 05.02.2010;
echo * Jpegtran (входит в состав Libjpeg 8b от 16.05.2010);
echo * OptiPng 0.6.4 от 15.03.2010;
echo * PngOut от 09.06.2010;
echo * PrePng от 17.05.10;
echo * Zlib 1.2.5 от 19.04.2010.

echo.
echo Авторы (lorents и res2001) не несут ответственность за работу данного приложения.
echo Вы используете данное приложение под свой страх и риск.

if not exist "%~dp0Docs\advpng.exe" set "nofile=AdvPng "
if not exist "%~dp0Docs\deflopt.exe" set "nofile=%nofile%DeflOpt "
if not exist "%~dp0Docs\jhead.exe" set "nofile=%nofile%Jhead "
if not exist "%~dp0Docs\jpegtran.exe" set "nofile=%nofile%Jpegtran "
if not exist "%~dp0Docs\optipng.exe" set "nofile=%nofile%OptiPng "
if not exist "%~dp0Docs\pngout.exe" set "nofile=%nofile%PngOut "
if not exist "%~dp0Docs\prepng.exe" set "nofile=%nofile%PrePng "
if not exist "%~dp0Docs\zlib.dll" set "nofile=%nofile%Zlib"
if defined nofile (
echo.
echo Приложение не смогло получить доступ к следующим файлам: %nofile%
echo Нажмите на Enter для выхода из приложения.
pause>nul
goto:eof
)

echo.
echo Скопируйте необходимые картинки или папки с картинками в папку "Images" и нажмите на Enter для продолжения.

pause>nul

setlocal ENABLEDELAYEDEXPANSION
set logfile=Images.csv
if not exist %logfile% echo File name;Original Size;Output Size;Change in Bytes;%% of Original>>%logfile%

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

:loop1
echo.
set png=
echo Параметр оптимизации PNG - Interlace:
echo [1] Noninterlaced;
echo [2] Adam7 (Interlaced).
echo Если Вы не хотите оптимизировать картинки формата PNG, то, не вводя параметр оптимизации, нажмите на Enter.
set /p png="Укажите параметр оптимизации PNG и нажмите на Enter: "
if defined png if "%png%" neq "1" if "%png%" neq "2" (
echo.
echo Вы указали неправильное значение параметра оптимизации/сжатии картинок. & goto:loop1
)
if not defined png set png=100

:jpeg
1>nul 2>nul dir /b /s /a-d Images\*.jpg Images\*.jpeg && goto:loop2
if defined png goto :pngwork
echo.
echo Картинки формата PNG и JPEG в папке "Images" не обнаружены.
echo Нажмите на Enter для выхода из приложения.
pause>nul
goto:eof

:loop2
echo.
set jpeg=
echo Параметр оптимизации JPEG - Encoding Process:
echo [1] Optimize;
echo [2] Progressive;
echo [3] Progressive vs. Optimize (сравниваются по размеру картинки, полученные обоими методами сжатия, и выбирается файл с наименьшим размером).
echo Внимание. При Progressive'ом методе сжатие оригинальное и полученное картинки попиксельно будут отличаться, но на глаз определить не возможно.
echo Если Вы не хотите оптимизировать картинки формата JPEG, то, не вводя параметр оптимизации, нажмите на Enter.
set /p jpeg="Укажите параметр оптимизации JPEG и нажмите на Enter: "
if defined jpeg if "%jpeg%" neq "1" if "%jpeg%" neq "2" if "%jpeg%" neq "3" (
echo.
echo Вы указали неправильное значение параметра оптимизации/сжатии картинок. & goto:loop2
)

:pngwork
if not defined png goto :jpegwork
if %png%==1 goto:Noninterlaced
if %png%==2 goto:Adam7
goto:jpegwork

:Noninterlaced
echo Noninterlaced
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
    set origsize=%%~zi
    "%~dp0Docs\prepng.exe" "%%~fi"
    call :pngopt "%%~fi"
    "%~dp0Docs\advpng.exe" -z -4 "%%~fi"
    "%~dp0Docs\deflopt.exe" "%%~fi"
    call :savelog "%%i" !origsize!
)
goto :jpegwork

:pngopt
"%~dp0Docs\optipng.exe" -i0 -zw32k -zc1-9 -zm1-9 -zs0-3 -f0-5 -full -force %1 > %temp%\png.log
for /f "delims==,IDAT tokens=5" %%i in (%temp%\png.log) do (
    set f=%%i
)
set f=%f:~1,1%
del %temp%\png.log
"%~dp0Docs\pngout.exe" /k0 /n2 /f%f% %1
exit /b

:Adam7
echo Adam7
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.png') do (
    set origsize=%%~zi
    "%~dp0Docs\prepng.exe" "%%~fi"
    "%~dp0Docs\optipng.exe" -i1 -zw32k -zc1-9 -zm1-9 -zs0-3 -f0-5 "%%~fi"
    "%~dp0Docs\advpng.exe" -z -4 "%%~fi"
    "%~dp0Docs\deflopt.exe" "%%~fi"
    call :savelog "%%i" !origsize!
)

:jpegwork
if not defined jpeg goto:eof
if %jpeg%==1 goto:Optimize
if %jpeg%==2 goto:Progressive
if %jpeg%==3 goto:Progressive_Optimize
goto:eof

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

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

:Progressive_Optimize
echo JPEG - Progressive vs. Optimize
for /f "delims=" %%i in ('dir /b /s /a-d Images\*.jpg Images\*.jpeg') do (
    set origsize=%%~zi
    "%~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"
    call :savelog "%%i" !origsize!
)
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
)
exit /b

:savelog
set /a "change=%~z1-%2"
set /a "perc=%~z1*100/%2"
echo %~nx1;%2;%~z1;%change%;%perc%>>%logfile%
exit /b
Автор: boy999
Дата сообщения: 28.06.2010 12:09
Set WSHShell = WScript.CreateObject("WScript.Shell")
CurDir = WSHShell.CurrentDirectory
WSHShell.Run CurDir & "\\mpr\\MPR.exe /export", 0


Это скрипт всем хорош, даже работает, но нуно, чтобы он запускал mbr в скрытом окне!
Очень нуно!

Можно ли научить его запускаться в скрытом режиме!?
Автор: res2001
Дата сообщения: 28.06.2010 12:10
wolf0425

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

В чем цимес перенаправления в начале команды?
У меня уже многолетняя привычка в конец вставлять, легко не отделаться

Добавлено:
разницу в примере я уловил, но ведь все равно не так как хотелось.
Автор: mugil_cephalus
Дата сообщения: 28.06.2010 12:22
BVV63

Цитата:
Приветствую. Вопрос, наверное, глупый, но всё равно. Никто не слахал об каком-либо отладчике для "батаники"? Любительского изготовления, понятно... А то, бывает, строишь конструкции из 3-х - 4-х уровней по паре страниц текста, нифига не работает, а ты по-полчаса нич-чо понять не можешь. Понемногу упрощаешь конструкцию, ищешь ошибку, но на это уж больно много времени уходит.

echoon.exe
закоментируй @echo off и смотри сверху вниз какую строку скрипт не так, как тебе нужно отрабатывает
Автор: res2001
Дата сообщения: 28.06.2010 12:25
boy999

Цитата:
WSHShell.Run CurDir & "\\mpr\\MPR.exe /export", 0

по моему последний 0 и отвечает за создание скрытого окна.
http://msdn.microsoft.com/en-us/library/d5fk67ky%28VS.85%29.aspx
У меня скрипт отрабатывает правильно, окно не появляется. Правда я не на MPR эксперементировал.

Добавлено:
mugil_cephalus
будет ведь искать
Цитата:
echoon.exe

Автор: BVV63
Дата сообщения: 28.06.2010 12:43
mugil_cephalus

Цитата:
закоментируй @echo off и смотри сверху вниз какую строку скрипт не так, как тебе нужно отрабатывает

Безусловно я так и делаю. Но в for... in... do... это мало помогает, особенно если их несколько вложенных. Кроме того, в некоторых случаях сообщение об ошибке вылазит совсем не там, где она находится (что меня поначалу удивляло, потом привык). А так по мелочам лоханёшься, скобку там забудешь или ещё чего, и сидишь, недоумеваешь, почему не работает.

Добавлено:
Да, ещё. Никто не подскажет, как в разименованной переменной использовать знак процента? В некоторых случаях из реестра достаётся, скажем, имя файла, в котором переменная %SystemRoot%, и ничего не работает. Приходится лезть в реестр, заменять переменную, что весьма геморно.
Автор: mugil_cephalus
Дата сообщения: 28.06.2010 12:54
BVV63

Цитата:
Но в for... in... do...

а ты следи за отработкой цикла на предмет соответствия кода и stdout и stderr по-строчно

Цитата:
А так по мелочам лоханёшься, скобку там забудешь или ещё чего,

посчитай в пределах одного цикла for или ветвления if все открытые скобки и закрытые ( ну не 100 же их )
может тебе будет полезна подсветка синтаксиса - http://forum.ru-board.com/topic.cgi?forum=5&topic=24956&start=0
Автор: wolf0425
Дата сообщения: 28.06.2010 12:56
res2001

Цитата:
В чем цимес перенаправления в начале команды?
У меня уже многолетняя привычка в конец вставлять, легко не отделаться
Добавлено:
разницу в примере я уловил, но ведь все равно не так как хотелось.

цимес в том, что при вставлении в начало получается конструкция, которую гораздо легче контролировать на ошибки - автоматом закрываются кавычки, %, левый пробел в конце строки не добавляется, нет шанса что при окончании строки на переменную при исполнении неожиданно получишь откусывание 1 или перенаправление не того потока.
привычка в конец вставлять - она понятна, но она заметно порочна и при написании длинных батников со сложными строками печати дает не экономию а геморрой.
Автор: BVV63
Дата сообщения: 28.06.2010 13:05
mugil_cephalus

Цитата:
может тебе будет полезна подсветка синтаксиса

Спасибо, у меня есть.

Цитата:
посчитай в пределах одного цикла for или ветвления if все открытые скобки и закрытые ( ну не 100 же их )

Ну скобки я так, для примера привёл. Сосчитать их, особенно используя поиск, действительно несложно.

Цитата:
а ты следи за отработкой цикла на предмет соответствия кода и stdout и stderr по-строчно

Хм... Наверное, это действительно было бы полезно, но честно говоря, никогда этим не занимался. А можно в двух словах - как это?
Автор: res2001
Дата сообщения: 28.06.2010 13:09
wolf0425
Понял. Начну переучиваться

Добавлено:
BVV63

Цитата:
Да, ещё. Никто не подскажет, как в разименованной переменной использовать знак процента? В некоторых случаях из реестра достаётся, скажем, имя файла, в котором переменная %SystemRoot%, и ничего не работает. Приходится лезть в реестр, заменять переменную, что весьма геморно.

команда call два раза разъименовывает переменные.

Код: @echo off
set tt=%%systemroot%%
echo %tt%
call echo %tt%
Автор: mugil_cephalus
Дата сообщения: 28.06.2010 13:15
BVV63

Цитата:
Хм... Наверное, это действительно было бы полезно, но честно говоря, никогда этим не занимался. А можно в двух словах - как это?

ну когда ты составлял код , ты же предполагал какого результата ждешь от строки N и если echo on включено то смотри то ли, что задумывалось выдается на каждой строке ; если там какая переменная , то втавь echo._%var%_ потом закоментируешь, если все правильно отрабатывается ; или echo._%%~i_ ; я такое сразу пишу в коде, а потом если все ок - удаляю или rem
Автор: BVV63
Дата сообщения: 28.06.2010 13:20
res2001
OK, попробую.
mugil_cephalus
Хорошо, попробую завтра написать для себя батник, аргументом которого был бы исследуемый батник, и он бы его пошагово (построчно) выполнял (посредством Pause).
Автор: mugil_cephalus
Дата сообщения: 28.06.2010 13:23
BVV63

Цитата:
(посредством Pause).

толку от паузы - ноль

Код: mode con lines=6000
Автор: boy999
Дата сообщения: 28.06.2010 13:25
res2001

Цитата:
У меня скрипт отрабатывает правильно, окно не появляется. Правда я не на MPR эксперементировал.



Разрабы встроили защиту от скрытого процесса, сцуко.
Её-то и надо преодолеть.

Ммм!?
Автор: mugil_cephalus
Дата сообщения: 28.06.2010 13:43
BVV63

запускаешь батник из консоли , а не мышью ( чтоб он не пропал ) ;
Код: rem @echo off
Автор: res2001
Дата сообщения: 28.06.2010 13:56
boy999
ну если сам процесс себя отображаемым делает, то извне ты вряд ли что-то сможешь предпринять. К тому же батниками.
Тут либо хакнуть программулину, чтоб она себя не отображала, либо перехватчик API делать. Оба варианта не из этой ветки.
Автор: mugil_cephalus
Дата сообщения: 28.06.2010 14:05
boy999
скачай http://www.ntwind.com/software/utilities/hstart.html
hstart.exe положи в корень и вот код батника autorun.inf , в котором пропиши запуск батника vbs.bat , который запустит твой vbscript
[autorun]
open=hstart /NOCONSOLE \vbs.bat

vbs.bat ( положи тоже в корень )

Код: cscript //nologo \1.vbs
Автор: us0r
Дата сообщения: 28.06.2010 15:56
jek1976
Ну замонтировать сетевые диски и с них копировать профили- тоже можно...
Потом размонтировал и фсё- никто ничего не видит)))
Интересует?
Автор: gredmy
Дата сообщения: 28.06.2010 16:46
Доброго дня всем!
Может тут помогут! Интересует батник для переключения профилей электропитания, туда и обратно, стоб повесить на кнопку. Один раз нажал-Сбалансированый или Высокая производительность, второй раз- Экономия энергии. Заранее спасибо
Автор: bugsbot
Дата сообщения: 28.06.2010 17:17
Вопрос более простой. Как в батнике перед тем как разархивировать архив проверять его на битость. То есть если битый ничего не делать (ну или писать в лог что битый), если целый то выполнять. Архивы могут быть или zip или rar. Заранее спасибо!
Автор: jek1976
Дата сообщения: 28.06.2010 19:03

Цитата:
Ну замонтировать сетевые диски и с них копировать профили- тоже можно...

Не подходит, т.к. компы и так медленные, а тут еще профили по сетке туда-сюда гонять.


Цитата:
Интересует?

Интересует только тот способ, когда скриптом (или батником) при начальной загрузке на локальной машине будут удаляться все те профили, которые уже были синхронизированы. Это наиболее рационально!
Автор: res2001
Дата сообщения: 28.06.2010 19:49
gredmy
смотри powercfg /?

Добавлено:
bugsbot

Цитата:
опрос более простой. Как в батнике перед тем как разархивировать архив проверять его на битость. То есть если битый ничего не делать (ну или писать в лог что битый), если целый то выполнять. Архивы могут быть или zip или rar. Заранее спасибо!

С rar примерно так можно:

Код: 1>ok.log 2>err.log rar.exe t file.rar
for %%f in (err.log) do if %%~zf neq 0 echo Ошибка архива
Автор: Altus
Дата сообщения: 28.06.2010 21:05
сам себя цитирую. хосподиисусе

Цитата:
Как получить дату-время в заданном формате, НО в 7 досе от 98 венды? В переменную конечно же, и без использования временных файлов.
В переменной должно оказаться что то вроде: 201006280005
У меня все идеи кончились.

Упрощаем задачу, допустим получил я на консоль или в файл "дату_время". Как её направить в переменную? For - там кастрированный.
Да даже если, всё равно команда set в 7 досе умеет только устанавливать переменную и добавлять к переменной. А нужно заменить и удалить лишнее.

Гугл тыкал, в клаву дул, монитор протирал.
Автор: ur5tdk
Дата сообщения: 28.06.2010 22:24
Народ, подскажите фрагмент батника, чтобы проверялась системная дата и если нужная дата настала - выполнялись определенные действия, спасибо!!!
Автор: BVV63
Дата сообщения: 29.06.2010 05:25
res2001

Цитата:
команда call два раза разъименовывает переменные.

Всё же так и не понял, как Call использовать для разъименования. Можно пример?
Попробовал переменную вдвойне разъименовать дважды окружив её знаками восклицания . Увы, безрезультатно...

Добавлено:
mugil_cephalus
Занятный батник, но я не понял, какой смысл из него должен извлечь.

Добавлено:
ur5tdk
Ну, к примеру, можно использовать системную переменную "Date":
If %Date% == dd.MM.yy (
...
)
где dd.MM.yy - нужная дата. Недостаток: зависит от формата "КОРОТКОЙ" даты на компе (вернее, у текущего юзера), где исполняется. Можно усложнить, устранив этот недостаток (не помню, кто у нас на форуме впервые для этого посоветовал использовать WMIC):

Код: For /F "Skip=1 Tokens=* UseBackQ" %%A In (
    `%SystemRoot%\System32\WBEM\WMIC.Exe /Node:LocalHost OS Get LocalDateTime`
    ) Do (
    Set LocalDateTime=%%A
    GoTo :0
    )
:0
Set CurrentDate=%LocalDateTime:~2,2%.%LocalDateTime:~4,2%.%LocalDateTime:~6,2%
If CurrentDate == yy.MM.dd (
...
)
Автор: res2001
Дата сообщения: 29.06.2010 07:39
BVV63

Цитата:
Всё же так и не понял, как Call использовать для разъименования. Можно пример?
Попробовал переменную вдвойне разъименовать дважды окружив её знаками восклицания . Увы, безрезультатно...

Вот так можешь использовать, через двойное присваивание:

Код: @echo off
set tt=%%systemroot%%
echo %tt%
call set tt1=%tt%
echo %tt1%

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

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


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