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

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

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

vu1tur (26-05-2009 11:39): часть 7 — http://forum.ru-board.com/topic.cgi?forum=62&topic=17154#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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





    http://forum.ru-board.com/topic.cgi?forum=62&topic=17154

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 23:07 04-11-2008 | Исправлено: vu1tur, 11:38 26-05-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    K_AHTOH, какие-то разброд и шатания у тебя в батнике
    ECHO %date:~-10% %time:~,5% %1 >> %LOGFILE%  
    имяфайла - третий столбец, разделение столбцов - пробелами
     
    for /F "tokens=1 delims=;" %%d in ('findstr /L /I /C:"%1" %logfile%')  DO  (echo %%~ti | findstr /v %date% 1>nul && call :wrk %1)  
    %%i - шестой столбец лога (при первом %%d), разделитель столбцов - ";" (идейно более правильный, чем пробел, но несовпадающий с форматом echo)
     
    в строке перед SET "SEEKIN потерян && перед goto. Кривой копипасте?
    ну и хотя в данном случае некритично, но перед меткой :wrk не помешала бы строка goto :eof
     
    в :chk parser.exe надо вызвать только когда %1 не сегодняшний и его нет в %logfile% ?
    наворочено то... заменяешь свою :chk на то что ниже, саб :wrk выкидываешь, проверяешь.
     
    :chk
    set "data1=%~t1"
    if "%data1:~0,10%"=="%data%" goto :eof
    findstr /L /I /C:"%~1" %logfile% >nul && goto :eof  
    ECHO FOUND NEW FILE %1
    D:\parser.exe -tfsfile "%~1" -outdir !Outputdir!
    if errorlevel 0 ECHO %date:~-10% %time:~,5% %1 >> %LOGFILE%
    goto :eof
     
    Кстати, а то что в лог никак не заносятся те файлы, на которых парсер был запущен и вернул ошибку - так и надо?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 10:09 27-02-2009 | Исправлено: wolf0425, 10:33 27-02-2009
    K_AHTOH



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

    Цитата:
    в строке перед SET "SEEKIN потерян && перед goto. Кривой копипасте?

    Нет. Работает без него. (

    Цитата:
    в :chk parser.exe надо вызвать только когда %1 не сегодняшний и его нет в %logfile% ?  

    Да именно так.

    Цитата:
    Кстати, а то что в лог никак не заносятся те файлы, на которых парсер был запущен и вернул ошибку - так и надо?

    Он не возвращает ошибки к сожалению. Точнее всегда "0"
     
    вот как отработало все
     

    Код:
    C:\log\>if errorlevel 0 ECHO 27.02.2009 10:30 L:\comlog_26_02_200
    9.tfs  1>>logfil.txt
     
    C:\log\>goto :eof
     
    C:\log\>call :chk L:\comlog_27_02_2009.tfs
     
    C:\log\ "data1=27.02.2009 10:23"
     
    C:\log\>if "27.02.2009" == "" goto :eof
     
    C:\log\>findstr /L /I /C:"L:\comlog_27_02_2009.tfs" logfil.txt
    1>nul  && goto :eof
     
    C:\log\>ECHO FOUND NEW FILE L:\comlog_27_02_2009.tfs
    FOUND NEW FILE L:\comlog_27_02_2009.tfs
     
    C:\log\>C:\M-200\callbuilder\parser.exe -tfsfile "L:\comlog_
    27_02_2009.tfs" -outdir "C:\Log"

     
    В общем все равно запустил на обработку.

    Всего записей: 155 | Зарегистр. 20-10-2006 | Отправлено: 10:46 27-02-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Работает без него.  
    ага, работает - пока диск мапится. А если не замапится - прервется правильно?
     
    а, у меня описка вылезла,
    if "%data1:~0,10%"=="%date%" goto :eof

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 11:02 27-02-2009 | Исправлено: wolf0425, 11:13 27-02-2009
    K_AHTOH



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    Спасибо!! Теперь все вроде работает.

    Цитата:
    ага, работает - пока диск мапится. А если не замапится - прервется правильно?  

    Поставил...  && Но там проблема... Если диск уже был открыт с такой буквой... Пока не знаю что делать.

    Всего записей: 155 | Зарегистр. 20-10-2006 | Отправлено: 11:25 27-02-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Если диск уже был открыт с такой буквой... Пока не знаю что делать.
     
    for %%a in ( m n o p q r s t u v w x y z ) do if not exist %%a:\nul set "netdisk=%%a:" && goto :setdisk
    echo Cannot assighn disk && goto :eof
    :setdisk

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 11:34 27-02-2009
    K_AHTOH



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    Спасибо!!!
    Откатаю и выложу батник с описанием.

    Всего записей: 155 | Зарегистр. 20-10-2006 | Отправлено: 13:53 27-02-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    K_AHTOH
    кстати, при мапинге на разные буквы вылезет еще бага - в лог пишется полный путь файла, и при разных мапингах прописанный поиск по логу %1 - обломится.
    правка сравнения:
    findstr /L /I /C:"%~pnx1" %logfile% >nul && goto :eof  
    интересно -сколько еще багов

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 14:29 27-02-2009
    K_AHTOH



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    Спасибо только что увидел
    Т.к. парсер запустился по новой

    Всего записей: 155 | Зарегистр. 20-10-2006 | Отправлено: 14:48 27-02-2009
    Kilyan



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Требуется организация батника!  
    В разделе реестра HKLM\SOFTWARE\microsoft\windows\curentversion\uninstall\  
    существуют разделы для удаления программ, например такого вида {7f....db527}  
    в которых несется информация о продукте (publisher) и ключ для удаления (uninstallString)  
    Как найти необходимый продукт из массы {7f....db527} со строковым параметром  (publisher) и при нахождении вытянуть строковый параметр для удаления (uninstallString)  
    Очень нужно - ПОМОГИТЕ!

    Всего записей: 886 | Зарегистр. 04-09-2008 | Отправлено: 15:01 27-02-2009
    K_AHTOH



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Все работает
    Вот что в итоге у меня получилось:

    Код:
    :: Скрипт предназначен для обработки файлов внешней программой  
    :: расположенных на удаленном компьютере с общим доступом.
    :: После обработки файлы заносятся в список обработанных и больше не обрабатываются
    :: Не обрабатывается также файл с текущей датой.
    ::  
    @echo off
    SETLOCAL ENABLEDELAYEDEXPANSION
     
    :: Путь к источнику файлов
    set "SourceDir=\\192.168.01.01\folder"
    :: Домен\Логин
    set "domean_login=dom\sysadmin"
    :: Пароль
    set "password=1234567"
    :: Outputdir - директория вывода обработанных файлов
    set "Outputdir= C:\LOG\"
    :: Путь к программе парсера
    set "parser= C:\parserdir\"
    :: logfile.txt - файл, гда хранятся имена обработанных ранее файлов
    set "logfile=logfil.txt"
    :: Определяем свободную букву для подключаемого диска
    for %%a in ( m n o p q r s t u v w x y z ) do if not exist %%a:\nul set "netdisk=%%a:" && goto :setdisk
    echo Cannot assighn disk && goto :eof
    :setdisk  
    :: Подключаем сетевой диск
    net use %netdisk% %SourceDir% /user:%domean_login% %password%
    If Not "!ErrorLevel!"=="0" ECHO %date:~-10% %time:~,5%  Сетевой ресурс не доступен >> %LOGFILE% &&goto :eof
    :: *.tfs фильтр по расширению файла
    SET "SEEKIN=%netdisk%\*.tfs"
    for %%f in (!SEEKIN!) DO call :chk %%f
    :: ====== Завершение работы =====
    :: отключаем сетевой диск
    net use %netdisk% /delete /yes
    :: очистка от мусора
    IF EXIST %Outputdir%*.err del %Outputdir%*.err
    IF EXIST %Outputdir%*.rm3 del %Outputdir%*.rm3
    IF EXIST %Outputdir%*.jrn del %Outputdir%*.jrn
    goto :eof
     
    :chk
    set "data1=%~t1"
    if "%data1:~0,10%"=="%date%" goto :eof
    findstr /L /I /C:"%~pnx1" %logfile% >nul && goto :eof  
    ::ECHO FOUND NEW FILE %1
    :: Запуск программы парсера (-tfsfile  -outdir  ключи парсера)
    %parser%parser.exe -tfsfile "%1" -outdir !Outputdir!
    if errorlevel 0 ECHO %date:~-10% %time:~,5% %1 >> %LOGFILE%
    )
     
    :wrk
    if not "%1"=="" SET "NEW=0"  

    Всего записей: 155 | Зарегистр. 20-10-2006 | Отправлено: 15:45 27-02-2009 | Исправлено: K_AHTOH, 17:39 27-02-2009
    ikif



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите плз, застрял с одной фигней.

    Код:
     
    GOTO start
    :start
    for /F "tokens=2 delims=: skip=2" %%a in ('ipconfig ^| findstr "IP"') do (if not defined myip set myip=%%a)  
    find /i  "%myip%" < Spisok>NUL
    IF "%errorlevel%"=="0" (
    RECONNECT
    rasdial "prov" /disconnect
    PING 1.1.1.1 -n 1 -w 8000 >NUL
    rasdial "Prov" user pass
    GOTO start
    )  ELSE  (
    echo  %myip% >>Spisok
    )
     

     
    Проблема в том, что даже если АЙ ПИ уже новый, то с FOR получаем каждый раз , АЙ ПИ , который  был получен в первый раз.
    Похоже , что  в FOR не заходит снова, даже если я к этому принуждаю.
    Помогите плз

    Всего записей: 164 | Зарегистр. 09-12-2006 | Отправлено: 15:56 27-02-2009
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ikif
    Убери из строчки for-a "if not defined myip"

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 17:07 27-02-2009
    ikif



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

    Цитата:
    Elroir

     
    Спасибо огромное.

    Всего записей: 164 | Зарегистр. 09-12-2006 | Отправлено: 17:17 27-02-2009
    bashik

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    здравствуйте уважаемые.
    помогите с проблемкой - как заставить for /f разобрать только 1 строку из текстового файла?  
    ситуация - есть 2 папки, в одной лежат нужные файлы, в другой есть файлы с таким же названием и куча других. задача - переместить файлы совпадающие с названиями в 1 папке в третью папку, а из первой во вторую. просто копировать из 1 во вторую нельзя, так как файлы заняты процессом и заменять себя не дают (зато дают перемещать).
    пробовал получать список файлов  и разбирать его через for /f  
     
    @echo off
    dir /b files\patch >files\dir.txt
    for /f "tokens=1 delims=*" %%i in (files\dir.txt) do echo %%i >files\tmp.txt    
    pause
     
    но в итоге я получаю в переменную имя последнего файла в списке.
    как получить из этого списка файлов (их немного 10-15 штук, и причем названия могут быть разными, поэтому и не получается привязаться ) соответственно 10-15 переменных и именем каждого файла в каждой?  
     

    Всего записей: 3 | Зарегистр. 27-02-2009 | Отправлено: 20:09 27-02-2009 | Исправлено: bashik, 20:10 27-02-2009
    ponand

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

    Цитата:
    @echo off
    dir /b files\patch >files\dir.txt
    for /f "tokens=1 delims=*" %%i in (files\dir.txt) do echo %%i >files\tmp.txt
    pause
     

    попробуй так

    Код:
     
    @echo off
    For /F %%i in ('dir files\patch\ /b') do echo %%i >>files\tmp.txt
    pause
     


    Всего записей: 56 | Зарегистр. 14-07-2008 | Отправлено: 23:08 27-02-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    K_AHTOH
    вот что в итоге у меня получилось:
    похоже все на месте, хотя некоторое количество мусора осталось:
     
    блок :wrk в конце - никому не нужен (но и ничего не портит)
     
    блок :chk должен завершаться не закрывающей скобкой (к которой давно уже нет открывающей) а строкой goto :eof - это просто для предсказуемости, вдруг через месяц/год еще какую подпрограмму в конец файла допишешь.
     
    ну и переменные в !!  ( !SEEKIN! ) используются без необходимости, сгодились бы и в %%. но это косметика

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 05:05 28-02-2009 | Исправлено: wolf0425, 05:17 28-02-2009
    bashik

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

    Цитата:
    @echo off
    For /F %%i in ('dir files\patch\ /b') do echo %%i >>files\tmp.txt
    pause  

    попробовал...

    Цитата:
    @echo off
    For /F %%i in ('dir files\patch\ /b') do set dir=%%i >>files\tmp.txt
    copy system\%dir% files\client
    pause
     
    в результате копируется последний файл из 11,  хотя в темп пишет все 11.

    Всего записей: 3 | Зарегистр. 27-02-2009 | Отправлено: 07:45 28-02-2009 | Исправлено: bashik, 07:46 28-02-2009
    king_stiven

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

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


    Код:
    for /f "tokens=*" %%e in ('dir "folder1" /b /a:-d') do (
        MOVE "folder2\%%e" "folder3"
        MOVE "folder1\%%e" "folder2"
    )

     
    где
    в одной лежат нужные файлы,    folder1     D:\temp
    в другой есть файлы с таким же названием и куча других    folder2     c:\temp
    в третью папку    folder3     e:\temp folder

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 08:38 28-02-2009 | Исправлено: king_stiven, 09:00 28-02-2009
    bashik

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




    «Спасибы» — в ПМ!

    Всего записей: 3 | Зарегистр. 27-02-2009 | Отправлено: 10:43 28-02-2009 | Исправлено: vu1tur, 11:18 28-02-2009
    K_AHTOH



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    Большое спасибо за помощь! (косметику поправлю)
     
    У меня теперь другая проблема
    Как запустить несколько экземпляров скриптов (со своими настроками) на удаленной машине под своей учетной записью?
    Понимаю что можно написать батник и перечислить нужные скрипты, но тогда они будут выполнятся последовательно (пока не закончит выполнятся один второй не запустится).
    Запускать нужно в шедулере. А та больше 2- процессов не получается запустить (система блокирует учетку.
    Можно как нибудь из 1-го батника сразу запустить несколько параллельно?

    Всего записей: 155 | Зарегистр. 20-10-2006 | Отправлено: 12:26 28-02-2009
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 6
    vu1tur (26-05-2009 11:39): часть 7 — http://forum.ru-board.com/topic.cgi?forum=62&topic=17154#1


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru