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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Wise_Kaa
    Напиши что надо конкретно.
    Если уж используешь "setlocal enabledelayedexpansion" (имхо - зло), то надо переменные в цикле или условии заключать в "!var!"
     

    Код:
     
     setlocal enabledelayedexpansion  
    for %%F in (*.*) do (  
            echo %%F  
            set File_time=%%~tF  
            if !File_time!==<сравниваемое значение>  выводим сообщение
             )
     

     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 16:18 05-04-2008 | Исправлено: 01MDM, 16:22 05-04-2008
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Wise_Kaa, имхо проще заюзать forfiles

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 16:50 05-04-2008
    Wise_Kaa



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Nagual
    а что за forfiles?
     
    01MDM
    А почему "setlocal enabledelayedexpansion" зло?
     
    Надо что бы в папке перебрались все файлы, и все файлы, которые были созданы раньше чем 20 минут назад были удалены, ну или не удалены, а еще что-нибудь там с ними было сделано, например, переименованы, не важно,  еще и сам не решил .

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

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

    Код:
    for %%F in (*.*) do if "%%~tF"=="сравниваемое значение"  выводим сообщение

    правда этот код вот к этому

    Цитата:
    Надо что бы в папке перебрались все файлы, и все файлы, которые были созданы раньше чем 20 минут назад были удалены, ну или не удалены, а еще что-нибудь там с ними было сделано, например, переименованы, не важно,  еще и сам не решил  

    не совсем имеет отношения. Где то в предыдущей теме, 4-й, я выкладывал пример сравнения по датам создания и действие в результате сравнения. Но если тебе советуют использовать готовую утилиту, используй лучше её.
     
    Добавлено:
    Wise_Kaa
    Вот на этих страницах упоминается forfiles
     
    Задачи на bat-файлах 4 - [7]  Microsoft Windows  Компьютерный форум Ru_Board.htm
    Задачи на bat-файлах 4 - [16]  Microsoft Windows  Компьютерный форум Ru_Board.htm
    Задачи на bat-файлах 4 - [26]  Microsoft Windows  Компьютерный форум Ru_Board.htm
    Задачи на bat-файлах 4 - [41]  Microsoft Windows  Компьютерный форум Ru_Board.htm
    Задачи на bat-файлах 4 - [44]  Microsoft Windows  Компьютерный форум Ru_Board.htm
    Задачи на bat-файлах 4 - [46]  Microsoft Windows  Компьютерный форум Ru_Board.htm
    Задачи на bat-файлах 4 - [48]  Microsoft Windows  Компьютерный форум Ru_Board.htm
    Задачи на bat-файлах 4 - [62]  Microsoft Windows  Компьютерный форум Ru_Board.htm
    Задачи на bat-файлах 4 - [77]  Microsoft Windows  Компьютерный форум Ru_Board.htm

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 17:28 05-04-2008
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Wise_Kaa
    Сравнивать время в батнике не очень эстетично Vbscript-ом гораздо легче, там есть гибкая функция DateDiff, пару строчек займет. Да и %~tF возвращает не время создания, а время последней модификации.
     
     
    Добавлено:
    Простой пример, timediff.vbs  

    Код:

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.GetFile(WScript.Arguments.Item(0))
    s = DateDiff("n", f.DateCreated, Now)
    WScript.Quit (s)

    %errorlevel% будет - количество минут, прошедших со времени создания файла. В цикл FOR легко вставляется.

    Код:

    cscript timediff.vbs file.txt  
    if %errorlevel% gtr 20 echo file.txt older 20 min.

     
    Добавлено:
    А силами только батника код будет выглядеть некрасиво
     
    Добавлено:
    Даже можно изгальнуться и timediff.vbs записать в одну строчку

    Код:

    WScript.Quit (DateDiff("n", CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments.Item(0)).DateCreated, Now))

     
    Добавлено:

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот маленкая прога
     
    @Echo off
    Set /p x=Если хотите удалить файли с расширением txt Введите у  
    echo Вы ввели:  
    echo %x%
    if %x%==y del *.txt  
    pause
     
    Задача: как сделать так чтоб при нажатии кнопки Enter удалять а при Esc, выход из програмы.
    Как присвоить переменной х значения клавиши Enter?
    Спасибо зарание...

    Всего записей: 5 | Зарегистр. 05-04-2008 | Отправлено: 22:58 05-04-2008
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Monaxmm
    используя скрипты
    если хочешь сценарием, перефразируй вопрос и отвечай на него клавишами y (yes) и n (no)
    например,
    @echo off
    title Удаление файлов *.txt
    set /p "x=Для удаления файлов .txt нажмите Y, для выхода из программы, нажмите N "
    echo Вы ввели: %x%
    if /i %x%==y del *.txt
    if /i %x%==n goto:eof
    pause
    или
    @echo off
    title Удаление файлов *.txt
    set /p "x=Для удаления файлов .txt нажмите Y, для выхода из программы, нажмите любую клавишу "
    echo Вы ввели: %x%
    if /i %x%==y del *.txt else goto:eof
    pause

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 17:04 06-04-2008 | Исправлено: Nagual, 17:30 06-04-2008
    Monaxmm

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В первую очередь: Спасибо за ответ на вопрос!
    Хочу сделать тоже самое только чтобы вместо у и n, было клавиша Enter и Esc.  
    Возможно ли ето? Или нет ризона парится по пустякам?

    Всего записей: 5 | Зарегистр. 05-04-2008 | Отправлено: 17:46 06-04-2008 | Исправлено: Monaxmm, 17:48 06-04-2008
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Monaxmm
    повторяю, используя скрипты (гибридный сценарий)
    мне лично писать такое лень, т.к. код представляет малый интерес
    в принципе, клавишу Enter можно использовать как любую, остается скриптом обработать клавищу Ecs
     
    пример кода на js
     
    Код:
    W=WScript.CreateObject("WScript.Shell")
    W.SendKeys("~")   // клавиша Enter
    W.SendKeys("{ESC}") // клавиша Escape
     
    на vbs выглядит так
     
    Код:
    Set W=CreateObject("WScript.Shell")
    W.SendKeys "{ESC}" ' клавиша Escape
    W.SendKeys "~"   ' клавиша Enter
     
    ищи примеры в сети
    а вообще, резона париться по пустякам нет

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 18:27 06-04-2008 | Исправлено: Nagual, 21:24 06-04-2008
    Monaxmm

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

    Всего записей: 5 | Зарегистр. 05-04-2008 | Отправлено: 20:22 06-04-2008
    ja_ja

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Много искал но не нашел ничего, по этому решил спросить.
     
    Есть класс 15 PC, еще один комп для учителя. домена нет, есть только локальная сеть. Так вот в этом классе надо для 15 компов на диске D: создать папку students, когда ученики поработают и в этой папке запишут свои файлы и папки, их надо удалить и подготовить чистую папку для другого класса, D:\students но с правами доступа и записи  для лимитированного юзера student.
     
    Часть проблемы я решил. Написал следующее:
     
    net use \\192.168.1.12\IPC$ /User:Administrator password – вхожу с правами админа
    rd /S /Q \\192.168.1.12\d$\student - удаляю папку
    mkdir \\192.168.1.12\d$\student - создаю папку
     
    Ну и повторяю этот цикл 15 раз для разных IP. Запускаю батник с компа учителя.
    Проблема в том что из 15 компов на пяти создается папка D:\students с правами Administrator (вообще-то это так и должно быть, но почему 10 компов разрешают создавать папку с правами доступа student? не понимаю), ну и ясно юзер student не может открыть, тем более записать в него нечего не может.  
     
    Пробовал добавить:
    cacls \\192.168.1.12\d$\student /t /e /g student:f - полный доступ пользователя student
     
    Но не помогает, cacls на локальном компе всё делает правильно, но в сетке права папке не выставляет для указанного юзера, добавляет непонятного юзера с полными правами и то в том случае если на компе учителя создам юзера student.  
     
    Если спросите почему не использую del (зачем всю папку удалять, потом создавать и мучится с правами) то скажу что оно не удаляет подкаталоги, которые создают ученики.
     
    В общем нужна помощь, как с помощью батника задать права на папку конкретному юзеру (на той машине) на удаленном локальном компьютере, который не находится в домене.

    Всего записей: 5 | Зарегистр. 31-12-2006 | Отправлено: 14:50 07-04-2008 | Исправлено: ja_ja, 19:25 07-04-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ja_ja
     
    PushD
    RD /s /q .
    PopD
    пути нужные вставить

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 17:15 07-04-2008
    slayer120



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

    sipok

    Цитата:
    Значит - либо ставь на конце  значок \,  
    xcopy /i /Y f:\folder\*.* B:\%%i\  
     либо юзай /i  

     Слушай, я сам лажанулся:
    первый способ  (
    xcopy /Y f:\folder\*.* B:\%%i\      - без /i - на конце косуха обязательно
     
    второй с /i  
     
    xcopy /i /Y f:\folder\*.* B:\%%i  - здесь последняя косуха не нужна.
     оба способа рабочие 100 %.  
     

    Всего записей: 303 | Зарегистр. 24-01-2007 | Отправлено: 17:17 07-04-2008
    ja_ja

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
     
    Огромное человеческое спасибо.
     
    Неделю мучился, как раз думал как-то примоунтит папку но никак до ума довести не мог.
     
    Кстати команда RD /s /q . после выполнения пишет:
     
    The process cannot access the file because it is being used by another process.
     
    но свое дело делает.
     
    P.S. пришлось чуть-чуть подправить батник, ото прямая команда  
    RD /s /q .  
    в случае не нахождения пути (из предыдущей команды)  
    PushD \\192.168.1.12\d$\student
    (например сеть временно отсоединена, или из за чего-то еще)  
    удаляет сам себя и все файлы которые находятся вместе с ним в одной директории. хохма

    Всего записей: 5 | Зарегистр. 31-12-2006 | Отправлено: 19:24 07-04-2008
    igor_andreev

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

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

    Почитай две предыдущие страницы этого топика хотя бы. После pushd желательно делать проверку кода возврата, если pushd отработало удачно, он будет равен нулю.

    Код:

    pushd \\server\share
    if not errorlevel 1 тут твоя команда


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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не подскажите как из комстроки найти на диске по имени файлы и заменить их на другие файлы (заранее заготовленные)?

    Всего записей: 242 | Зарегистр. 12-10-2004 | Отправлено: 07:34 08-04-2008
    king_stiven

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

    Код:
    FOR /R %c IN ("имя файла.*") DO (
        del %c
        xcopy "нужный файл" "%~dpc"
    )

     
    или

    Код:
    for /f "usebackq tokens=*" %c in (`dir "имя файла.*" /b /s /a:-d`) do (
        del %c
        xcopy "нужный файл" "%~dpc"
    )

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 09:32 08-04-2008 | Исправлено: king_stiven, 09:34 08-04-2008
    ja_ja

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

    Всего записей: 5 | Зарегистр. 31-12-2006 | Отправлено: 10:29 08-04-2008
    ZloyBehemoth



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

    Цитата:
    Код:
    FOR /R %c IN ("имя файла.*") DO (  
        del %c  
        xcopy "нужный файл" "%~dpc"  
    )  

     
    Не получается. Говорит "непредвиденное появление IN".
    После того как заменил % на %% батник заработал, но "нужный файл" копируется во все директории, вне зависимости был там "имя файла.*" или нет.

    Всего записей: 242 | Зарегистр. 12-10-2004 | Отправлено: 11:57 08-04-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZloyBehemoth
    поставь в конец батника pause, запусти батник, скопируй и выложи здесь. Попробуй 2 пример.

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 14:54 08-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