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

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

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

vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:54 27-04-2007 | Исправлено: Elroir, 03:59 10-09-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    presston
    Если сетевое имя прокси-сервера известно, тогда можно воспользоваться следующей конструкцией:

    Код:
     
    @echo off
    for /F "usebackq tokens=5 delims=[] " %%I IN (`"tracert SERVERNAME | find "Tracing""`) DO call :setproxy %%I
    goto :EOF
     
    :setproxy
    echo %1
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d 00000001 /f > nul
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyServer" /d  %1:8080 /f > nul
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyOverride" /d "<local>" /f > nul
    reg add "HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current\Software\Microsoft\windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d 00000001 /f > nul
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d 00000001 /f > nul
     
     
    SERVERNAME - надо заменить на имя прокси-сервера
    Если порт прокси не 8080, в коде надо заменить на правильный.
    Код написан для английской Windows. Если вывод команды tracert на русском - надо первой строчкой написать "chcp 1251>nul", а вместо "Tracing"  написать "Трассировка".

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 18:17 08-06-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    день добрый
     
    можно ли такое сделать:
     
    нужно запомнить имена файлов в папке
    далее отработает прога которая создаст файл в этой папке
    после нужно обнаружить имя это нового файла и завести в переменную
    чтобы далее указать на него в ссылке
     
    типа \\comp\dir\%newfile%
     
    спасибо

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 18:33 08-06-2007
    presston



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

    Цитата:
    presston  
    Если сетевое имя прокси-сервера известно, тогда можно воспользоваться следующей конструкцией:  
     
    Код:  
    @echo off  
    for /F "usebackq tokens=5 delims=[] " %%I IN (`"tracert SERVERNAME | find "Tracing""`) DO call :setproxy %%I  
    goto :EOF  
     
    :setproxy  
    echo %1  
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d 00000001 /f > nul  
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyServer" /d  %1:8080 /f > nul  
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyOverride" /d "<local>" /f > nul  
    reg add "HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current\Software\Microsoft\windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d 00000001 /f > nul  
    reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d 00000001 /f > nul  
     
     
     
    SERVERNAME - надо заменить на имя прокси-сервера  
    Если порт прокси не 8080, в коде надо заменить на правильный.  
    Код написан для английской Windows. Если вывод команды tracert на русском - надо первой строчкой написать "chcp 1251>nul", а вместо "Tracing"  написать "Трассировка".

     
    сетевое имя и ип адрес - все известно. а зачем мы делаем трасировку? прокси и клиенты в одной сети
     

    Всего записей: 9 | Зарегистр. 13-05-2007 | Отправлено: 18:44 08-06-2007
    Elroir



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

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

    Насколько я понимаю - ip прокси-сервера меняется, а имя нет. Поэтому и делается трассировка по имени, чтобы найти изменившийся ip. То есть на каждой машине надо запустить этот батник и он сам все сделает. Если надо - можно изменить батник так, чтобы он получал новый адрес прокси аргументом командной строки.

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 18:57 08-06-2007
    presston



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

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

     
    пасиба. будем пробовать

    Всего записей: 9 | Зарегистр. 13-05-2007 | Отправлено: 19:06 08-06-2007
    Elroir



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

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

    Что-то вроде такого:

    Код:
     
    @echo off
    setlocal
    for /f "tokens=*" %%a in ('dir /b /a-d /od /tc') do set "old_last=%%a"
    ::Running the program that creates new file
    ::====================================
    echo 1>new_file2.txt
    ::====================================
    for /f "tokens=*" %%a in ('dir /b /a-d /od /tc') do set "new_last=%%a"
    if "%old_last%"=="%new_last%" (
    set "new_last="
    echo New file not found
    ) else (echo %new_last%)
     


    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 19:26 08-06-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JohnRD
    Цитата:
    далее отработает прога которая создаст файл в этой папке
    после нужно обнаружить имя это нового файла и завести в переменную  

    если прога обязательно создаст новый файл, то запоминать ничего ненадо - надо просто взять самый новый файл в папке после запуска проги.
    т.е. см. первый for /f  от предшественника.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 22:26 08-06-2007
    Elroir



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

    Цитата:
    если прога обязательно создаст новый файл

    Tак именно поэтому я и делал два for-a - для проверки создания файла.

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 22:35 08-06-2007
    mitrichbel

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    http://forum.ru-board.com/topic.cgi?forum=62&topic=10650&start=720#12
    это ответ на http://forum.ru-board.com/topic.cgi?forum=62&topic=10650&start=660#21
    что скажешь?

    Всего записей: 1380 | Зарегистр. 30-04-2003 | Отправлено: 22:53 08-06-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mitrichbel
    Так сложно что-либо понять. Попробуй следующий код:

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    echo.
    for /r %%a in (*.txt) do call :check %%~na
    echo after first for
    echo sext=!sext!
    for %%a in (!sext!) do (
    echo Files grouped by "%%a" ending:
    dir /s /b "* %%a.txt"
    echo.
    )
    goto :EOF
     
    :check
    ::maybe we found last two part of filename
    echo trying %*
    if "%3"=="" (
      ::if it realy consists of two parts  
      if not "%2"=="" (
        set "test2=no"  
        set "test=%2"
        ::if second part is not zero
        if not !test!==0 ( set /a "test1=!test!-1"
          ::if the result is -1 - it's not a number
          if not !test1!==-1 (set "test2=yes")
        ) else (
        ::if the second part is zero - OK, it's a number
        set "test2=yes")
        ::if we found number
        if !test2!==yes (
         ::check whether it is already in the list
         echo %fext% | find " %2 ">nul
         ::if not - add it to the list
         if not !errorlevel!==0 (set "fext=!fext! %2 ") else (
           echo %sext% | find " %2 ">nul
           if not !errorlevel!==0 (set "sext=!sext! %2 ")
         )
        )
      )
    ) else (
    ::the filename has more then 2 parts - shift it by 1 position to the left
    shift
    ::try again
    goto check
    )
     

    В процессе работы будут выводится обрабатываемые строки. После того, как "проявится" ошибка, скопируй несколько (10-15) последних строк и выложи здесь.
    P.S. У меня все работает отлично, правда файлов достаточно мало.

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 23:12 08-06-2007
    mitrichbel

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    в консоли бегут строчки с "trying имя файла без расширения", некоторые из них повторяются, хотя присутствуют в единственном экземпляре (проверил)

    Всего записей: 1380 | Зарегистр. 30-04-2003 | Отправлено: 08:45 09-06-2007
    pom205

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Нужен специалист! Кто набил руку, пожалуйста на секунду зайдите на этот топик Ссылка
     и сделайте обнулятор с опциональным запрашиваемым переменным ключом реестра а то что-же ребята мучаются. Там делов Вам - на минуту.  
    Там уже всё расписано в шапке на полтопика, надо только автоматизировать.

    Всего записей: 555 | Зарегистр. 03-06-2006 | Отправлено: 11:07 09-06-2007 | Исправлено: pom205, 11:12 09-06-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
     
    @echo off  
    setlocal  
    for /f "tokens=*" %%a in ('dir /b /a-d /od /tc') do set "old_last=%%a"  
    ::Running the program that creates new file  
    ::====================================  
    echo 1>new_file2.txt  
    ::====================================  
    for /f "tokens=*" %%a in ('dir /b /a-d /od /tc') do set "new_last=%%a"  
    if "%old_last%"=="%new_last%" (  
    set "new_last="  
    echo New file not found  
    ) else (echo %new_last%)
     
    почему то не находит новых файлов
    и где можно вписать путь который надо проверять, если запускать не из той папки
    запускать cmd из с:\1\1.cmd , а проверять папку d:\2\  
    сейчас я запускал прямо из той папки..
    спасибо

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 13:21 09-06-2007 | Исправлено: JohnRD, 13:22 09-06-2007
    wolf0425



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

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

    в хвост команд dir
    Цитата:
    почему то не находит новых файлов  
    файлы точно создаются новые (/tc), а не переписываются поверх (модифицируются) старые?
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 13:41 09-06-2007 | Исправлено: wolf0425, 13:42 09-06-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    прога настроена так что  
    ей создаются новые файлы
    Capture-001.avi
    Capture-002.avi
    Capture-003.avi
    ....
    с новыми датами
    мне надо последний созданный
     
    вот когда добавил путь после dir
    начал находить
     
    вот что пишет
    C:\smtp>2.cmd
    File Not Found        что это за файл он не находит?
    Capture-019.avi
     
    а так все ок  
     
     

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 14:24 09-06-2007 | Исправлено: JohnRD, 14:33 09-06-2007
    Maza Faka



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

    Код:
     
    @echo off
     
    :begin
    set /p "var=Enter generated key "
    if not defined var echo ERROR & goto :begin
    reg add "HKCU\Software\aignes\wswatch" /t REG_SZ /v Flags /d "" /f
    reg add "HKU\S-1-5-21-1482476501-329068152-682003330-1003\Software\aignes\wswatch" /t REG_SZ /v Flags /d "" /f
    reg add "HKCR\CLSID\{%var%}" /t REG_SZ /ve /f
    reg add "HKLM\SOFTWARE\Classes\CLSID\{%var%}" /t REG_SZ /ve /f
     
    del /q /f "C:\Program Files\WebSite-Watcher\wswatch.cfg"
     
    start "" "C:\Program Files\WebSite-Watcher\program.exe"
     

    пути поменяешь на свои.

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 14:40 09-06-2007
    Elroir



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

    Цитата:
    File Not Found   что это за файл он не находит?

    Это dir выводит. В каждом for-e, в конце команды dir, после указания директории, добавь 2^>nul. То есть полная команда должна выглядить так:
    'dir /b /a-d /od /tc d:\2\ 2^>nul'
     
    Добавлено:
    mitrichbel

    Цитата:
    в консоли бегут строчки с "trying имя файла без расширения", некоторые из них повторяются, хотя присутствуют в единственном экземпляре (проверил)

    Они и должны повторяться - программа проверяет имена. Я просил список последних строчек, чтобы воспроизвести ошибку. Так что список в студию

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 15:07 09-06-2007 | Исправлено: Elroir, 15:14 09-06-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JohnRD
    Цитата:
    File Not Found        что это за файл он не находит?  

    ты уверен, что это батник не находит файл, а не запускаемая из него твоя программа?
    отключение echo закомментируй пока да посмотри...

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 15:11 09-06-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir  wolf0425
     
    C:\smtp>setlocal
    C:\smtp>for /F "tokens=*" %a in ('dir /b /a-d /od /tc e:\video\ 2>nul') do set "
    old_last=%a"
    C:\smtp>set "old_last=Capture-001.avi"
    C:\smtp>set "old_last=Capture-002.avi"
    ..
    C:\smtp>set "old_last=Capture-021.avi"
    C:\smtp>echo   1>new_file2.txt
    C:\smtp>for /F "tokens=*" %a in ('dir /b /a-d /od /tc e:\video\ 2>nul') do set "
    new_last=%a"
    C:\smtp>set "new_last=Capture-001.avi"
    C:\smtp>set "new_last=Capture-002.avi"
    ..
    C:\smtp>set "new_last=Capture-021.avi"
    C:\smtp>if "Capture-021.avi" == "Capture-021.avi" (
    set "new_last="
     echo New file not found
    )  else (echo Capture-021.avi )
    New file not found
    C:\smtp>

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 16:49 09-06-2007 | Исправлено: JohnRD, 16:50 09-06-2007
    Elroir



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

    Код:
     
    @echo off  
    setlocal  
    for /f "tokens=*" %%a in ('dir /b /a-d /od /tc e:\video\ 2^>nul') do set "old_last=%%a"
     

    Это первая часть. Здесь мы находим последний созданный файл в директории e:\video до начала работы твоей программы.

    Код:
    ::Running the program that creates new file  
    ::====================================  
    echo 1>new_file2.txt  
    ::====================================
     
    Здесь, вместо "echo 1>new_file2.txt" нужно вписать команду запуска программы, которая создает новые файлы. Может быть надо воспользоваться конструкцией start /wait "" program.exe param1 param2 ...

    Код:
    for /f "tokens=*" %%a in ('dir /b /a-d /od /tc e:\video\ 2^>nul') do set "new_last=%%a"  
    if "%old_last%"=="%new_last%" (  
    set "new_last="  
    echo New file not found  
    ) else (echo %new_last%)

    Эта часть кода выполняется (должна выполняться) после завершения работы программы.
     


    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 17:09 09-06-2007 | Исправлено: Elroir, 17:10 09-06-2007
       

    Страницы: 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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 3
    vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru