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

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Death_INN
Да, возможно, ведь ярлык - это обычный файл *.lnk. Главное, правильно его сформировать.

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



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
hacsoft
Без сторонних утилит (при помощи исключительнно возможностей command.com/cmd.exe) - невозможно
Можно для этого использовать Visual Basic Script/Java Script

Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 17:37 28-11-2005
hacsoft

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KapralBel
Вроде как нет, cmd больше ориентирован на текстовые файлы, но можно по help'у поискать, может и можно как-то направить в файл произвольный байт. Если нет, то можно воспользоваться утилитой debug.exe, которая до сих пор поставляется вместе с виндой
P.S. Попробую написать батник, создающий бинарный файл длинной 256 байт и содержащий значения 0x00, 0x01, ..., 0xff. Если удастся, значит можно и ярлык будет сделать

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 19:10 29-11-2005
igor_andreev

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

Цитата:
Если нет, то можно воспользоваться утилитой debug.exe

В повседневной жизни это обычно не нужно. Очень подозреваю, что Death_INN спрашивал не про теорию, а про обычное решение, типа:  
createlink /файл /место_для_ярлыка
Тут действительно легче и удобней *.vbs. Или какой-нибудь консольной утилитой пользоваться, которая умеет создавать ярлыки из комстроки. Nircmdc например.
http://www.nirsoft.net/utils/nircmd.html

Цитата:
Если удастся, значит можно и ярлык будет сделать

Подробнее...

Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 21:18 29-11-2005 | Исправлено: igor_andreev, 22:10 01-12-2005
almadvav



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такую задачку можно решить?
 
есть файл по определенному пути, скажем c:\temp\файл.txt
его нужно переименовать в c:\temp\файл_MMYY.txt
где MM - текущий месяц,
YY - текущий год.
либо в формате c:\temp\файл_MMYYYY.txt
не принципиально.
 
и как усложнение задачи переименовать в вид c:\temp\файл_MMYY.txt
где MM - текущий месяц-1, т.е. предыдущий месяц.

Всего записей: 16 | Зарегистр. 31-01-2004 | Отправлено: 04:08 02-12-2005
Alan Mon

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

Код:
ren %1 %~n1_%date~3,2%%date:~-2%%~x1

Усложненный вариант:

Код:
set /A month=%date:~3,2%-1
if month==0 set month=12
ren %1 %~n1_%month%%date:~-2%%~x1


----------
Ребята, давайте жить дружно. Кот Леопольд

Всего записей: 1116 | Зарегистр. 22-07-2004 | Отправлено: 10:30 02-12-2005
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alan Mon
При подобном использовании переменной %date% постерегает маленькая, но неприятная, заподлянка. Дело в том, что формат date зависит от региональных настроек. А они разные. Более того, даже русские настройки, задаваемые по умолчанию при установки системы, могут отличаться на разных системах. Например, в NT и 2000 они отличаются от XP и 2003 - у первых месяц будет буквами, у вторых цифрой. Не факт, что опять не будет по другому в Висте.
К сожалению, используя только возможности командного процессора, для получения по отдельности года, месяца, даты универсального решения нет. Я имею ввиду такое решение, которое ГАРАНТИРОВАНО будет работать на любой NT-подобной системе с любыми региональными настройками.
 
Я для подобных целей использую kixtart. В cmd-файле получается вызов, типа

Код:
 
call $GetDT datetime d-t
 

Переменной среды datetime в данном примере у меня присвоится значение вида YYYYMMDD-HHMMSS. Вид задаётся вторым параметром. Скрипт легко модифицируется под конкретные нужды. Если такое решение интересно, могу сдесь разместить.

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
igor_andreev
Но это все понятно, про debug я написал. А вот как сделать только средствами cmd?
 
На счет задачи с датой.
Smitis, использовать внешние программы, которых нет в стандартной ОС не хорошо...
Для начала попробуем найти все возможные способы получания даты из батника:
1. Коданда date /t
2. Переменная %date% - судя по всему является зеркалом 1-го способа.
3. Создаем временный файл и получаем дату его создания командой dir.
4. Из приглашения командной строки, после выполнения команды prompt $d. Вот только как это значение от туда выдрать?
5. Возможно есть еще способы...
 
Для того, что бы установить нужный нам формат даты, можно использовать параметр country в файле Config.nt. Вот только как это связать с нашей задачей?
 
Еще можно попытаться определить формат данных вручную. Вот пример (не очень красиво, конечно):

Код:
@echo off
for /f %%d in ('date /t') do set dt=%%d
echo | date 13/12/2000 > nul
for /f %%d in ('date /t') do set newdt=%%d
date %dt% > nul
if not "%dt%"=="%newdt%" ...

За место "..." ставим код, приведенный Alan Mon, т.к. тут мы уверены в том, что формат даты верный.
Поясню, как это будет работать: первым делом запоминаем текущую дату в переменную %dt%. Теперь пытаемся установить новую дату: 13.12.2000 - 13 декабря 2000 года. Если первой цифрой должен идти месяц, а не число (а месяца с номером 13 не существует), то новая дата установлена не будет и сохранится старая. Полученную дату записываем в переменную %newdt% и возвращаем в систему прежднюю дату (ведь не хорошо, если после всего этого дата в системе окажется измененной). А теперь достаточно сравнить переменные %dt% и %newdt%. Если они различны, то это значит, что формат даты такой: ДД.ММ.ГГГГ или ДД.ММ.ГГ, не важно. И не важно, какой разделитель, точка или что другое, работать будет в любом случае.
Аналогично можно проверить другие возможные форматы, т.е. это и будет решением задачи для любых настроек. Осталось только все собрать вместе и реализовать

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 18:42 02-12-2005 | Исправлено: hacsoft, 18:48 02-12-2005
igor_andreev

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Даю подсказку
Хотите универсальности с датами на всех NT-системах:
1. делайте экспорт куска реестра HKEY_CURRENT_USER\Control Panel\International в темп-файл (regedit /ea, reg.exe не пойдет, по умолчанию есть в XP/2003, в NT/2000 только в ресурс ките)  
2. Там ищите sShortDate
3. Смотрите версию ОС

Код:
 

VER|FIND "Windows NT">NUL
IF NOT ERRORLEVEL 1 GOTO WINNT
 
VER|FIND "Windows 2000">NUL
IF NOT ERRORLEVEL 1 GOTO WIN2K
 
VER|FIND "Windows XP">NUL
IF NOT ERRORLEVEL 1 GOTO WINXP
... и тд

 

и дальше по обстановке, в NT/2000 в %date% добавляется еще две-три буквы дня недели к sShortDate(Пт 02.12.2005, Fri 02/12/05), в XP/2003 нет.
3. Удаляете темп-файл
 
Ну или сначала узнать, какая ОС, потом или regedit /ea или reg.exe, не суть, возможны варианты.
 
Добавлено:
Забыл написать - разделитель даты там же в реестре sDate.
И заглянул сейчас в NT4.0 WS ENG - там echo %date% не работает, только date /t

Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 19:43 02-12-2005 | Исправлено: igor_andreev, 23:50 02-12-2005
igor_andreev

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тээкс..., проверка версии ОС отпадает. Несознательные сербы-греки и в XP вставляют буквы дня недели Попробовал сделать с проверкой первого знака того, что выдает date /t(если не 0-9, то значит день недели перед sShortDate).  
Smitis

Цитата:
К сожалению, используя только возможности командного процессора, для получения по отдельности года, месяца, даты универсального решения нет.

Подсоби немного, щас сделаем
Потестируйте (zip, 1Kb), самая что ни на есть первая альфа-версия, запросто что-то мог упустить. Бегло проверил языков по двадцать на XP ENG и 2000 RUS, вроде работает. На NT4 и 2003 только в понедельник смогу проверить.

Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 05:31 03-12-2005 | Исправлено: igor_andreev, 05:39 03-12-2005
KapralBel



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
igor_andreev
Погонял на разных языках - ошибок нет, посмотрел код - вроде бы не должно быть (по крайней мере я не заметил)

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
igor_andreev
Интересно оформлен файл, респект! Только выход в конце не стоило делать...
 
Собственно все свелось к тому, что бы посмотреть формат даты в реестре.
Попутный вопрос по REGEDIT.EXE: какие еще ключи (кроме /ea) он поддерживает?

Всего записей: 116 | Зарегистр. 18-11-2005 | Отправлено: 17:07 03-12-2005 | Исправлено: hacsoft, 17:17 03-12-2005
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
igor_andreev
Позавчера, думая над этой задачей, сформулировал её примерно так:
- Испольльзовать только возможности командного процессора и стандартных утилит, имеющихся во всех системах, начиная с NT.
- Без побочных эффектов (т.е. без попытки сменить дату, региональные настройки и т.п.).
Собственно, все пути решения свелись всего к двум:
1. Анализировать настройки в реестре и на основе их получить дату.
2. Найти стандартную утилиту, у которой где-нибудь в выводе проскакивает дата в заранее известном формате.
Собственно, через реестр, ты уже задачу решил. Поздравляю!  
 
hacsoft

Цитата:
какие еще ключи (кроме /ea) он поддерживает

Уже было сдесь: http://forum.ru-board.com/topic.cgi?forum=62&bm=1&topic=0009#1
В кратце:
/s или -s - silent режим (отключение вывода диалоговых окон при импорте)
/e или -e - экспорт в формат unicode
/ea - экспорт в формат ansi
 
 
Добавлено:
igor_andreev
Можно добавить ещё проверку на ось - в NT 4.0, насколько мне помнится, ключа /ea нет, там как и в 9x в ansi кодировке экспорт. Что-то типа:

Код:
 
set exp=/ea
ver | find /i "Windows NT 4.0" > nul && set exp=/e
regedit %exp% temp.reg "HKEY_CURRENT_USER\Control Panel\International"
 


Всего записей: 2423 | Зарегистр. 09-02-2003 | Отправлено: 09:48 04-12-2005
hacsoft

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пакет утилит для организации интерфейса в bat-файлах:
http://fsaver.hut1.ru/users/arigato/HS_Packet.rar
Может кому пригодится...

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



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

Цитата:
Пакет утилит для организации интерфейса в bat-файлах

Сам писал?

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Да, восполнил те пробелы, которые есть в стандартном cmd. Хотя еще много чего не хватает для хорощей работы с cmd, до нормального языка программирования ему очень далеко...

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

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

Цитата:
в NT 4.0, насколько мне помнится, ключа /ea нет

Да, спасибо. Действительно нет. Но с этим в общем то обошлось, ключ /ea смело меняем на /e. NT экспортирует таким образом в ANSI, более новые OS в Unicode, а команда FIND нормально ищет и в файлах REGEDIT4(ANSI) и в "Windows Registry Editor Version 5.00"(Unicode). Это я о чем-то не том подумал, когда про /ea писал.

Цитата:
Собственно, через реестр, ты уже задачу решил. Поздравляю!

Не с чем В NT4 не работает абсолютно. Можно рассматривать первый вариант как способ узнать день-месяц-год в 2000/XP (2003 не проверял еще, но там по идее все, как в XP).
В NT4 команда SET не понимает отрицательных цифр(c минусом) var=%var:~1,-1%. От кавычек таким образом не избавиться. В sDate еще можно, там все равно разделитель даты один, или точка("."), или прямой слеш("/"), или дефис("-").  
var=%var:~1,1% работает.
А в sShortDate не знаю, как в NT от кавычек откреститься. Вернее знаю, считать количество букв в sShortDate(X), видел где-то пару способов и var=%var:~1,X%. Или оставлять sShortDate в кавычках, но тогда придется проверять еще все варианты с пробелами, букфф блин в батнике в два раза больше станет. Сейчас то батнику фиолетово "dd.MM.yy" или "dd. MM. yy".  
Еще в NT пару форматов дурацких обнаружил...
И CALL :метка почему-то не работает как надо, хотя должна...
 
В общем я постараюсь добить этот cutdate.cmd до полной работоспособности на всех NT-образных, но вообще жалко из-за полумертвой ОС раздувать код. NT4 уже и не стоит то нигде практически...
 
Кстати, есть в каком-нибудь языке форматы год.день.месяц (типа yy.dd.MM, yyyy/d/M)?
То есть год - первым, день - вторым, месяц - третьим.
Нигде не увидел пока, а то еще кучу строк в батник добавлю
 
 
Добавлено:
У меня Punto Switcher сломался, слабак Сидит в уголке, охреневший от такого количества языковых раскладок и не знает, что ему делать.

Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 12:12 05-12-2005 | Исправлено: igor_andreev, 12:21 05-12-2005
Smitis



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

Цитата:
но вообще жалко из-за полумертвой ОС раздувать код. NT4 уже и не стоит то нигде практически...

У нас, например, ещё в начале этого года на серваке стояла. Несколько лет назад отказались от 2К в пользу неё. Впрочем, 2К тогда сырая была, ещё безо всяких SP. Если бы новые админы не угробили    старушку, работала ла бы долго. А что - есть не просила, домен держала, проксю и почту тянула (стороними, конечно же прогами), места на диске занимала мизер, ресурсов совсем мало жрала. Жаль...  
 
Добавлено:
Впрочем, "раздувать код" действительно не стоит  

Всего записей: 2423 | Зарегистр. 09-02-2003 | Отправлено: 23:05 05-12-2005
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Маленькая задачка на сообразительность для всех  
Вывести из командного файла строку "OFF" (без кавычек). Т.е. так, чтобы в выведенной строке были только эти три буквы. Ну можно ещё и "ON" в другой строке вывести.
Вот так (кусок текстового скриншота):

Код:
 
C:\Test>off-on.cmd
OFF
ON
C:\Test>
 

Уточнение: стандартными средствами винды без использования wsh (vbs, js), msh и стороних утилит

Всего записей: 2423 | Зарегистр. 09-02-2003 | Отправлено: 09:01 06-12-2005 | Исправлено: Smitis, 09:22 06-12-2005
igor_andreev

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

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

Шесть вариантов знаю Кто больше? Скрою под тегом MORE, пусть другие сами сначала сообразят, как это сделать. Подробнее...

Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 09:37 06-12-2005 | Исправлено: igor_andreev, 09:44 06-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.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru