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

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

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

vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:37 26-05-2009 | Исправлено: TechnicsKuzya, 13:53 27-12-2009
    king_stiven

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

    BVV63

    Код:
    For %%A In (A B) Do (
        set "Letters1=%%A"
        call :hjk
    )
    goto :eof
    :hjk
    set Letters=%Letters%%Letters1%

     
    либо

    Цитата:
    setlocal enabledelayedexpansion и переменные окружения  

     

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 15:26 16-11-2009
    wolf0425



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

    Цитата:
    Подскажите, пожалуйста, как в конструкции for... in... do... грамотно работать с переменными. К примеру, если в командной строке выполнить команды
    ...
    Но когда я выполняю  
    For %%A In (A B) Do Set %Letters%%%A  
    глюк-с, наверно ты хотел написать Set Letters=%Letters%%%A
    так делать действительно нельзя из-за того что все %переменные% цикла развертывается в текст в момент начала обработки той строки, где стартует цикл.
     
    Методов обхода этой проблемы я знаю два, оба со своими ограничениями:  
    переход на !переменные!
    Код:
    setlocal enabledelayedexpansion
    For %%A In (A B) Do Set Letters=!Letters!%%A
    и переход на подпрограммы

    Код:
    For %%A In (A B) Do call :_set %%A
    Set Letters
    exit
    :_set
    set Letters=%Letters%%1
    exit /b

    а, еще для тривиального случая, третий:

    Код:
    For %%A In (A B) Do call set Letters=%%Letters%%%%A

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 15:34 16-11-2009 | Исправлено: wolf0425, 15:35 16-11-2009
    01MDM



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

    Цитата:
    К сожалению nircmdc не умеет выбирать нужного окна.

    В справке к команде контекст "win" самый обширный.

    Код:
     
    nircmdc win <команда> <условия>
     
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 18:11 16-11-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    подскажите консольный архиватор, который понимает файл-список в ANSI кодировке
    Очень желательно - бeсплатный.
     
    Или способ отучить 7z ругаться на совпадение имен файлов при разных их путях в списке.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 18:39 16-11-2009 | Исправлено: wolf0425, 19:20 16-11-2009
    aLkoZaDr

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    суть задачи довольно проста ток я немугу её решить :  
     
    Нужно создать задачу компу которая бы запускала калькулятор(к примеру) каждые 5 минут ис под имени пользователя а не системы !
     
     
    schtasks /create /ru "" /sc minute /mo 5 /tn "calc" /tr calc.exe  
    УСПЕХ. Запланированная задача "calc" была успешно создана.
    задаёт процесс как системный и калькулятор не запускается хотя служба в диспечере висит! но сам калькулятор не запускает
     
    schtasks /create /sc minute /mo 5 /tn "calc" /tr calc.exe
    ПРЕДУПРЕЖДЕНИЕ. Запланированная задача "calc" была создана, однако не может выполняться, так как не удалось задать сведения об учетной записи.
    если поставить галочку"выполнять только при выполненом входе в систему" то всё  
    работает   ТАК КАК ЖЕ СДЕЛАТЬ ЧТОБЫ РАБОТАЛО СРАЗУ??
     
    и 2-ое
    при запуске СМД нужно чтобы сразу открывало свой интерфейс  
    (к примеру)
     
    @echo off
    mode con: cols=150 lines=32766
    cls
    ver
    echo ===================================
    echo %TIME%
    echo ComputerName --= %COMPUTERNAME%
    echo Operation sustem --= %OS%  
    echo UserName --= %USERNAME%
    echo ===================================
    title ________
    prompt $d $_ $T $_ Common! Say you komand: $S $q $f $_ $S $S $S $S $S $S $S $S $S $S $S $S $S $S $S  
    color 1f  
     
    заранее thx

    Всего записей: 1 | Зарегистр. 16-11-2009 | Отправлено: 22:10 16-11-2009 | Исправлено: aLkoZaDr, 22:13 16-11-2009
    dSasha

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

    Код:
    Microsoft Windows [Version 6.1.7100]
    (c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.
     
    C:\Windows\system32>curl -k -s -I -ssl3 "https://yartelecom.yaroslavl.ru/www/UCP.nsf/Saldo?openagent&z=22&sc=4&d=&ct=181000369894&cp=0"
    HTTP/1.1 302 Found
    Server: Lotus-Domino/5.0.8
    Date: Mon, 16 Nov 2009 21:33:26 GMT
    Location: https://yartelecom.yaroslavl.ru/www/UCP.nsf/saldo?OpenForm&ct=181000369894&vo=&so=15,03&cp=0&sc=4&z=22&de=
    Connection: close
    Content-Type: text/html
    Надо, чтобы вот из этого выводилось только
    Код:
    ct=181000369894&vo=&so=15,03
    а лучше бы
    Код:
    181000369894 15,03
    Это возможно?
    В Линукс это делают с помощью awk
    Код:
    curl -s -I -ssl3 'https://yartelecom.yaroslavl.ru/www/UCP.nsf/Saldo?openagent&z=22&sc=4&d=&ct=<НОМЕР_ЛИЦЕВОГО_СЧЁТА>&cp=0' | awk --posix '/Location/ { match ($0, "so=[0-9\\,\\.]*"); print substr($0, RSTART+3, RLENGTH-3) }'
    А у меня в Windows ничего не получается, одни ошибки.
    Вернее, выводится целиком строка "Location: https:..."
    Код:
    curl -k -s -I -ssl3 "https://yartelecom.yaroslavl.ru/www/UCP.nsf/Saldo?openagent&z=22&sc=4&d=&ct=181000369894&cp=0" | awk /Location/

    Всего записей: 30 | Зарегистр. 15-06-2007 | Отправлено: 00:59 17-11-2009 | Исправлено: dSasha, 01:13 17-11-2009
    wolf0425



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

    Код:
    type 1.txt | findstr /b Location: | sed -r "s/^.+&ct=([0-9]+).+&so=([0-9][0-9],[0-9][0-9])&.+$/\1 \2/g"
    только оно на вышеописанный порядок завязано, защиты от дурака нет.
     
    sed надеюсь найдешь, curl для теста заменен на type вышепроцитированного лога
    избавиться от findstr и сделать чисто на sed наверно можно, но думать лень.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 03:03 17-11-2009 | Исправлено: wolf0425, 03:21 17-11-2009
    BVV63



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

    Цитата:
    глюк-с, наверно ты хотел написать Set Letters=%Letters%%%A

    Действительно, глюк-с. Очепятка .
    Благодарю, господа, за помощь. Я остановился на последнем методе, предложенным wolf0425 (для тривиального случая), усё заработало. Хотя я метод и не очень понимаю... Разве можно так использовать команду Call?

    Цитата:
    переход на !переменные!

    Никогда про такие не слышал. Не подскажете, где можно почитать про них?

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 06:25 17-11-2009 | Исправлено: BVV63, 06:26 17-11-2009
    king_stiven

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

    Цитата:
    Никогда про такие не слышал. Не подскажете, где можно почитать про них?

    В шапке

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 08:59 17-11-2009
    slech



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    подскажите как перемещать из папки в папку файлы по 200 штук скажем.
    Есть папка In в неё прибывают файлы.
    Есть папка Out в неё нужно раз в час перемещать по 200 файлов из In
    Как перемещать файлы из папки в определённом количестве.
    Файлы однотипные - *.txt
     
    Спасибо.

    Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 13:26 17-11-2009
    01MDM



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

    Код:
     
    @echo off
    setlocal
     
    pushd "C:\In"
     
    for /f "tokens=*" %%i in ('dir /b *.txt') do call:set "%%i"
    for /l %%i in (1,1,200) do (
        for /f "tokens=2 delims==" %%i in ('set %%i_') do move "%%i" "C:\Out"
    )
    popd
    goto:eof
     
    :set
    set /a cnt+=1
    set "%cnt%_=%~1"
     

    или такой:

    Код:
     
    @echo off
    setlocal
     
    pushd "C:\In"
     
    for /f "skip=200 tokens=*" %%i in ('dir /b *.txt') do (
        set "file=%%i" 2>nul
        goto:move
    )
     
    :move
    if not defined file goto:end
     
    for /f "tokens=*" %%i in ('dir /b *.txt') do (
        if not "%%i"=="%file%" (move "%%i" "C:\Out") else (goto:end)
    )
     
    :end
    popd
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 14:31 17-11-2009
    slech



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    спасибо большое.
    1 скрипт сработал.
    2 тоже но только 1 раз, мне нужно копировать постояно. т.е. 200, потом через час ещё 200 и т.д.
    видимо надо добавить ещё какую нибудь проверку.
     
    Добавлено:
    зато второй работает намного быстрее.
    можно его подправить ?

    Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 15:03 17-11-2009
    Maqentaer



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

    Всего записей: 71 | Зарегистр. 18-05-2008 | Отправлено: 15:14 17-11-2009
    slech



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

    Цитата:
     
    @echo off
    setlocal
     
    pushd "C:\In"
     
    for /f "skip=200 tokens=*" %%i in ('dir /b *.txt') do (
       set "file=%%i" 2>nul
        goto:move
    )
     
    :move
    if not defined file goto:end
     
    for /f "tokens=*" %%i in ('dir /b *.txt') do (
        if not "%%i"=="%file%" (move "%%i" "C:\Out") else (goto:end)
    )
     
    :end
    popd  
     

    и не выполняет перемещение.
    как обеспечить периодичность это уже я придумаю.
     
    Добавлено:
    а, нет стоп.
    скрипт 2 не срабатывает если файлов в папке In остаётся меньше 200.
    осталось 8 файлов - скрипт и не выполняет перемещение.

    Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 15:21 17-11-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    slech
    Цитата:
    подскажите как перемещать из папки в папку файлы по 200 штук скажем.
    Есть папка In в неё прибывают файлы.
    Есть папка Out в неё нужно раз в час перемещать по 200 файлов из In  
    простое премещение до 200 файлов:  

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set counter=0
    for %%a in ( in\* ) do set /a counter += 1 & if !counter! LEQ 200 (move "%%a" "out\%%~nxa") else exit  

     
    такие вещи при возможности лучше без dir делать - чтоб об не-ОЕМ имена не спотыкаться в случае чего

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 15:50 17-11-2009 | Исправлено: wolf0425, 15:52 17-11-2009
    slech



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

    Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 17:20 17-11-2009
    dSasha

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

    Цитата:
    Sasha  так пойдет?
    Код:
    type 1.txt | findstr /b Location: | sed -r "s/^.+&ct=([0-9]+).+&so=([0-9][0-9],[0-9][0-9])&.+$/\1 \2/g"
    только оно на вышеописанный порядок завязано, защиты от дурака нет.
    Спасибо! Работает. Только есть два нюанса: мне трудно понять как оно работает, и, поэтому я не знаю, как сделать, чтобы фильтровались не только положительные числа.
    Например, у меня на домашнем телефоне отрицательный баланс и строчка выводится целиком.
    Код:
    Location: https://yartelecom.yaroslavl.ru/www/UCP.nsf/saldo?OpenForm&vo=&na=48534326&so=-10.55&cp=0&sc=1&z=22&de=

    Всего записей: 30 | Зарегистр. 15-06-2007 | Отправлено: 17:22 17-11-2009
    Drowisha

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Никогда не интересовался батниками, да и не думал что они понадобяться.
    Поставили задачу сделать, батник что-бы бекапил несколько серверов, причем бекап делал полный а не пару файликов. Причем на одном из серверов стоит AIX.
    Посидел подумал вот что получилось, но это чудище не работает, гляньте профи взглядом, и укажите нубу на ошибки. Спасибо.
    C:
    cd C:\test\BackUp\TNF\
    date /t
    SET dir=backup
     
    wget -r -nH  -P %dir%/TNF/RIS ftp://user:passwd@172.18.69.68
     
    wget -r -nH -P %dir%/TNF/DGW ftp://user:passwd@172.18.69.68
     
    wget -r -nH -P %dir%/TNF/RES ftp://user:passwd@172.18.69.69
     
    wget -r -nH -P %dir%/TNF/ASC ftp://user:passwd@172.18.69.70
     
    wget -r -nH -P %dir%/TNF/TTS1 ftp://user:passwd@172.18.69.71
     
    wget -r -nH -P %dir%/TNF/TTS2 ftp://user:passwd@172.18.69.72
     
    net use \\172.18.69.73\c$ passwd /user:domain\user
    md %dir%\TNF\172.18.69.73
    Xcopy /E /Y /EXCLUDE:dnt_copy.txt \\172.18.69.73\c$\Medio\*.* %dir%\TNF\RTS\172.18.69.73\
     
    net use \\172.18.69.74\c$ passdw /user:
    md %dir%\TNF\RD\172.18.69.74\
    Xcopy /E /Y /EXCLUDE:dnt_copy_RD.txt "\\172.18.69.74\c$\*.*" %dir%\RD\172.18.69.74\
     
    rem MDP
    md C:\test\BackUP\TNF\MDP
    C:\test\BackUP\WinSCP3\winscp3 /console /script=C:\test\BackUP\WinSCP3\scripts.txt
     
    rem ToZIP
     
    cd C:\test\BackUP\TNF
    C:\"Program Files"\7-Zip\7z.exe a -tzip SCP1.zip TNF
    rmdir /s /q C:\test\BackUP\TNF
    mkdir C:\test\BackUP\TNF    
    xcopy /E /Y C:\test\BackIP\TNF\*.zip  
    C:\test\BackUP\TNF
    DATEDIR.exe C:\test\BackUP\backup\

    Всего записей: 1 | Зарегистр. 17-11-2009 | Отправлено: 18:21 17-11-2009
    Ortios



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dSasha
    С позволения wolf0425 предложу чуть более универсальный вариант, который к тому же учитывает отрицательные числа:

    Код:
    type 1.txt | findstr /b Location: | sed -r "s/^.*&ct=([0-9]*).*&so=(-?[,0-9]*).+$/\1 \2/g">_1.txt

    Всего записей: 73 | Зарегистр. 24-12-2007 | Отправлено: 20:08 17-11-2009 | Исправлено: Ortios, 21:10 17-11-2009
    wolf0425



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

    Цитата:
    чуть более универсальный вариант, который к тому же учитывает отрицательные числа:  
    ну если пошла такая пьянка что самостоятельно подогнать регэксп под строку владеющий awk заказчик почему-то не может, то отмечу что дома у него еще и разделители по другому настронены:
    Цитата:
    so=-10.55&cp=0&sc=1&z=22&de=
    так что наверно получится  
    sed -r "s/^.*&ct=([0-9]+).*&so=(-?[\.,0-9]+).*$/\1 \2/g"
     
    вот кто бы научил как прямо на скрипте sed прибить тут лишние строки, чтоб от findstr избавиться... чисто из эстетско-хулиганских мотиваций.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 22:17 17-11-2009 | Исправлено: wolf0425, 22:18 17-11-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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 7
    vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru