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

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

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

vu1tur (04-11-2008 23:07): Задачи на bat-файлах 6  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

Nagual



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

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

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

  • Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 12:28 19-03-2008 | Исправлено: Nagual, 01:02 24-09-2008
    Joolz

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

    Код:
    cmdow @ /HID
    @echo off
    TITLE If PC Start v 1.00.00
    setlocal
    if /i "%1"=="" (
    HS_MESSAGE "Введите имя компьютера. Напимер: ifPCstart workstation01" "Неверный синтаксис" I OK
    goto :EOF
    )
    goto CallWS
    :CallWS
    HS_DELAY 1000
    Ping -n 1 %1 >nul
    If %ERRORLEVEL%==0 (
    HS_MESSAGE "Компьютер %1 вошел в сеть." "%1" I OK
    GOTO :EOF
    )
    goto :CallWS
     

    В таком виде работает, если ставлю errorlevel 0, то не зависимо от его реального значения происходит выполнение по if.

    Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 09:59 04-04-2008 | Исправлено: Joolz, 10:03 04-04-2008
    sipok

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

    Цитата:
    И зачем тебе проверка "if not %%i gtr 5 if not %%i equ 0"? Просто в планировщик забей батник, раз в день с понедельника по пятницу, %%i всегда будет каким-надо.  

     
     
    весь юмор в том что этот батник из командной строки наконец то начал выполняеться как надо,  
    а из планировщика задач, запускаеться и копирует все в папку где расположен батник )))
    установил альтернативный планировщик xstarter запускает батник и все копирует в папку Windows ))))))
    я вообще в шоке, винда server 2003 r2

    Всего записей: 18 | Зарегистр. 15-11-2006 | Отправлено: 11:05 04-04-2008
    igor_andreev

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

    Цитата:
    из планировщика задач, запускаеться и копирует все в папку где расположен батник )))  
    установил альтернативный планировщик xstarter запускает батник и все копирует в папку Windows ))))))  

    Это может быть с правами связано. Наверно в планировщике батник выполняется от имени пользователя SYSTEM, который не имеет доступа к сетевым дискам. А из комстроки ты запускаешь от имени залогиненного пользователя.
    Проверка делается:

    Код:

    pushd \\server\share
    if errorlevel 1 goto :map_error

    В шапке Полезные ссылки -> Урок bat-аники почитай, там описан случай, когда батник сказал "UNC-пути в качестве текущих каталогов не поддерживаются и лучше он сменит текущий каталог на C:\WINDOWS"
     
    Добавлено:
    Joolz
     
    if %errorlevel%==0 - если код возврата равен нулю
    if errorlevel 0 - если код возврата равен или больше нуля
     
    Попробуй if not errorlevel 1
     
     

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 14:12 04-04-2008
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Joolz
    Дело в том, что "if %errorlevel%==0"  и "if errorlevel 0" - это неравнозначные выражения.
    Первое, действительно, проверяет равен ли код возврата нулю, а вот второе означает - "если код возврата больше или равен нулю". То есть в твоем случае - это будет оначать вообще всегда.
     
     
    Добавлено:
    igor_andreev
    Хм.. ты уже ответил

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 14:33 04-04-2008
    sipok

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

    Цитата:
    Это может быть с правами связано. Наверно в планировщике батник выполняется от имени пользователя SYSTEM, который не имеет доступа к сетевым дискам. А из комстроки ты запускаешь от имени залогиненного пользователя.  

     
    Я запуская со своими правами, нна подключаемом диске  на мой логин даны полные права.
    в Планировщике задач в графе Run as: стоит мой логин.

    Всего записей: 18 | Зарегистр. 15-11-2006 | Отправлено: 14:45 04-04-2008 | Исправлено: sipok, 14:50 04-04-2008
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sipok
    Вставь в батник проверку и запусти из планировщика:

    Код:

    pushd \\server\share  
    if errorlevel 1 (echo %computername%\%username% %time:~0,8% Map \\server\share error>>C:\error.log & exit /b)

    сразу и узнаешь, какие у кого права.
     

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 15:01 04-04-2008
    sipok

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igor_andreev
     
    pushd \\server\folder
    Z:\>if errorlevel 1 (echo domain\user 15:22:13 Map \\server\folder error
      1>>C:\error.log  & exit /b )
    после запуска,
      файла C:\error.log не нашел )

    Всего записей: 18 | Зарегистр. 15-11-2006 | Отправлено: 15:30 04-04-2008
    igor_andreev

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

    Цитата:
    файла C:\error.log не нашел

    Ну и прекрасно, значит вставляй вместо echo - xcopy  

    Код:

    pushd \\server\share  
    if not errorlevel 1 xcopy drive:\source\*.* subfolder\destination\ /i /y

    У xcopy тоже есть коды возврата, если что. Батник то несложный, чего ты его больше недели мучаешь?

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 15:56 04-04-2008
    sipok

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

    Цитата:
    У xcopy тоже есть коды возврата, если что. Батник то несложный, чего ты его больше недели мучаешь?  

     
    @echo off  
    for /f "tokens=2 delims==" %%i in ('wmic path win32_LocalTime get DayOfWeek /value') do (
    pushd \\server\folder
    cd subfolder                                                    --- добавляем cd тут
    cd %%i                                                           --- и тут
    if not errorlevel 1 xcopy D:\folder\*.* /i /y        ---  он не хотел нормально копировать в папку %%i
    popd
    )
     
    При пошаговом переходе по команде cd к конечной папке, начинает нормально выподнять bat'ник из планировщика
     
                         !!!!!!!!!! Огромное СПАСИБО igor_andreev и slayer120!!!!!

    Всего записей: 18 | Зарегистр. 15-11-2006 | Отправлено: 16:26 04-04-2008 | Исправлено: sipok, 16:32 04-04-2008
    igor_andreev

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

    Цитата:
    pushd \\server\folder  
    cd subfolder                                                    --- добавляем cd тут  
    cd %%i                                                           --- и тут  

    тогда уж pushd \\server\folder\subfolder\%%i, если ты уверен, что папка subfolder\%%i существует.

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 16:40 04-04-2008
    sipok

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

    Цитата:
    тогда уж pushd \\server\folder\subfolder\%%i, если ты уверен, что папка subfolder\%%i существует.  

     
    точно сократил до следующего вида:
    @echo off  
    for /f "tokens=2 delims==" %%i in ('wmic path win32_LocalTime get DayOfWeek /value') do (  
    pushd \\server\folder\subfolder\%%i
    D:\folder\*.* /i /y
    popd  
    )  
     
     
    ЕЩЕ раз СПАСИБО !!!

    Всего записей: 18 | Зарегистр. 15-11-2006 | Отправлено: 16:54 04-04-2008
    RaP1D



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А как сделать следущее:
    if (1 июня) выполняеться команда
     
    То есть, запуск команды только, если сегодня 1 июня...

    Всего записей: 186 | Зарегистр. 29-12-2007 | Отправлено: 21:44 04-04-2008
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RaP1D
    От формата даты вообще зависит. Например, если у тебя DATE /T выдает сегодня 04.04.2008, то можно так:

    Код:

    DATE /T | FIND "01.06" && Тут твоя команда


    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 21:51 04-04-2008
    RaP1D



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igor_andreev
    Спасибо!!!
     
     
    Вопрос номер 2:
    Можно ли узнать посредством командной строки имя компьютера админа (не пользователя)? Ip адрес известен...
     
    Вопрос номер 3:
    Как сделать тоже, что и с датой, но только для локального диска? Допустим, если размер диска D > 10000Mb, то выполняеться команда...

    Всего записей: 186 | Зарегистр. 29-12-2007 | Отправлено: 22:01 04-04-2008 | Исправлено: RaP1D, 22:38 04-04-2008
    igor_andreev

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

    Цитата:
    Ip адрес известен...

    В локальной сети что-ли? tracert ip или nbtstat -A ip

    Цитата:
    Допустим, если размер диска D > 10000Mb, то выполняеться команда...

    А тут вроде кто-то уже определял свободное место на диске, посмотри в предыдущих ветках про батники в версии для печати. Я сам признаться никогда этим не заморачивался
    Что-то вроде
    for /f "skip=2 tokens=5 delims=: " %%a in ('fsutil volume diskfree d:') do set "free_space=%%a"
    set free_space=%free_space:~0,6%
    if /i %free_space% GTR 100000 тут команда
    tokens от версии винды зависит ru\en, что там fsutil выдает. Или vbs можно.

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 12:30 05-04-2008
    Wise_Kaa



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

    Цитата:
    Вопрос номер 2:  
    Можно ли узнать посредством командной строки имя компьютера админа (не пользователя)? Ip адрес известен..

    nbtstat -a ip-address (пример: nbtstat -a 192.168.1.2)

    Цитата:
    Вопрос номер 3:  
    Как сделать тоже, что и с датой, но только для локального диска? Допустим, если размер диска D > 10000Mb, то выполняеться команда...

    Не знаю как через батник, я делал через "журналы и оповещения производительности", там можно запускать программу по какому либюо событию, например, когда места на диске меньше чем надо.
     
    И у меня вопросик для знающих людей: как присвоить переменной размер файла? Что-то у меня никак не получается . Даже в теле цикла присваивание не происходит.
     
    setlocal enabledelayedexpansion
    for %%F in (*.*) do (
            echo %%F
            set razmer=%%~tF
            )
    echo размер файла=%razmer%
    pause

    Всего записей: 59 | Зарегистр. 04-01-2006 | Отправлено: 12:39 05-04-2008
    igor_andreev

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

    Цитата:
    Даже в теле цикла присваивание не происходит.

    Все происходит, каждый раз присваивается новое значение для каждого файла в папке. У тебя правда не размер, а время.

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 13:04 05-04-2008
    Wise_Kaa



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да, пардон, ошибся. Но не во времени суть.
     
    setlocal enabledelayedexpansion  
    for %%F in (*.*) do (  
            echo %%F  
            set File_time=%%~tF  
            echo %File_time%
             )  
    echo время создания последнего перебранного в цикле файла: %File_time%
    pause
     
    Вышеприведенный код выдает следующее:  
    echo off
    время файла 123.cmd=
    время файла slovar.txt=
    время файла slovar2.txt=
    время создания последнего перебранного в цикле файла: 01.02.2008 17:21
    Для продолжения нажмите любую клавишу . . .
     
    А как сделать, что бы знаечение времени присваивалось какой-то переменной в теле цикла?
    просто выводить echo %%~tF , не подходит, потому что со временем надо производить некоторые манипуляции.

    Всего записей: 59 | Зарегистр. 04-01-2006 | Отправлено: 13:20 05-04-2008 | Исправлено: Wise_Kaa, 13:21 05-04-2008
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Wise_Kaa
    Ну если пробелов в названиях файлов нет, то можно к File_time_ добавлять имя-расширение файла

    Код:

    for %%a in (*.*) do set "File_time_%%~nxa=%%~ta"
    echo 123.cmd %File_time_123.cmd%
    echo slovar.txt %File_time_slovar.txt%
    echo slovar2.txt %File_time_slovar2.txt%

    если пробелы или спецсимволы есть, можно счетчик встроить, file_time_1, file_time_2 ...

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 13:39 05-04-2008
    Wise_Kaa



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igor_andreev
    Спасибо большое и извини, что напрягаю, но это не совсем то что надо, возможно я немного непонятно выразился.
    Мне надо, что бы в теле цикла значение времени присвоилось переменной, потом в этом же цикле я мог это значчение как-то обработать.
    Т.е.  то-то типа  
     
    setlocal enabledelayedexpansion  
    for %%F in (*.*) do (  
            echo %%F  
            set File_time=%%~tF  
            if File_time==<сравниваемое значение>  выводим сообщение
             )

    Всего записей: 59 | Зарегистр. 04-01-2006 | Отправлено: 15:48 05-04-2008
       

    Страницы: 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-файлах 5
    vu1tur (04-11-2008 23:07): Задачи на bat-файлах 6


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru