Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 8

Модерирует : KLASS, IFkO

vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

   

vu1tur



Moderator-Saaber
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Задачи на bat-файлах 8
(часть 1, часть 2, часть 3, часть 4, часть 5, часть 6, часть 7)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<<>>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки
 
Полезные утилиты
 
Готовые решения и частые вопросы:
  • Встроенный справочник по командам
  • Создание помощи по всем командам консоли 2000 и XP
  • Делаем паузу в командном файле стандартными средствами Windows
  • Альтернативные решения »
  • Работа с текстом, датой, и файлами »
  • Администрирование, автоматизация и сеть »
  • Работа с переменными и параметрами ком. строки »
     
    Описания работы команд и символов участниками темы:
    · setlocal enabledelayedexpansion и переменные окружения
    · символы & и && в командной строке
    · Переменная %0

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 12:40 25-01-2010 | Исправлено: bomzzz, 13:37 20-08-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    архивироваться содержимое одной папки, но не саму папку (с максимальной степенью сжатия)  
    zip -j -9 archive.zip t:\papka\*

    Цитата:
    и так же распаковать в определенную папку все содержимое zip-архива  

    unzip archive.zip -d z:\papka2\
     
    а теперь рассказывай - какой из вышенаписанных ключей ты не нашел во встроенном хэлпе.
     
     
    Добавлено:

    Цитата:
    Необходимо скопировать все файлы по списка, из одного каталога, содержащего эти файлы, в другой с сохранением структуры каталогов.  
    например так

    Код:
    @echo off
     
    for /f "tokens=1*" %%a in (1212) do call :copy "%%b"
    exit
     
    :copy
    set "file=%~1"
    set "file=%file:~1%"
    echo f | xcopy /y "src\%file%" "dest\%file%"
     

     
     
     
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 16:46 06-03-2010 | Исправлено: wolf0425, 17:05 06-03-2010
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425

    Цитата:
    unzip archive.zip -d z:\papka2\

    Большое спасибо
     
    Объясните пожалуйста, что значат выделенные строки
    Подробнее...

    Всего записей: 3299 | Зарегистр. 30-12-2007 | Отправлено: 20:14 06-03-2010 | Исправлено: lorents, 23:22 06-03-2010
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    У меня есть один код

    Код:
    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"
    )

    и вот проблема в программе pngcrush

    Код:
    pngcrush -rem alla -brute -reduce src.png dest.png

    src.png — исходное изображение, dest.png — результирующее изображение, должны иметь разные названия
    И вот мне надо сделать выше представленном коде следующее:
    При запуске pngcrush исходное изображение было бы "%%~fi", а результирующее изображение - название исходного изображения, но расширение было бы tmp, и чтобы находился в той же папке, что и "%%~fi", и после того как pngcrush заканчивает работу, удаляется исходное изображение, а у результирующего изображения расширение переименовывается в png
     
    И еще одна просьба, надо сравнить размер двух файлов получаемых при запуске jpegtran при разных параметрах

    Код:
    jpegtran -copy none -progressive "%%~fi" "%%~fi"


    Код:
    jpegtran -copy none -optimize "%%~fi" "%%~fi"

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

    Всего записей: 3299 | Зарегистр. 30-12-2007 | Отправлено: 23:17 06-03-2010 | Исправлено: lorents, 23:48 06-03-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Объясните пожалуйста, что значат выделенные строки  
    все же старайся не лениться читать хэлп сам - половину ответов ты мог сам найти.
    Цитата:
    @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  
    от метки и дальше - печать сообщений, которые должен выдавать батник если обнаружил ошибку во входных параметрах или в процессе выполнения.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 01:41 07-03-2010 | Исправлено: wolf0425, 08:16 07-03-2010
    Dimca

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

    Всего записей: 27 | Зарегистр. 09-12-2002 | Отправлено: 18:22 07-03-2010 | Исправлено: Dimca, 18:26 07-03-2010
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Спасибо, что объяснили
    Не могли бы Вы помочь мне с предыдущими двумя вопросами, просто очень надо

    Всего записей: 3299 | Зарегистр. 30-12-2007 | Отправлено: 18:27 07-03-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    При запуске 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"
    )
    кривоватенько, но сойдет.
    кривизна в том, что move сначала переносит на место более длинный, потом поверх более короткий файл, а выносить цикл в call - будет громоздко.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 21:15 07-03-2010
    Dimca

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

     
     
    Хотелось бы через батник реализовать нажатие кнопок ALT+F4.
    Так почемуто не работает:
     
    Set WshShell = WScript.CreateObject("WScript.Shell")
    If WshShell.AppActivate("DVBViewer") Then
      WshShell.SendKeys "%{F4}"
    End If

    Всего записей: 27 | Зарегистр. 09-12-2002 | Отправлено: 21:35 07-03-2010 | Исправлено: Dimca, 21:55 07-03-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Dimca пробуй так:

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

    Кстати, а имя окна у программы DVBViewer - точно DVBViewer, имя файла и прочее там не затесались?

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 22:54 07-03-2010 | Исправлено: wolf0425, 22:56 07-03-2010
    Dimca

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я пробую уже на Exel, все равно не получается. Я думаю батник закрывает активное приложение и в момент активации его, получается что он сам себе ALT+F4 делает. Или я не прав?
     

    Всего записей: 27 | Зарегистр. 09-12-2002 | Отправлено: 23:06 07-03-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

    Код:
      if WshShell.AppActivate("Microsoft Excel") then
        wScript.sleep 250
        WshShell.SendKeys "%{F4}"
        wScript.sleep 250
      end if

    эксель захлопнулся

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 23:13 07-03-2010 | Исправлено: wolf0425, 23:20 07-03-2010
    Dimca

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ниче не понимаю, у меня не закрывает

    Всего записей: 27 | Зарегистр. 09-12-2002 | Отправлено: 23:27 07-03-2010
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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"

    Всего записей: 3299 | Зарегистр. 30-12-2007 | Отправлено: 23:38 07-03-2010
    Dimca

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    пробую VBScript-ом, не могу прописать чтоб закрывал определенную прогу:
     
    set osh = wscript.CreateObject("wscript.Shell")    
    osh.Sendkeys "%{F4}"  
     
    а как дальше не знаю, поможеш?

    Всего записей: 27 | Зарегистр. 09-12-2002 | Отправлено: 23:48 07-03-2010 | Исправлено: Dimca, 23:50 07-03-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 06:40 08-03-2010 | Исправлено: wolf0425, 06:44 08-03-2010
    Dimca

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
     
     
    Заработало!
     
    set osh = wscript.CreateObject("wscript.Shell")
    osh.AppActivate("Microsoft Excel")  
    osh.Sendkeys "%{F4}"
     
    Спасибо за помощь.
     
    П.С. Еще вопрос, как прописать правильно чтоб закрывалось любое активное приложение?

    Всего записей: 27 | Зарегистр. 09-12-2002 | Отправлено: 08:31 08-03-2010 | Исправлено: Dimca, 08:36 08-03-2010
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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")

    Можно ли сделать без поиска, мы же знаем как называются файлы, т.е. хочу делать именно сравнение двух файлов по размеру, тот кто меньше переименовывается в исходное название, а тот кто больше удаляется?

    Всего записей: 3299 | Зарегистр. 30-12-2007 | Отправлено: 10:31 08-03-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Можно ли сделать без поиска
    можно, тогда придется самому вычислять и запоминать размеры в переменных, делать сравнение, бороться с неизменностью %переменных% в теле 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

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 12:22 08-03-2010 | Исправлено: wolf0425, 12:40 08-03-2010
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

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

    вроде как все работает
    Большое спасибо!)

    Всего записей: 3299 | Зарегистр. 30-12-2007 | Отправлено: 12:38 08-03-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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
    )

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 12:55 08-03-2010
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 8
    vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru