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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите возможно ли создать постоянную переменную ?
    Например %test% со значение 0
    При каждом запуске изменять ее значение с сохранением измененного значения?
    Примерно так  

    Код:
    set "test=%test% + 1"
     
    И чем заменить start вот примерно в таком цикле?

    Код:
    For /F %%a in (1.txt) do (
    start /i /wait %%a>Nul  
    )

    И нужно ли что-то или и так все будет работать ?
     

    Код:
    For /F %%a in (1.txt) do (
    %%a
    )

     
    П.С в txt записаны командные строки которые надо просто выполнить!

    Всего записей: 56 | Зарегистр. 14-07-2008 | Отправлено: 13:46 21-02-2009 | Исправлено: ponand, 15:14 21-02-2009
    Maza_Faka



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

    Цитата:
    При каждом запуске изменять ее значение с сохранением измененного значения?

    Писать в файл или в реестр, иначе никак.
     

    Цитата:
    И чем заменить start вот примерно в таком цикле?

    Если нужно дождаться завершения каждой команды, то - ничем.

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 15:42 21-02-2009
    ponand

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

    Цитата:
    Писать в файл или в реестр, иначе никак.
     

    a можно по подробнее как записать и как потом присвоить
    вот так у меня получилось в файл и из него

    Код:
    rem из файла
    set /p test=<test.txt
    rem в файл
    set /a test=%test%+1
    echo %test% >test.txt

     
    так правильно?
    Или както по другому надо было ?

    Цитата:
    Если нужно дождаться завершения каждой команды, то - ничем.
     

    а если не нужно тогда нужно ли чтото писать вместо start ?

    Всего записей: 56 | Зарегистр. 14-07-2008 | Отправлено: 16:38 21-02-2009 | Исправлено: ponand, 04:06 22-02-2009
    ikif



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте.
    Помогите с проблемой.
    Есть папка в которой находятся много папок (около 20), в половине из которых находиться один файл (эти файлы называются одинаково, но их содержимое различно), другая половина папок пустые.
    Надо создать новую папку, и в неё перенести все эти файлы по папкам , которые будут называться (папки) 1, 2, 3 , ... , числами в порядке возростания.
    После надо удалить оригинальную папку.
     
     
    Заранее благодарен.
     
    Добавлено:
    Здравствуйте.
    Помогите с проблемой.
    Есть папка в которой находятся много папок (около 20), в половине из которых находиться один файл (эти файлы называются одинаково, но их содержимое различно), другая половина папок пустые.
    Надо создать новую папку, и в неё перенести все эти файлы по папкам , которые будут называться (папки) 1, 2, 3 , ... , числами в порядке возростания.
    После надо удалить оригинальную папку.
     
     
    Заранее благодарен.

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ponand
    в этом деле поможет Команда SETX
     
    Синтаксис для режима реестра имеет вид:
    SETX переменная -К корневой_ключ\ключ\ . . . \переменная [-М]
     
    Синтаксис для файлового режима имеет вид:
    SETX переменная -F имя_файла {-A x,y|-R x,y "строка"} [-D d] [-X] [-М]

    Всего записей: 93 | Зарегистр. 21-02-2009 | Отправлено: 04:06 22-02-2009
    Maza_Faka



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

    Цитата:
    Помогите с проблемой

    Попробуй так:

    Код:
     
    @Echo Off
     
    Set SourceDir=c:\MyFolder
    Set DestDir=C:\
    Set Prefix=0
     
    For /R %SourceDir% %%A In (*.*) Do Call :_MoveProc "%%A"
    GoTo :EOF
     
    :_MoveProc
    Set /A Prefix+=1
    MD %DestDir%%Prefix%>Nul 2>&1
    Move %1 %DestDir%%Prefix%
     

     
    Arch1S

    Цитата:
    в этом деле поможет Команда SETX

    И чем этот способ отличается от

    Цитата:
    Писать в файл или в реестр

    ?
    Описание утилиты setx
    Как следует из описания, она просто создаёт значение в реестре, в ключе переменных окружения, что можно сделать исключительно штатными средствами

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 06:55 22-02-2009
    ikif



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

    Цитата:
    Код:  
    @Echo Off  
     
    Set SourceDir=c:\MyFolder  
    Set DestDir=C:\  
    Set Prefix=0  
     
    For /R %SourceDir% %%A In (*.*) Do Call :_MoveProc "%%A"  
    GoTo :EOF  
     
    :_MoveProc  
    Set /A Prefix+=1  
    MD %DestDir%%Prefix%>Nul 2>&1  
    Move %1 %DestDir%%Prefix%  

     
    Спасибо большое, работает.
    Не понятно только роль DestDir , так как при изменении , кримеру на c:\DistDir2, то папки всё равно создаются на С:\ и имеют название DistDir21, DistDir22, DistDir2.....
     
     
    Добавлено:

    Цитата:
    Спасибо большое, работает.  
    Не понятно только роль DestDir , так как при изменении , кримеру на c:\DistDir2, то папки всё равно создаются на С:\ и имеют название DistDir21, DistDir22, DistDir2.....  

     
    Решено , поставил \ между %DestDir%%Prefix%.
     
    Скажите, пожалуйста, что делает >NUL в нашем случае?
     
    И  какая роль  у 2>&1 в строчке MD %DestDir%%Prefix%>Nul 2>&1 ?

    Всего записей: 164 | Зарегистр. 09-12-2006 | Отправлено: 20:59 22-02-2009 | Исправлено: ikif, 21:26 22-02-2009
    ponand

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

    Цитата:
    Решено, поставил \ между %DestDir%%Prefix%.
     
     
    лучше так
    set DestDir=C:\DistDir2\
    тогда между  
    %DestDir%%Prefix% ничего ставить не нужно

    Цитата:
    Скажите, пожалуйста, что делает 2>&1 ?
     

    2>&1 перенаправляет поток вывода ошибок в стандартный поток вывода

    Цитата:
    Скажите, пожалуйста, что делает >NUL в нашем случае?
     

    все стандартные сообщения отправляем в Nul (никуда)

    Всего записей: 56 | Зарегистр. 14-07-2008 | Отправлено: 22:06 22-02-2009 | Исправлено: ponand, 22:18 22-02-2009
    ikif



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Получается, что стандартные ошибки направляем в некуда, а после этого перенаправляет поток вывода ошибок в стандартный поток вывода.
     
    Не очень понимаю , дайте пожалуйста очеведный пример, работы  >NUL 2>&1 .
    Пробовал создать ошибку (перенести открытый файл), никакой разницы ни с >NUL 2>&1 ,ни без.

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

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

    Цитата:
    Пробовал создать ошибку (перенести открытый файл), никакой разницы ни с >NUL 2>&1,ни без.
     


    Код:
    MD %DestDir%%Prefix%>Nul 2>&1
     

    MD  создает папки или подпапки  
    set DestDir=?:\DistDir2\
    вместо вопроса укажи диск которого не существует получиш 1 сообщение  
    на каждый файл
    Отказано в доступе.
    убери >Nul 2>&1 и получиш по 2 сообщение  
    на каждый файл
    1 от команды MD 2 от команды Move

    Всего записей: 56 | Зарегистр. 14-07-2008 | Отправлено: 00:24 23-02-2009 | Исправлено: ponand, 00:58 23-02-2009
    Maza_Faka



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

    Цитата:
    Не понятно только роль DestDir , так как при изменении , кримеру на c:\DistDir2, то папки всё равно создаются на С:\ и имеют название DistDir21, DistDir22, DistDir2

    Вопрос звучал так:


    Цитата:
     
    Надо создать новую папку, и в неё перенести все эти файлы по папкам , которые будут называться (папки) 1, 2, 3 , ... , числами в порядке возростания.
     


    Что конкретно не устраивает?

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 07:15 23-02-2009
    Serhiy123



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Прошу помощи клуба вот в каком вопросе.
     
    Разрабатываю антивирусный скрипт для защиты флешки от autorun-вирусов.
    Принцип его действия заключается в следующем: он стирает на флешке вредоносный файл autorun.inf (если он там присутствует), и создает одноименный каталог AUNORUN.INF, внутри которого создает подкаталог с некорректным именем LPT3 - таким образом удалить каталог обычными способами нельзя. Сейчас же появились вирусы, которые, не имея возможности удалить каталог AUNORUN.INF, переименовывают его, после чего записывают таки на флешку свой зараженный файл autorun.inf.
     
    Просто создавать каждый раз заново каталог AUNORUN.INF не имеет смысла - т.к. флешка будет загажена неудаляемыми каталогами с подозрительными именами.
     
    Фрагмент скрипта, который призван восстанавливать защиту, должен делать следующее: будучи запущенным из корня флешки, он перебирает все каталоги в поисках подкаталога LPT3, а найдя его, переименовывает каталог, в котором тот содержится, в AUTORUN.INF
     
    У меня этот код выглядит вот так:
     

    Код:
     
    @echo off
    for /R %%J in (.) do (
    echo %%J | find /i "LPT3" > 1.txt && goto Founded
    )
     
    :Founded
    set /p NAMEOFDIR=< 1.txt
    set NAMEOFDIR=%NAMEOFDIR:~3,-8%
    echo %NAMEOFDIR%
    del 1.txt
    ren %NAMEOFDIR% AUTORUN.INF
     
     
     
    Задачу свою этот код успешно выполняет, но мне не нравится использование промежуточного файла 1.txt для передачи найденного пути.  
     
    Можно ли переписать код более рационально, без использования файла 1.txt ?

    Всего записей: 126 | Зарегистр. 05-09-2002 | Отправлено: 12:00 23-02-2009 | Исправлено: Serhiy123, 12:04 23-02-2009
    koderr



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

    ----------
    The truth is out there...

    Всего записей: 353 | Зарегистр. 22-06-2005 | Отправлено: 13:21 23-02-2009
    Maza_Faka



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

    Цитата:
    Можно ли использовать конвейер (|) в скобках команды for?

    Можно, используй escape-символ перед конвеером ^|
     
    Добавлено:
    Serhiy123
    Попробуй так:

    Код:
     
    @Echo Off
     
    for /R %%J in (.) do (
    echo %%J | find /i "LPT3">Nul && Call :Founded "%%J"
    )
     
    :Founded
    set NAMEOFDIR=%1
    set NAMEOFDIR=%NAMEOFDIR:~3,-8%
    echo %NAMEOFDIR%
    ren %NAMEOFDIR% AUTORUN.INF
    Exit /B
     

    Не тестировано!

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 14:03 23-02-2009
    ikif



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

    Цитата:
    Вопрос звучал так:  
     
     
    Цитата:  
    Надо создать новую папку, и в неё перенести все эти файлы по папкам , которые будут называться (папки) 1, 2, 3 , ... , числами в порядке возростания.  
     
     
     
    Что конкретно не устраивает?  

     
    Я немного непонимал код, ponand обьяснил мне.
    Ребята, меня всё устраивает , даже очень.  
    Большое спасибо.

    Всего записей: 164 | Зарегистр. 09-12-2006 | Отправлено: 14:38 23-02-2009
    Serhiy123



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

    Код:
     
     @Echo Off
     
    for /R %%J in (.) do (
    echo %%J | find /i "LPT3">Nul && Call :Founded "%%J"
    )
     
    :Founded
    set NAMEOFDIR=%1
    set NAMEOFDIR=%NAMEOFDIR:~3,-8%
    echo %NAMEOFDIR%
    ren %NAMEOFDIR% AUTORUN.INF
    Exit /B  
     

     
    Потестил - имя переменной теперь передается!  На практике пришлось подправить %NAMEOFDIR:~3,-8% на %NAMEOFDIR:~4,-8% (добавились кавычки).  
     
    Но сам ren теперь не работает:  
     

    Код:
     
    ren AUTORUN.INF_ AUTORUN.INF
    The process cannot access the file because it is being used by another process.
     
     
     
    и EXIT /B не прерывает процесс - идет далее перебор каталогов. Хотя по логике вещей должен.

    Всего записей: 126 | Зарегистр. 05-09-2002 | Отправлено: 15:06 23-02-2009
    AleksejTokarev



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте мозги Ru.Board!
     
    Порылся я в этой теме и не нашол ответ на мой вопрос, может потомучто плохо искал или потомучто в ЭТОЙ ТЕМЕ 6 ЧАСТЕЙ
     
    А вопрос у меня такой: я передаю в БАТ файл полный адресс к другому файлу и хочу с помощью БАТ выдернуть из этого пути толко нужную мне инфу, к примеру полный путь выглядит так : D:\Programmierung\JAVA\test\HalloTester.java
    вот из него то мне и нужно выдернуть последнюю директорию, в данном случае test
    и имя файла но без расширения, в данном случае HalloTester
     
    Помогите мне пожалуйста, срочно надо а помощи больше не откуда получить кроме как Ru.Board так как google тут совсем не рулит
     
    Спасибо за рание!!!

    Всего записей: 171 | Зарегистр. 17-04-2007 | Отправлено: 15:59 23-02-2009
    king_stiven

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

    Код:
    for %%e in (D:\Programmierung\JAVA\test\HalloTester.java) do (
        echo %%~ne
        cd /d %%~dpe
    )
    for %%f in (%cd%) do echo %%~nf
    pause

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 16:36 23-02-2009
    AleksejTokarev



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
     
    Вы немогли бы мне объеснит принцип работы этого кода, как он это отделил???

    Всего записей: 171 | Зарегистр. 17-04-2007 | Отправлено: 16:52 23-02-2009 | Исправлено: AleksejTokarev, 16:52 23-02-2009
    19w85



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

    Код:
    for %%e in (D:\Programmierung\JAVA\test\HalloTester.java) do (  
        echo %%~ne  
        cd /d %%~dpe  
    )

    А зачем такая сложная конструкция для выделения одного имени файла без расширения из передаваемого полного пути? когда достаточно:

    Код:
    %~n1

     
    А вот за это:

    Код:
    for %%f in (%cd%) do echo %%~nf

    спасибо (я как раз сюда зашел, чтобы узнать как вытащить только имя каталога ):

    Всего записей: 623 | Зарегистр. 20-12-2005 | Отправлено: 20:02 23-02-2009 | Исправлено: 19w85, 20:03 23-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