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

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

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

vu1tur (14-11-2006 16:59): http://forum.ru-board.com/topic.cgi?forum=62&topic=9040  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

hacsoft

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задачи на bat-файлах
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки:
· Cmd. Описание от разработчиков
· Набор GNU утилит для win32
· Встроенный справочник по командам: hh ntcmds.chm
· Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· cmdow — изменение параметров и видимости дос-окна
· blat — отправка почты из консоли
 
Готовые решения и частые вопросы:
· Создание листинга директорий на примере создания плейлиста
· Разименовывание переменных
· Переименовывание файлов по дате создания
· Запуск сетевого подключения
· Запуск bat файлов как сервис
· Пример выполнения команд по результату команды ping
· Использование даты на день раньше чем сегодня
 
Невозможности — что нельзя сделать с помощью командных файлов:
· изменть конфигурацию IP на удаленной машине (без помощи rcmd.exe) [добавил ALEF]
 
 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Старая версия первого сообщения

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 22:58 18-11-2005 | Исправлено: Elroir, 05:50 11-11-2006
Smitis



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

Всего записей: 3177 | Зарегистр. 09-02-2003 | Отправлено: 10:14 06-12-2005
hacsoft

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

Цитата:
Маленькая задачка на сообразительность для всех    
Вывести из командного файла строку "OFF" (без кавычек).

Вот, что я смог сделать:
 
Способ 1:

Код:
@echo off
echo XXX > OFF
dir OFF /b
del OFF

 
Способ 2:

Код:
@prompt $s$h
@echo @prompt > OFF.bat
OFF

Остается побочный файл OFF.bat, не придумал, как его убрать без сообщений.
 
Способ 3-6:
Подглядев код igor_andreev, понял, что думал немного не в том направлении. И так, продолжу его рассуждения:

Код:
ECHO(OFF
ECHO=OFF
ECHO,OFF
ECHO:OFF

 
И того, мои 6 способов + 6 способов igor_andreev = 12 способов

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 12:21 06-12-2005
KapralBel



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

Цитата:
Остается побочный файл OFF.bat, не придумал, как его убрать без сообщений

Del off.bat /q

Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 12:28 06-12-2005
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
hacsoft
В способе 2 перед OFF лишний пробел выводиться.

Всего записей: 3177 | Зарегистр. 09-02-2003 | Отправлено: 13:00 06-12-2005
hacsoft

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Это опять проблема обработки псевдотега code на данном форуме, про которую я писал на 1 странице. Если удалить все пробелы в конце каждой строки (которые добавляются автоматически на этом форуме, не пойму зачем?), то все нормально.
 
KapralBel
Удалить его не проблема, проблема его так удалить, что бы ничего на экран не вывелось.
Посмотрим 2 варианта:

Код:
@prompt $s$h
@echo @prompt > OFF.bat
OFF
@del OFF.bat /q

Не работает, т.к. мы завершили данную программу на строчке OFF, перейдя в другой файл.

Код:
@prompt $s$h
@echo @prompt > OFF.bat
@echo @del OFF.bat /q >> OFF.bat
OFF

Файл удаляется (т.е. батник OFF.bat удалил сам себя), но на экран выводится "Не удается найти пакетный файл.".
 
Задача "Калькулятор".
Написать cmd-файл, позволяющий вводить с клавиатуры выражения и выдающий результат подсчета.
Используются действия + - * / %, а так же скобки.
Пример:

Цитата:
> (5+5)*2
(5+5)*2 = 20

Для языков программирования эта задача обычно не очень простая, но на cmd решается крайне просто.

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 13:26 06-12-2005
MonsterMax



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

Всего записей: 38 | Зарегистр. 08-09-2004 | Отправлено: 13:54 06-12-2005 | Исправлено: MonsterMax, 13:57 06-12-2005
hacsoft

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Практическая задача:
Разыменование переменной
Попробуем реализовать ссылки в командных файлах
Пусть в переменной %var% записано имя другой переменной, значение которой нам надо вывести на экран.
Как это сделать?
ECHO %%var%% - не сработает...

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 14:49 06-12-2005
KapralBel



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
hacsoft
Задача "Калькулятор".

Код:
 
@Echo Off
Set /p input=Введите выражение:  
Set /a output=%input%
Echo %input%=%output%
 

 
Разыменование переменной

Код:
@Echo Off
Set var1=123
Set var2=var1
Echo @Echo %var2%=%%%var2%%%>tmp.cmd
call tmp
Del tmp.cmd /q >nul

или
Код:
@Echo Off
Set var1=variable-1
Set var2=variable-2
Set var3=var1
Call :OutVar %%%var3%%%
Echo %OutPut%
Set var3=var2
Call :OutVar %%%var3%%%
Echo %OutPut%
GoTo :EOF
:OutVar
Set Output=%1
GoTo :EOF

 
MonsterMax

Код:
@Echo Off
For /F %%a In (Comp.txt) Do Call :DelFile %%a
GoTo :EOF
 
:DelFile
Echo %1
GoTo :EOF

 
Содержимое файла comp.txt
\\comp1\C$
\\Comp2\D$
\\Server\Net

Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 15:42 06-12-2005 | Исправлено: KapralBel, 16:46 06-12-2005
Smitis



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

Цитата:
Это опять проблема обработки псевдотега code на данном форуме,  

Пардон, это у меня на экране при проверке лишний пробел появлялся. Очепятка была  
Кстати, твой батник можно переименовать в OFF.BAT и сделать таким:

Код:
 
@prompt $s$h
@if "%off%" == "1" exit
@set off=1
%~n0
 


Всего записей: 3177 | Зарегистр. 09-02-2003 | Отправлено: 22:24 06-12-2005
hacsoft

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KapralBel
Спасибо за код разыменования переменной, все бился, как это сделать (в функции обрабатывается переданный ей массив по ссылке).
 
Задача: Лабиринт
Классическая задача на нахождение кратчайшего пути из т. B в т. E. Вот на досуге решил ее средствами командных файлов. В файле input.txt должна лежать карта лабиринта. Пример:

Код:
0000000000
1111111110
0000100100
0100100100
0100100000
0100000100
0000100110
0000100100
0110110000
0010100000
- Лабиринт 10x10 (1 - стена, 0 - проход, за границы карты выйти нельзя).
А вот решение (код немного большой):

Код:
::::::::::::::::::::::::::::::::::::::::::::::
::  Задача нахождения кратчайшего пути      ::
::  Решение: Акатов Алексей, HACSoft, 2005  ::
::::::::::::::::::::::::::::::::::::::::::::::
 
echo off
title Labirint
setlocal enabledelayedexpansion
cls
 
set bi=2
set bj=0
set ei=5
set ej=6
 
call :read
 
echo.
echo Please wait...
 
set /a min=-%width%*%height%
call :find %bi% %bj% -1
cls
set /a min=-min-1
echo Length = %min%
call :write
 
goto :eof
 
::::::::::::::::::::::::::::::::::::::::::::::
 
:find i j len
:: Поиск пути:
    call :get_e %1 %2
    if errorlevel %3 if not %errorlevel%==0 exit /b
    set lab%1_%2=%3
    if %1==%ei% if %2==%ej% set min=%3
    set /a len=%3-1
    if %len% gtr %min% (
        set /a nj=%2+1
        call :get_e %1 !nj!
        if not errorlevel 1 call :find %1 !nj! %len%
        set /a nj=%2-1
        call :get_e %1 !nj!
        if not errorlevel 1 call :find %1 !nj! %len%
        set /a ni=%1+1
        call :get_e !ni! %2
        if not errorlevel 1 call :find !ni! %2 %len%
        set /a ni=%1-1
        call :get_e !ni! %2
        if not errorlevel 1 call :find !ni! %2 %len%
    )
exit /b
 
:get_e i j
:: Получить значение ячейки lab[i,j]:
    if %1 lss 0 exit /b 1
    if %1 gtr %height% exit /b 1
    if %2 lss 0 exit /b 1
    if %2 gtr %width% exit /b 1
exit /b !lab%1_%2!
 
:write
:: Вывод лабиринта (массива lab) на консоль:
    set wall=**
    for /l %%j in (0,1,%width%) do set wall=!wall!***
    echo %wall%
    for /l %%i in (0,1,%height%) do (
        set s=
        for /l %%j in (0,1,%width%) do (
            set a=!lab%%i_%%j!
            if %%i==%bi% if %%j==%bj% (set a=[B])
            if %%i==%ei% if %%j==%ej% (set a=[E])
            if !a!==[B] (set s=!s![B]) else (
            if !a!==[E] (set s=!s![E]) else (
                if !a!==1 (
                    set s=!s!***
                ) else if !a! lss 0 (
                    set /a a=-a-1
                    if !a! leq 99 (
                        set a= !a!
                        if !a! leq 9 set a= !a!
                    )
                    set s=!s!!a!
                ) else set s=!s!...
            ))
        )
        echo *!s!*
    )
    echo %wall%
exit /b
 
:read
:: Чтение массива лабиринта lab из файла input.txt:
    set height=0
    for /f %%s in (input.txt) do call :readline %%s
    echo LABIRINT (%height%x%j%):
    set /a height-=1
    set /a width=j-1
    call :write
exit /b
 
:readline line
:: Чтение одной строки:
    set j=0
    set s=%1
    :nextchar
    if not defined s goto nextline
    set lab%height%_%j%=%s:~0,1%
    set /a j+=1
    set s=%s:~1%
    goto nextchar
    :nextline
    set /a height+=1
exit /b

Переменные bi, bj - координаты начала (считая от 0), а ei, ej - координаты цели, куда мы хотим прийти.
Программа выводит исходный файл, а затем, результат, в котором числами указано количество шагов до текущей ячейки. [B] - точка старта, [E] - точка финиша.
Собственно, поиск пути проходит в рекурсивной функции find, все остальное нужно только для считывания и вывода данных.
 
P.S. Копируя код через буфер обмена с форума, не забываем удалять пробелы в конце каждой строки, а то может работать не будет.

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 22:35 06-12-2005
Refugee

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Разыменование переменной
Set var1=123  
set var2=var1
setlocal ENABLEDELAYEDEXPANSION
echo !%var2%!
 

Всего записей: 513 | Зарегистр. 31-03-2004 | Отправлено: 22:36 06-12-2005 | Исправлено: Refugee, 22:40 06-12-2005
russianczar



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ребята, можно ли сделать батник на русификацию компьютера?  
Тоесть чтобы в Региональных настройках ставилась 20880 Cyrillic Russian, и выставлялся для програм Russian?

----------
Славься страна, мы гордимся тобой!

Всего записей: 595 | Зарегистр. 27-12-2003 | Отправлено: 05:53 08-12-2005
Death_INN

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
russianczar
Для нижеследующих действий необходимо написать батник:
-----------
REGEDIT4
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"20880"="c_20880.nls"
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language]
"Default"="0419"
----------
Файл с_20880.nl_ распаковать из дистрибутива (с_20880.nls) винды и поместить в папку system32

Всего записей: 3013 | Зарегистр. 24-10-2002 | Отправлено: 07:15 08-12-2005
shibog

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а кто объяснит, как заставить правильно работать в cmd.exe строку
if exist *.* echo Files exist
сообщение выводится независимо от наличия файлов в каталоге.
Проявляется в ОС win2000, XP, win2003server

Всего записей: 61 | Зарегистр. 30-10-2001 | Отправлено: 11:13 09-12-2005
KapralBel



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

Код:
 
@Echo Off
For %%a In (1\*.*) Do Call :File_Ex %%a
If Defined FileExist Echo Exist
GoTo :EOF
 
:File_Ex
Set FileExist=Yes
GoTo :EOF
 

Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 12:11 09-12-2005
russianczar



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Напишите мне пожалуйста батник на руссификацию, вот полный список действий:
Надо чтобы батник сам:
В "Региональных Настройках" Выставлял 20880 Cyrillic Russian, также выставлял для не юникодных программ язык Russian.  
Сам помещал файл с_20880.nls в System 32  
И в конце, чтобы добавлял расскладку русского языка...
 
Зарание благодарю !

----------
Славься страна, мы гордимся тобой!

Всего записей: 595 | Зарегистр. 27-12-2003 | Отправлено: 17:41 09-12-2005
morjov



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А как можно сделать батник, чтобы он файлы перименовал в соответствии с датой создания, т.е. ГГГГ_ММ_ДД_ЧЧ_ММ_СС[b/]?
 
Хоца фотки в нормальный вид переименовать и в одну папку кинуть.
 
[b]Добавлено:

И можно ли пикнуть спикером из батника?

Всего записей: 341 | Зарегистр. 05-01-2004 | Отправлено: 15:30 10-12-2005
KapralBel



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

Код:
 
@Echo Off
For %%a In (*.txt) Do @Call :Rena %%a %%~ta
GoTo :EOF
 
:Rena
Set f_Name=%1
Set f_Date=%2
Set f_Time=%3
Set f_Day=%f_Date:~0,2%
Set f_Month=%f_Date:~3,2%
Set f_Year=%f_Date:~6,4%
Set f_Hour=%f_Time:~0,2%
Set f_Min=%f_Time:~3,2%
Ren %F_Name% %f_Year%_%f_Month%_%f_Day%_%f_Hour%_%f_Min%.txt
GoTo :EOF
 

Недостатки
1. Секунды не учитывает
2. если 2 файла были созданы в одно время 2-й  не переименовывается

Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 15:58 10-12-2005
morjov



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KapralBel, сенькс! А секунды никак нельзя? А то у меня много снимков в одну и ту же минуту.

Всего записей: 341 | Зарегистр. 05-01-2004 | Отправлено: 18:20 10-12-2005
igor_andreev

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

Цитата:
И можно ли пикнуть спикером из батника?


Код:
 

@ECHO OFF
ECHO N BEEP.COM>BEEP.SCR
ECHO E 0100 B0 07 CD 29 C3>>BEEP.SCR
FOR %%A IN (RCX 0005 W Q) DO ECHO %%A>>BEEP.SCR
DEBUG<BEEP.SCR>NUL
DEL BEEP.SCR

 

Рядом с этим батником будет создан BEEP.COM(5 байт). Кинь его в директорию, прописанную в PATH, %windir%\system32 например, и у тебя будет своя команда BEEP. Пипикай на здоровье.

Всего записей: 1704 | Зарегистр. 08-12-2004 | Отправлено: 20:20 10-12-2005
   

Страницы: 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

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах
vu1tur (14-11-2006 16:59): http://forum.ru-board.com/topic.cgi?forum=62&topic=9040


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru