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

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

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

vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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-файлах (часть 1)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 16:59 14-11-2006 | Исправлено: Elroir, 04:30 26-04-2007
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    А вы его с evgeni666 собственно почти и воспроизвели на этой странице, ход мыслей тот же
    Мне почему-то правда в голову не пришло  
    for /f "tokens=1,2" %%a in ("%date%") do (  
    if "%%b"=="" set show_day_of_week=no  
    )
    я в том батнике проверял, является ли первый знак от DATE /T цифрой...

    Всего записей: 1668 | Зарегистр. 08-12-2004 | Отправлено: 12:13 25-01-2007
    evgeni666



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вычислил, когда есть день недели, а когда нет.
    Если формат представления дня 'd' - то дата выводится без лидирующего нуля, но с выводом дня недели (причем в документации этого нет).
    Вот кусочек из хелпа по этому поводу.
     
    Отображение чисел без вывода нулей в начале числа | Введите один символ. Введите d для указания дня, y — для года и M — для месяца  
    Вывод нулей в начале чисел, состоящих из одной цифры | Введите два символа. Введите dd для указания дня, yy — для года и MM — для месяца  
    Вывод двух последних цифр года  | Введите yy для указания года  
    Вывод четырех цифр года | Введите yyyy для указания года  
    Вывод сокращений дня недели или месяца | Введите три символа. Введите ddd для указания дня и MMM  — для указания месяца  
    Вывод полного названия дня недели или месяца | Введите четыре символа. Введите dddd для указания дня и MMMM  — для указания месяца  
    Вывод дополнительного текста Заключите текст в апострофы (')  

    Всего записей: 367 | Зарегистр. 22-12-2005 | Отправлено: 12:32 25-01-2007
    Elroir



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

    Цитата:
    Вычислил, когда есть день недели, а когда нет.

    То есть теперь надо перебрать все варианты d,m,y как в коде igor_andreev-а и, в зависимости от того, какой вариант совпадает с sShortDate, вытащить дату.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 12:51 25-01-2007
    evgeni666



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igor_andreev
    Твой батник заточен под использование стандартных значений представления короткой даты. Это как раз и есть 98% стандартного использования, но все одно - не универсально
     
    Если свободное время будет, то попробую сегодня нарисовать универсальную процедуру вычисления даты.
     
    PS. Попутно процедура
    for /f "tokens=1,2" %%a in ("%date%") do if "%%b"=="" (set mydate=%%a) else (set mydate=%%b)
    вычищает дату от дня недели. на выходе остоется только дата.
     
    Добавлено:
    Elroir
    не надо перебирать варианты. а уже имею в виде отдельных переменных дату, месяц, день и их форматы - надо только сопоставить их. Код получится более универсальным.

    Всего записей: 367 | Зарегистр. 22-12-2005 | Отправлено: 12:52 25-01-2007
    Elroir



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

    Цитата:
    Код получится более универсальным.

    ОК. Только нельзя использовать утилиту "reg.exe". В стандартной поставке Win2000, ее нет.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 13:08 25-01-2007
    igor_andreev

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

    Цитата:
    Если формат представления дня 'd' - то дата выводится без лидирующего нуля, но с выводом дня недели (причем в документации этого нет).

    О спасибо, не знал этого.

    Цитата:
    Твой батник заточен под использование стандартных значений представления короткой даты. Это как раз и есть 98% стандартного использования, но все одно - не универсально

    А оставшиеся 2% - если уж изменили вывод даты, то знают зачем это сделали, не задают на форумах вопросов типа "как мне создать папку с названием сегодняшней даты" и наверняка сами смогут вывести в батнике или скрипте удобоваримую для себя форму записи даты

    Всего записей: 1668 | Зарегистр. 08-12-2004 | Отправлено: 13:24 25-01-2007
    evgeni666



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

    Цитата:
    ОК. Только нельзя использовать утилиту "reg.exe". В стандартной поставке Win2000, ее нет.

    От блин, забыл про это. Фикня вопрос - выгрузим ветку реестра во временный файл
     
    А вот и готовое решение
     
    Получаем текущую дату в независимости от региональных настроек.
    Работает для XP и выше.
     

    Цитата:
     
    for /f "skip=2 tokens=2*" %%i in ('reg QUERY "HKCU\Control Panel\International" /v sDate') do set sdate=%%j  
    for /f "skip=2 tokens=2*" %%i in ('reg QUERY "HKCU\Control Panel\International" /v sShortDate') do set sshortdate=%%j  
    for /f "delims=%sdate% tokens=1,2,3" %%i in ("%sShortDate%") do set /a f1=%%i & set /a f2=%%j & set /a f3=%%k
    for /f "tokens=1,2" %%i in ("%date%") do if "%%j"=="" (set mydate=%%i) else (set mydate=%%j)
    for /f "delims=%sdate% tokens=1,2,3" %%i in ("%mydate%") do set d1=%%i & set d2=%%j & set d3=%%k
    if "%f1%"=="yy" if %d1% GEQ 30 (set d1=19%d1%) else (set d1=20%d1%)
    if "%f1%"=="y" if %d1% GEQ 30 (set d1=19%d1%) else if %d1% GEQ 10 (set d1=20%d1%) else (set d1=200%d1%)
    if "%f2%"=="yy" if %d2% GEQ 30 (set d2=19%d2%) else (set d2=20%d2%)
    if "%f2%"=="y" if %d2% GEQ 30 (set d2=19%d2%) else if %d2% GEQ 10 (set d2=20%d2%) else (set d2=200%d2%)
    if "%f3%"=="yy" if %d3% GEQ 30 (set d3=19%d3%) else (set d3=20%d3%)
    if "%f3%"=="y" if %d3% GEQ 30 (set d3=19%d3%) else if %d3% GEQ 10 (set d3=20%d3%) else (set d3=20%d3%)
    if "%f1:~0,1%"=="y" (set year=%d1%) else if "%f2:~0,1%"=="y" (set year=%d2%) else if "%f3:~0,1%"=="y" (set year=%d3%)
    if "%f1:~0,1%"=="M" (set month=%d1%) else if "%f2:~0,1%"=="M" (set month=%d2%) else if "%f3:~0,1%"=="M" (set month=%d3%)
    if "%f1:~0,1%"=="d" (set day=%d1%) else if "%f2:~0,1%"=="d" (set day=%d2%) else if "%f3:~0,1%"=="d" (set day=%d3%)
     
    echo %year%
    echo %month%
    echo %day%
     

     
    PS. Код для 2000-го будет чуть позже.

    Всего записей: 367 | Зарегистр. 22-12-2005 | Отправлено: 13:35 25-01-2007 | Исправлено: evgeni666, 15:14 25-01-2007
    regular



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Скажите, пожалуйста, как можно в одном текстовом файле подменить слова согласно словарю в виде другого файла. Подменять нужно только те слова которые есть в этом словаре. Разделитель слов в словаре -вертикальная черта "|"

    Всего записей: 27 | Зарегистр. 02-11-2004 | Отправлено: 15:05 25-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    regular
    Я предположил, что каждая пара слов в словаре идет на отдельной строке. Иначе следующий код будет работать не верно.

    Код:
     
    @echo off
    setlocal
    set dictionary=dict.txt
    copy /y "%~1" "%~n1.bak">nul
     
    ::sbs2.com creation
    :: Create the assembler program, by Herbert Kleebauer  
    echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=> %temp%.\sbs2.com
    echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU!WvX0GwUY Wv;ovBX2Gv0ExGIuht6>> %temp%.\sbs2.com
    echo ?@}IKuNWpe~Fpe?FNHlF?wGMECIQqo{Ox{T?kPv@jeoSeIlRFD@{AyEKj@>> %temp%.\sbs2.com
    echo iqe~1NeAyR?mHAG~BGRgB{~H?o~TsdgCYqe?HR~upkpBG?~slJBCyA?@xA>> %temp%.\sbs2.com
    echo LZp{xq`Cs?H[C_vHDyB?Hos@QslFA@wQ~~x}viH}`LYNBGyA?@xAB?sUq`>> %temp%.\sbs2.com
    echo LRy@PwtCYQEuFK@A~BxPtDss@fFqjVmzD@qBEOEenU?`eHHeBCMs?FExep>> %temp%.\sbs2.com
    echo LHsPBGyA?@xAunjzA}EKNs@CA?wQpQpKLBHv?s`WJ`LRCYyIWMJaejCksl>> %temp%.\sbs2.com
    echo H[GyFGhHBwHZjjHeoFasuFUJeHeB?OsQH[xeHCPvqFj@oq@eNc?~}Nu??O>> %temp%.\sbs2.com
    echo ~oEwoAjBKs?Zp`LBzHQzyEFrAWAG{EFrAqAGYwHTECIQ{coKIsaCsf{Oe~>> %temp%.\sbs2.com
    echo CK}Ayre~CNFA{rAyEKFACrA{EKGAjbA}eKGSjNMtQFtc{OAyDGFj?{FDGQ>> %temp%.\sbs2.com
    echo KAjNVk_OCAx@e?f{o?CosI}1EGizhljJ~H1ZeG}JBA~rACBMDGjjDG@g0>> %temp%.\sbs2.com
     
    for /f "tokens=1,2 delims=^| " %%a in (%dictionary%) do (
    :: Use the program
    %temp%.\sbs2.com 0 "%%a" "%%b" < "%~1" > "tmp_%~1"
    copy /y "tmp_%~1" "%~1">nul
    del "tmp_%~1"
    )
    :: Delete the program  
    del %temp%.\sbs2.com
     

    Выделенное в коде имя файла, надо заменить на имя файла со словарем. Название файла в котором надо произвести замену, передается батнику в качестве аргумента командной строки. Перед началом работы сохраняется backup изменяемого файла. Запускать батник в той директорие, где находится словарь и изменяемый файл.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 16:43 25-01-2007
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    задача:
     
    есть папка folder и папка folder_ или folder__
    лежат они рядом
    необходимо следующее:
    1) при наличии папки folder_ переименовать папку folder в folder__ и папку folder_ в папку folder
    2) при наличии папки folder__ переименовать папку folder в folder_ и папку folder__ в папку folder
     
    делаю так
    Код:
    if exist folder__ (
    ren folder folder_
    ren folder__ folder
    )
     
    if exist folder_ (
    ren folder folder__
    ren folder_ folder
    )
    получаю только п. 1, а нужно пп. 1 и 2
    у кого есть какие-либо варианты решения?
     
    Добавлено:
    всем спасибо, разобрался сам
     

    Код:
    if exist folder_ (goto 1) else (goto 2)
     
    :1
    ren folder folder__ && ren folder_ folder & exit
     
    :2
    ren folder folder_ && ren folder__ folder & exit

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 17:31 25-01-2007 | Исправлено: Nagual, 17:58 25-01-2007
    Elroir



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

    Цитата:
    разобрался сам

    А я смотрю на код (первый) и не понимаю что ты делаешь - ты же их по кругу гонял

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 18:01 25-01-2007 | Исправлено: Elroir, 18:04 25-01-2007
    regular



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir,  
    с учетом, что у меня существует словарь "dict.txt" и сам файл для обработки "1.cvs"  опираясь на твою программу, свой скрипт "c:\repl.bat" я записал так:

    Код:
     
    @echo off
    setlocal
    set dictionary=c:\dict.txt
    copy /y "%~1" "%~n1.bak">nul
    for /f "tokens=1,2 delims=^| " %%a in (%dictionary%) do (
    :: Use the program
    c:\1.cvs 0 "%%a" "%%b" < "%~1" > "tmp_%~1"
    copy /y "tmp_%~1" "%~1">nul
    del "tmp_%~1"
    )
     

     
    При запуске получаю ошибки:
     

    Код:
     
    C:\>repl.bat
    The system cannot find the path specified.
    Could Not Find C:\tmp_
    The system cannot find the path specified.
    Could Not Find C:\tmp_
     
    C:\>
     

     
    что за путь "tmp_" ?
    И пожалуйста прокоментируйте строки -

    Цитата:
    %temp%.\sbs2.com 0 "%%a" "%%b" < "%~1" > "tmp_%~1"  
    copy /y "tmp_%~1" "%~1">nul  


    Всего записей: 27 | Зарегистр. 02-11-2004 | Отправлено: 18:48 25-01-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    regular
    Для замены слов в тексте, используется программка sbs2.com, которая создается самим батником в temp директорие, а после работы уничтожается.

    Код:
    %temp%.\sbs2.com 0 "%%a" "%%b" < "%~1" > "tmp_%~1"

    %temp%.\sbs2.com - запуск утилиты sbs2.com
    0 - изменять все нужные слова.
    "%%a" - слово из словаря, слева от черты (заменяемое слово).
    "%%b" - слово из словаря, справа от черты.
    < "%~1" - использовать входным потоком файл, переданный батнику аргументом.
    > "tmp_%~1" - использовать выходным потоком файл с тем же именем, что и входной, только с префиксом tmp_.
     
    P.S. Мне просто интересно, что по-твоему может делать строка "c:\1.cvs 0 "%%a" "%%b" < "%~1" > "tmp_%~1"?
     

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 21:11 25-01-2007
    regular



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sorry, Elroir
    Я думал sbs2.com, это тестовый файл в котором и будем делать замены...

    Всего записей: 27 | Зарегистр. 02-11-2004 | Отправлено: 00:59 26-01-2007
    Kac



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Суток доброе время!
    Еще буду рытся но пока не нашел.
    1. Необходимо изменить переменные окружения в Вин 2000 сервер и Вин 2003 сервер таким образом чтобы после перезагрузки они сохранились и сохранялись не только на текущий сеанс (приложение) а на все последующие открытые...
     
    Пример запускаю БАТник, в нем
    set VAR1=Bla-Bla
     
    set TMP=%systemdir%\TMP
    set TEMP=%systemdir%\TMP
     
    set path=c:\;%path%
     
    Не получилось никак сохранить это.. при открытии нового окна все переменные окружения старые не говоря уже о перезагрузки...
    Пытался даже батником в реестре менять
     
    Спасибо

    Всего записей: 41 | Зарегистр. 10-08-2004 | Отправлено: 06:11 26-01-2007
    ViSiToR



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

    Цитата:
    Необходимо изменить переменные окружения

    Для сохранения переменных используется реестер, если нужно создать постоянную переменную окружения, то нужно писать в реестер:
     
    Для добавления в Path...
     

    Код:
    Reg Add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "C:\;%Path%" /f

     
    Для другой переменно просто нужно изменить Path на имя которое будет назначено для переменной, а значение указать вместо C:\;%Path% - Т.е к примеру, нужно создать переменную с именем MyEnv, и со значением C:\progra~1\MyProgram, тогда строка бует выглядеть так:
     

    Код:
    Reg Add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment" /v MyEnv /t REG_SZ /d "C:\progra~1\MyProgram" /f

     
    Ключь /f можно опустить, он необходим для применения записи без запроса (подтверждения).

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 08:42 26-01-2007
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kac
    setenv.exe http://barnyard.syr.edu/~vefatica/#SETENV  
    editpath.exe(epath2.zip) http://internet.cybermesa.com/~bstewart/misctools.html
    setx.exe из любого набора Resource Kit для NT,2000,XP. Эта например http://download.microsoft.com/download/win2000platform/setx/1.00.0.1/nt5/en-us/setx_setup.exe

    Всего записей: 1668 | Зарегистр. 08-12-2004 | Отправлено: 08:44 26-01-2007 | Исправлено: igor_andreev, 08:53 26-01-2007
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Обновил шапку:
     
    В Полезные ссылки:
    Справка по командам в виде Html
     
    В Готовые решения и частые вопросы:
     
    Установка задержки (паузы) в батнике
    Создание (запись) переменных окружения в реестр
    Конвертирование файлов (*.com *.exe *.*) в код батника

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 09:13 26-01-2007
    freedom83

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    народ, ГОРЮ
    написал программу на дельфи которая перемещает файлы *.txt из одной папки в другую, если их дата не равна текущей. но шеф хочет чтобы был написан батник,  помогите кто чем может

    Всего записей: 100 | Зарегистр. 17-01-2006 | Отправлено: 10:52 26-01-2007
    evgeni666



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ViSiToR
    Тогда уж поправь пример вычисления предыдущей даты на более правильную
    Вот эту http://forum.ru-board.com/topic.cgi?forum=62&bm=1&topic=9040&start=647&limit=1

    Всего записей: 367 | Зарегистр. 22-12-2005 | Отправлено: 11:00 26-01-2007
       

    Страницы: 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-файлах 2
    vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru