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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    king_stiven

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

    Код:
    @echo off
    mode con codepage select=1251 > nul
    set dir1=%~dp0
    set dir2=C:\temp
    :begin
    set /a sum+=1
    if /i "%~d0\" neq "%cd%" (
        cd ..
        goto begin
    )
    pause
    setlocal enabledelayedexpansion
    set blok=!sum!
    setlocal DISABLEDELAYEDEXPANSION
    for /f "usebackq tokens=*" %%d in (`dir "%dir1%" /o /b /s /a:-d`) do (
        for /f "tokens=%blok%* delims=\" %%e in ("%%d") do if exist "%dir2%\%%f" del "%dir2%\%%f" /q
    )

     
     
    ::Вот пример удаления пустых папок на диске D:\
    @echo off
    FOR /R D:\ %%e IN (.) DO (
        set "papka=%%e"
        call :qwe
    )
    pause
    goto :EOF
    :qwe
    for /f "tokens=*" %%d in ('dir %papka% /b /s /a:-d') do goto ert
    rd /s /q "%papka%"
    :ert

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 13:45 25-01-2010
    vini00008

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Проблема с созданием задания в schtasks.
    Создание ручками в win7 задания, не принесло никакого результата. Создание задания через консоль точно так же не получилось, перекопал всё что можно, но правильно варианта так и не нашел.
     
    Необходимо, что бы задание запускалось после простоя компьютера, с определенным интервалом (пример 1-3 мин.) и после того как пользователь начинал работать - принудительно выгружалось, как только опять простой опять загружалось и как пользователь начинал работать - опять принудительно выгружалось и т.д.  
    Что бы у задания не было ограничений по длительности выполнения, запуск локальный (не по сети удаленно).
    Так же что бы был вариант запуска как программы и как сервиса.
    И будет ли разница если задание запускается на WinXP или Win7?
    Помогите плиззз.

    Всего записей: 3 | Зарегистр. 25-01-2010 | Отправлено: 14:41 25-01-2010 | Исправлено: vini00008, 14:50 25-01-2010
    pottapchik

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте, люди!
    Помогите, пожалуйста. Можно ли средствами командной строки проверить, запущена ли определённая программа или нет и если нет, то запустиь её?
    И правильно я понимаю, чтобы этот процесс повторялся, нужно просто этот батник добавить в планировщик заданий.
    Могли бы вы написать такой bat?
    Если важно - то стоит Windows 7, права локального админа.
    Заранее благодарю.
     
    Добавлено:

    Код:
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery _
        ("Select * from Win32_Process Where Name = 'TeamViewer.exe'")
    If colProcesses.Count = 0 Then
    Set WshShell = WScript.CreateObject("WScript.Shell")
        WshShell.Run "C:\Program Files (x86)\TeamViewer\Version5\TeamViewer.exe", 1
    End If  

    Мне вот тут так посоветовали, но не пашет

    Всего записей: 29 | Зарегистр. 27-01-2008 | Отправлено: 17:20 25-01-2010
    wolf0425



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

    Цитата:
    Помогите, пожалуйста. Можно ли средствами командной строки проверить, запущена ли определённая программа или нет и если нет, то запустиь её?  

    легко, например:
    Код:
    tasklist | find /i "RedVex32.exe" || start "" /ABOVENORMAL RedVex32.exe -hide -run


    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 18:34 25-01-2010
    pottapchik

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

    Код:
    tasklist | find /i "TeamViewer.exe" || start "" /ABOVENORMAL TeamViewer.exe*32 -hide -run

    На это ругается, говорит не может найти такой процесс
    Может здесь лучше путь написать к проге?
     
    Добавлено:

    Код:
    tasklist | find /i "TeamViewer.exe" || start "" /ABOVENORMAL "C:\Program Files (x86)\TeamViewer\Version5\TeamViewer.exe" -hide -run

    На это написал, unknown option -u
     
    Добавлено:

    Код:
    tasklist | find /i "TeamViewer.exe" || start "" /ABOVENORMAL TeamViewer.exe*32 -hide -run  

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

    Код:
    tasklist | find /i "TeamViewer.exe" || start "" /ABOVENORMAL "C:\Program Files (x86)\TeamViewer\Version5\TeamViewer.exe"
     
     
    А чтобы он каждый час выполнялся, его в Планировщик заданий забить?

    Всего записей: 29 | Зарегистр. 27-01-2008 | Отправлено: 18:40 25-01-2010
    wolf0425



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

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

    Цитата:
    На это написал, unknown option -u  
    ты вообще очень смело скопировал из примера и ключи для стартующей программы. я вот не уверен, что у TeamViewer.exe есть ключи -hide -run, тем более не знаю что бы они могли у нее делать - в отличие от redvex
    /ABOVENORMAL кстати тоже наверняка лишний - зависит от того что ты хочешь.
    Это вообще-то ключ для start чтобы поднял приоритет процессора для запускаемой программы выше стандартного.
     
    Добавлено:

    Цитата:
    А чтобы он каждый час выполнялся, его в Планировщик заданий забить?
    ну да...

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 20:24 25-01-2010 | Исправлено: wolf0425, 20:34 25-01-2010
    Kirillhome



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

    Цитата:
    задача:
    запускается батник в каталоге \dir1\
    нужно по списку лежащих там файлов/подкаталогов удалить аналогичные файлы в \dir2\  
    после операции удалить образовавшиеся (если такое случится) пустые директории в \dir2\
     
    Есть чего-нибудь готовое на эту тему?
     
    второй вариант задачи - удалять только те файлы, которые полностью совпадают.  

    А что называется аналогичные? Просто по названию, или совпадающие?
    В общем - выбирай
     

    Код:
     
    @setlocal enabledelayedexpansion  
    @echo off
    rem F_Dir - первый каталог
    set F_Dir=D:\Temp\Files\
    rem S_Dir - здесь ищем копию
    set S_Dir=D:\Tmp\Files\
     
    rem вычислим длину первого каталога  
    set /A len_f_dir=40
    :_vyasn_dl_f_d
    set /A len_f_dir=%len_f_dir%-1
    set new_str=!F_Dir:~0,%len_f_dir%!
    if /i %new_str%==%F_Dir% goto :_vyasn_dl_f_d
    set /A len_f_dir=%len_f_dir%+1
     
    cd %F_Dir%
    for %%f in (*.*) do (
         if exist %S_dir%\%%f echo Exist %S_dir%%%f
    rem если проверять на совпадение, то
    rem fc %%f %S_dir%\%%f >nul 2>nul&&echo Double %F_Dir%%%f and %S_dir%%%f
         )
     
    for /r %%d in (.) do (
        cd %%d
        for %%f in (*.*) do (
        set new_d=%%~dpf
        set pat_d_d=!new_d:~0,%len_f_dir%!
        set pat_d_p=!new_d:~%len_f_dir%!
        if exist %S_dir%\!pat_d_p!%%f echo Exist %S_dir%!pat_d_p!%%f
    rem если проверять на совпадение, то
    rem fc %%f %S_dir%!pat_d_p!%%f >nul 2>nul&&echo Double !new_dr!%%f and %S_dir%%%f
         )
    )
     

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 00:30 26-01-2010
    Nomolos



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Здравствуйте!
    Задача следующая
    В конкркетном каталоге ищется последний созданый по времени файл
    Затем в файле делается замена некоторых строк, предопределеных заранее при запуске bat ничка
    т.е. сейчас это выглядит так

    Код:
     
    c:\scripts\gsar.exe -s#Q1#G -r#Q"+КолВО+"#G -o v:\WINDOWS\System32\spool\PRINTERS\*.spl
     

    Причем код запускаеся из 1с, и параметр КолВО берется тоже из 1с
    хотелось бы увидеть решение такого вида или пните пожалуйста в правильном направлении
    запуск из 1с предприятие 7.7
    print.bat kolichestvo

    Код:
     
    ищем последний созданый по времени файл по пути v:\WINDOWS\System32\spool\PRINTERS\
    запускаем программу замены
    c:\scripts\gsar.exe -s#Q1#G -r#Q"+kolichestvo+"#G -o v:\WINDOWS\System32\spool\PRINTERS\Последний созданый фалй.spl
     

    Всего записей: 69 | Зарегистр. 21-11-2006 | Отправлено: 07:46 26-01-2010 | Исправлено: Nomolos, 07:52 26-01-2010
    wolf0425



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

    Цитата:
    В конкркетном каталоге ищется последний созданый по времени файл  
    надеюсь ты точно хочешь созданный последним, а не модифицированный последним

    Код:
    for /f "delims=" %%a in ('dir /b /o-d /t:c v:\WINDOWS\System32\spool\PRINTERS\*.spl ') do set "file=v:\WINDOWS\System32\spool\PRINTERS\%%~a" & goto :found
    :found


    Цитата:
    или пните пожалуйста в правильном направлении  
    наверно так?
    Код:
    c:\scripts\gsar.exe -s#Q1#G -r#Q"+%1+"#G -o "%file%"

     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 10:10 26-01-2010 | Исправлено: wolf0425, 10:13 26-01-2010
    Kirillhome



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Nomolos
    А в чём задача? Запустить из 1С? Тогда - смотри в сторону 1с.
    Или понять, какой файл - самый последний?
    Ну, к примеру - так

    Код:
     
    @setlocal enabledelayedexpansion  
    @echo off
    set L_File=""
    for /F %%i in ('dir /B /a:-d /O:-D') do call :_L_file "%%i"
    echo L_File = %L_File%
    goto :EOF
     
    :_L_file
    if %L_file%=="" (
       set L_file=%1
       )
    goto :EOF
     

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 10:12 26-01-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven чего-то никак не получается адаптировать твой код для ситуации, когда dir1 - сетевой. т.е. \\comp\share1\dir1\

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 10:32 26-01-2010 | Исправлено: wolf0425, 10:32 26-01-2010
    Nomolos



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425, Kirillhome
    Огромное спасибо!
    Все отлично работает. Думаю нужно добавать в шапку.
    Маленькое только уточнение, можно ли как то искать по определеному расширению, конкретно spl?

    Всего записей: 69 | Зарегистр. 21-11-2006 | Отправлено: 10:48 26-01-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    С сетью не работаю, смысл моего батника отрубить от полного пути каждого файла лежащего в c:\temp\dir1 и его подкаталогах - c:\temp\dir1 , с помощью нахождения количества \ (плюс 1) в пути к дир1 таким образом:
     
    :begin  
    set /a sum+=1  
    if /i "%~d0\" neq "%cd%" (  
        cd ..  
        goto begin  
    )  
     
     
    В твоём случае посчитай \ как нибудь по другому
     
    1вар
    Цитата: подсчитать на сколько каталогов ты дапеко от корня  
     
    Код:  
    @echo off  
    set count=0  
    set "myPath=C:\split\fgh\fgjkl\"  
     
    :begin  
    for /f "tokens=1* delims=\" %%a in ('echo %myPath%') do (  
    set myPath=%%b  
    set var=%%a  
    if defined myPath (  
    set /a count+=1  
    goto begin)  
    )  
     
    echo Stek = %count%  
     
    2вар
    Код:  
    for %%i in ( ) do (  
    for %%e in ( ) do (  
    set "counter=-1"  
    set "p=E:\split\&!<>fgh\fgjkl\"  
    call :count  
    echo %counter%  
    ..  
    ))  
    goto :EOF  
     
    :count  
    if "%p%"=="" goto :EOF  
    if "%p:~0,1%"=="\" set /a "counter+=1"  
    set "p=%p:~1%"  
    goto count  
     
     
    Проверяемый путь должен заканчиваться символом "\".  
     
     
    Да и по gsar он как, меняет строки в html документах с кракозябрами? Что нибудь по русски бы почитать, а то с sed никак не разберусь.  

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 11:17 26-01-2010 | Исправлено: king_stiven, 11:33 26-01-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Nomolos
    Цитата:
    Маленькое только уточнение, можно ли как то искать по определеному расширению, конкретно spl?
    да вроде же вписано сейчас с расширением.
     
     
     
    Добавлено:

    Цитата:
    Да и по gsar он как, меняет строки в html документах с кракозябрами? Что нибудь по русски бы почитать, а то с sed никак не разберусь.  
    да, вполне меняет - ему кракозябры по барабану.
    Но я обычно предпочитаю через sed  
    А хорошей доки нет - сам бы хотел.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 12:37 26-01-2010 | Исправлено: wolf0425, 12:38 26-01-2010
    king_stiven

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

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 12:46 26-01-2010 | Исправлено: king_stiven, 12:47 26-01-2010
    wolf0425



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

    Цитата:
    В твоём случае посчитай \ как нибудь по другому  
    да там не в счетчике проблема оказалась, а в том что for /f "tokens=%blok%* delims=\" %%e in ("%%d")  по разному считал слеши для сетевых имен и локальных. и не так как от" %%d"
    я просто сидел и офигевал от непонимания - чего глючит. сейчас чего-то придумаю, наверно.
     
    наверно вот так:
     
    Добавлено:

    Цитата:
    Да и по gsar он как, меняет строки в html документах с кракозябрами?
    вспомнил за что я не люблю gsar применительно к html :
    у него : - служебный символ.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 13:10 26-01-2010 | Исправлено: wolf0425, 13:32 26-01-2010
    maa78s

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет.
    Подскажите, пожалуйста, как должна быть правильно написана команда копирования файла из одной дирректории в другую с возможностью дописывания совпадающих файлов.
    Сейчас, при копировании файлы в любом случае заменяются:
    FOR /f "tokens=*" %%a IN ('dir /b /a-d') DO (copy "%%~fa" "%TempDir%\")
     
    Заранее спасибо.

    Всего записей: 17 | Зарегистр. 10-07-2009 | Отправлено: 18:14 26-01-2010
    king_stiven

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

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

    Докачки что ли?

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 19:01 26-01-2010
    Kirillhome



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

    Цитата:
    с возможностью дописывания совпадающих файлов.
    Сейчас, при копировании файлы в любом случае заменяются:
    FOR /f "tokens=*" %%a IN ('dir /b /a-d') DO (copy "%%~fa" "%TempDir%\")  

    Т.е. если в выходном (%TempDir%\) этот файл уже есть - то дописать в конец существующего? Есть так, то тогда, похоже, вот:

    Код:
     
    FOR /f "tokens=*" %%a IN ('dir /b /a-d') DO (
        if exist "%TempDir%\%%~fa" (
         copy /B "%TempDir%\%%~fa"+"%%~fa" "%TempDir%\"
       ) else (
        copy "%%~fa" "%TempDir%\"
        )
    )
     

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 19:40 26-01-2010 | Исправлено: Kirillhome, 19:42 26-01-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