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

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



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

    Цитата:
    мне нужно только имя каталога без пути


    Код:
    Set xx=%~dp0
    FOR /F "usebackq delims=" %%i IN ('%xx:~0,-1%') DO Set Name=%%~nxi
    Echo %name%


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:03 22-08-2009
    Kirillhome



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

    Цитата:
    например файл d:\DWL-2100AP\Drivers\NAME\3.jpg находится в каталоге с именем NAME вот его мне и надо заполучить

    Ну тогда, к примеру, так:

    Код:
     
    @echo off
    set ful_path=%~dp0%
    set new_path=%ful_path:~0,-1%
    if "%new_path:~-1%"==":" (
       set last_cat=%new_path%
       set last_sim=\
       set cat=\%new_path%)
    :start
    if not defined last_cat set last_sim=%new_path:~-1%
    if not defined last_cat set cat=%last_sim%%cat%
    if not defined last_cat set new_path=%new_path:~0,-1%
    if "%last_sim%" NEQ "\" goto :start
    set cat=%cat:~1%
     
     
    echo %cat%
     

    возвращает последний каталог или букву диска с двоеточием
     
    Опс, не увидел, что NIKZZZZ опередил с более красивым вариантом...

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 13:38 22-08-2009 | Исправлено: Kirillhome, 13:59 22-08-2009
    Unitaz



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

    Всего записей: 2296 | Зарегистр. 28-06-2002 | Отправлено: 15:10 22-08-2009
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kirillhome
    Извиняюсь, ответить сразу не мог. На даче только мобила

    Цитата:
    т.е. посылаем в parse, заменяем табуляцию на спецсимвол, сдвоенный спецсимвол - разделям, потом пытался заменить двойную кавычку на одинарную - не сработало, дальше просто через echo смотрю что получается.  

     
    Я так понимаю, что нужны 9, 10 и 12 поля (из book.txt):

    Код:
     
    @echo off  
    setlocal
    chcp 1251 1>nul
     
    for /f "tokens=*" %%i in (book.txt) do set str=%%i && call:parse
    chcp 866 1>nul
    goto:eof
     
    :parse
     
    :: Убиваем кавычки
    set str=%str:"=%
     
    :: Табуляцию заменяем на "/" (Возможно это лишнее)  
    set str=%str:<tab>=/%
     
    :: Заполняем пустое поле, если оно есть.
    set str=%str://=/fake/%
     
    for /f "tokens=9,10,12 delims=/" %%i in ("%str%") do (
        echo %%i
        echo %%j
        echo %%k
        echo.
    )
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 13:51 23-08-2009 | Исправлено: 01MDM, 13:56 23-08-2009
    manstopper



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребята, подскажите, реально ли автоматизировать такую задачу?
     
    Сразу скажу, что нужно это для изготовления репаков игрушек. Иногда не лезет на диск и приходится удалять видео, но не всегда игры работают после физического удаления файлов. Приходится совать 1-секундные пустышки с черным полем, закодированные нужным кодеком.
     
    Есть файл aburvalg.ogm, который нужно продублировать N раз в одну папку и переименовать эти копии в соответствии со списком из текстового файла (список имен файлов в текстовике уже получен).

    Всего записей: 76 | Зарегистр. 17-12-2005 | Отправлено: 17:09 23-08-2009
    01MDM



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

    Цитата:
    Есть файл aburvalg.ogm, который нужно продублировать N раз в одну папку и переименовать эти копии в соответствии со списком из текстового файла (список имен файлов в текстовике уже получен).


    Код:
     
    @echo off
    for /f "tokens=*" %%i in (list.txt) do copy "From\aburvalg.ogm" "To\%%i"
     

    В list.txt построчный список файлов.

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 17:51 23-08-2009
    manstopper



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

    Всего записей: 76 | Зарегистр. 17-12-2005 | Отправлено: 21:11 23-08-2009
    Kirillhome



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

    Цитата:
    Kirillhome
    Извиняюсь, ответить сразу не мог. На даче только мобила
     

    Цитата:
    т.е. посылаем в parse, заменяем табуляцию на спецсимвол, сдвоенный спецсимвол - разделям, потом пытался заменить двойную кавычку на одинарную - не сработало, дальше просто через echo смотрю что получается.  

    На самом деле не получается, строки содержат всю "гадость", какую только можно:
    двойные кавычки (") (в количестве от одной до 8), одинарные кавычки ('), амперсанд (&), восклицательный знак (!), знаки больше (>) и меньше (<).
    Боюсь, в данном случае, не сделав ещё один файл, в котором будет произведена замена <tab><tab> на <tab>что-либо<tab> - не разобрать...

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 21:25 23-08-2009
    01MDM



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

    Цитата:
    На самом деле не получается, строки содержат всю "гадость", какую только можно

    Я исходил только из твоего файла. Он обрабатывается корректно. Если взять все токены и пронумеровать, то на выходе:

    Цитата:
     
    01:3
    02:6
    03:Великие некроманты и обыкновенные чародеи
    04:RU
    05:3655
    06:0
    07:0
    08:Маслова, Наталья
    09:ru\_\_древнее\_Европа\
    10:Великие некроманты и обыкновенные чародеи.fb2
    11:355121
    12:147948
    13:18.05.2008 23:19:41
     
    01:7
    02:6
    03:Из персидско-таджикской поэзии
    04:RU
    05:3656
    06:0
    07:0
    08:fake
    09:ru\_\_древнее\_Восток\
    10:Из персидско-таджикской поэзии.fb2
    11:20405
    12:6589
    13:18.05.2008 23:19:46
     
    01:75472
    02:15523
    03:Деяния апостолов
    04:RU
    05:2822
    06:4
    07:0
    08:, Издательство Источник жизни
    09:ru\_\_религия\_христианство\Уайт Елена\
    10:Уайт 4 Деяния апостолов.fb2
    11:1472240
    12:382114
    13:04.07.2008 22:07:25
     
    01:75473
    02:15523
    03:Христос - Надежда мира
    04:RU
    05:2822
    06:3
    07:0
    08:, Издательство Источник жизни, Издательство Источник жизни
    09:ru\_\_религия\_христианство\Уайт Елена\
    10:Уайт 3 Христос - Надежда мира.fb2
    11:2775661
    12:709827
    13:04.07.2008 22:07:32
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 22:18 23-08-2009
    Alukardd



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

    Цитата:
    а алгоритм примерно такой  
    for /f "tokens=1,2,3 delims=." %%a in ("%data%") do (  
        if "%%a" LEQ "00" set not_data=1  
        if "%%a" GTR "31" set not_data=1  
             ...  
        if not defined not_data echo %data%  
    )

    спс пока еще не затестил... если не сложно можно паручку коментов? и вопросики еще есть по коду...
    переменная "а" по очереди будет принимать значения дня месяца и года? или же пременная "а" - день, а далше по умолчанию создадутся еще 2 перемнные "b" и "c" для месяца и дня? если так то время жизни этих переменных внутри тела цикла или они будут доступны до окончания работы исполняемого файла?
     
    перемнные со следующими именами в цикле типа b c d...z они создаются в момент требования? тоесть до этого они "not defined"???
     
    по поводу проверки целочисленности переменных появились свои мысли, если удасться и будет интересно могу выложить.

    Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 22:38 23-08-2009 | Исправлено: Alukardd, 22:42 23-08-2009
    Kirillhome



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

    Цитата:
    Я исходил только из твоего файла.

    На самом деле он порядка 88'000строк....
    вот пример с ... "плохими" строками (а вот полный файл (размер в архиве - 2,5Мб))
     
     

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 22:46 23-08-2009
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kirillhome
    Конечно не проверял на 88.000 строк (может просто зависнуть), но  

    Цитата:
    вот пример с ... "плохими" строками

    нормально разбил строки по полям:

    Код:
     
    @echo off  
    1>nul (
        chcp 1251
        copy /y book.txt book.tmp
        gsar -o -s"(" -r"^("      book.tmp
        gsar -o -s")" -r"^)"      book.tmp
        gsar -o -s"&" -r"^&"      book.tmp
        gsar -o -s"    " -r"/"       book.tmp
        gsar -o -s"//" -r"/fake/" book.tmp
        gsar -o -s"""  -r""       book.tmp
    )
     
    for /f "tokens=1-13 delims=/" %%a in (book.tmp) do (
        1>>result.txt (
        echo 01:%%a
        echo 02:%%b
        echo 03:%%c
        echo 04:%%d
        echo 05:%%e
        echo 06:%%f
        echo 07:%%g
        echo 08:%%h
        echo 09:%%i
        echo 10:%%j
        echo 11:%%k
        echo 12:%%l
        echo 13:%%m
        echo.
        )
    )
    del book.tmp
     
    1>nul (
        gsar -o -s"^(" -r"("      result.txt
        gsar -o -s"^)" -r")"      result.txt
        gsar -o -s"^&" -r"&"      result.txt
        chcp 866
    )
     

    Правда при помощи gsar.
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 10:02 24-08-2009
    guru431

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

    Цитата:
    Есть маленькая задача - переименовать компы в AD.  
     
    Есть список с именами компов вида:  
    имя_компа=новое_имя_компа  
     
    Есть батник на переименование:  
    set ComputerName=  
    set NewComputerName=  
    set DomainUserUPN=user  
    set DomainUserPasswd=password  
    netdom renamecomputer %ComputerName% /newname:%NewComputerName% /userd:%DomainUserUPN% /passwordd:%DomainUserPasswd% /force /reboot:60  
     
    Как сделать цикл, который переименует все компы из списка (ну и желательно напишет лог)?

    Неужели для вас это такая сложная задача?
     
    я вижу этот цикл так:
    для каждой строчки в файле выполнять команду:
    netdom renamecomputer [символы до знака "=" в n-строке] /newname:[символы после знака "=" в n-строке] /userd:%DomainUserUPN% /passwordd:%DomainUserPasswd% /force /reboot:60
     
    Так можно ли это осуществить?

    Всего записей: 67 | Зарегистр. 28-02-2007 | Отправлено: 11:03 24-08-2009
    01MDM



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

    Цитата:
    Есть маленькая задача - переименовать компы в AD.

    Наверное многие, как и я, далеки от админства.

    Цитата:
    Есть список с именами компов вида:  
    имя_компа=новое_имя_компа  

     
    Попробуй такой вариант:

    Код:
     
    @echo off
    setlocal
     
    set DomainUserUPN=user  
    set DomainUserPasswd=password
     
    for /f "tokens=1,2 delims==" %%i in (list.txt) do (
         netdom renamecomputer "%%i" /newname:"%%j" /userd:%DomainUserUPN% /passwordd:%DomainUserPasswd% /force /reboot:60
    )
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 12:25 24-08-2009
    guru431

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

    Цитата:
     
    @echo off  
    setlocal  
     
    set DomainUserUPN=user    
    set DomainUserPasswd=password  
     
    for /f "tokens=1,2 delims==" %%i in (list.txt) do (  
         netdom renamecomputer "%%i" /newname:"%%j" /userd:%DomainUserUPN% /passwordd:%DomainUserPasswd% /force /reboot:60  
    )  
     

     
    Спасибо! То, что надо!
    Только для информативности кое-что добавил:
     
    for /f "tokens=1,2 delims==" %%i in (list.txt) do (
         echo Rename %%i to %%j && netdom renamecomputer %%i /newname:%%j /userd:%DomainUserUPN% /passwordd:%DomainUserPasswd% /force /reboot:60
    )
     
    Как теперь к этому добавить логирование? Чтобы все события писались в txt.

    Всего записей: 67 | Зарегистр. 28-02-2007 | Отправлено: 17:25 24-08-2009
    NIKZZZZ



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

    Цитата:
    Чтобы все события писались в txt.

     

    Код:
    echo. 2>log.txt
    for /f "tokens=1,2 delims==" %%i in (list.txt) do (
     echo Rename %%i to %%j>>log.txt
     netdom renamecomputer %%i /newname:%%j /userd:%DomainUserUPN% /passwordd:%DomainUserPasswd% /force /reboot:60
    )

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 17:32 24-08-2009
    guru431

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

    Цитата:
    echo. 2>log.txt  
    for /f "tokens=1,2 delims==" %%i in (list.txt) do (  
     echo Rename %%i to %%j>>log.txt  
     netdom renamecomputer %%i /newname:%%j /userd:%DomainUserUPN% /passwordd:%DomainUserPasswd% /force /reboot:60  
    )

    Мне нужно вот так:

    Код:
    for /f "tokens=1,2 delims==" %%i in (list.txt) do (  
     echo Rename %%i to %%j &&  
     netdom renamecomputer %%i /newname:%%j /userd:%DomainUserUPN% /passwordd:%DomainUserPasswd% /force /reboot:60  
    )>>log.txt

     
    А можно сделать так, чтобы информация одновременно выводилась и на экран и в файл?

    Всего записей: 67 | Зарегистр. 28-02-2007 | Отправлено: 18:16 24-08-2009 | Исправлено: guru431, 18:19 24-08-2009
    NIKZZZZ



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

    Цитата:
    А можно сделать так, чтобы информация одновременно выводилась и на экран и в файл?

    Только с помощью сторонней утилиты, посмотри в шапке.
    Либо просто в конце добавить
    Type log.txt
     
     
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 18:43 24-08-2009
    oshizelly



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имеется совсем простой bat-файл из одной строки, запускающий внешнее приложение, типа:
    tralala.exe /k/c
     
    Подскажите, как сделать, чтобы:
    1) окно command shell не выводилось на передний план или вообще не создавалось.
    2) окно command shell закрывалось само после исполнения команды (запуска приложения tralala).
     
    Спасибо!
     
    З.Ы.
    Стыдно задавать детский вопрос, но что-то никак не могу сам найти ответа в документации

    Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 19:21 24-08-2009 | Исправлено: oshizelly, 19:22 24-08-2009
    Nuts2002

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

    Цитата:
    1) окно command shell не выводилось на передний план или вообще не создавалось.

    Нужно в начале файла написать echo off.

    Всего записей: 487 | Зарегистр. 13-03-2007 | Отправлено: 20:35 24-08-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