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

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

Модерирует : gyra, Maz

Widok (10-03-2009 12:39): Лимит страниц. Продолжаем здесь.  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

Widok



Moderator-Следопыт
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
(часть 1)
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Microsoft Windows » Задачи на bat-файлах 5
 
Полезные ссылки:
· Cmd. Описание от разработчиков
· Урок bat-аники (для начинающих)
· Курс лекций для начинающих. Полезно и просто описано
· Набор GNU утилит для win32
· Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· cmdow — изменение параметров и видимости дос-окна
· blat — отправка почты из консоли
· Справка по командам в виде Html
· Команды RunDll32
· Quick Batch File Compiler - Позволяет превратить ваш батник в независимое приложение
· Пример - получение и обработка списка пользователей
· Уильям Станек - Командная строка Microsoft Windows (вплоть до w2k3)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек)
 
Старая версия первого сообщения

Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 12:08 19-11-2007 | Исправлено: Dmitriy05, 22:49 13-04-2008
Kilyan



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maza_Faka
Спасибо-все удачно!
И последний вопрос. Как проверить существование нескольких файлов с разными масками?
Наличие одного файла проверяю if exist <имя файла>
А как проверить сразу три и только в случае наличия всех-что то делать?
Можно ли это сделать компактно?

Всего записей: 886 | Зарегистр. 04-09-2008 | Отправлено: 16:45 05-03-2009
rBBWYwg



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maza_Faka
 
Так просто, и так стыдно... Спасибо большое.

Всего записей: 23 | Зарегистр. 14-10-2008 | Отправлено: 17:12 05-03-2009
KYMichael

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

Код:
 SET "mailer=c:\Program Files\The Bat!\thebat.exe"  

 
Не проходит, та же ошибка
 
igor_andreev

Цитата:
 Да у него скорей всего, как обычно - enabledelayedexpansion в начале батника...  

Так это мне в данном случае тоже нужно.
 
 
Или получается, что использование enabledelayedexpansion не даёт возможности использовать в пути знак "!" ?

Всего записей: 36 | Зарегистр. 25-08-2007 | Отправлено: 18:10 05-03-2009
igor_andreev

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KYMichael
disabledelayedexpansion сделай перед SET и отправкой почты.  

Всего записей: 1704 | Зарегистр. 08-12-2004 | Отправлено: 19:06 05-03-2009
KYMichael

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

Цитата:
disabledelayedexpansion сделай перед SET и отправкой почты.

Ур-р-а-а! Заработало!
Спасибо!
 
P.S. рановато я обрадовался, теперь The Bat вызывается, но он чихать хотел на параметры переданные ему при вызове
 
Но это уже не сюда Вопрос
(главное с "!" решилось, ещё раз спасибо!)
 
 
 

Всего записей: 36 | Зарегистр. 25-08-2007 | Отправлено: 20:56 05-03-2009
BorlandIMHO

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

Цитата:
Как проверить существование нескольких файлов с разными масками?  
Наличие одного файла проверяю if exist <имя файла>  
А как проверить сразу три и только в случае наличия всех-что то делать?  
Можно ли это сделать компактно?


Код:
for %%N in (file1.ex1 file2.ex2 file3.ex3) do if not exist %%N exit
REM дальше то, что должно выполняться при наличии всех трёх файлов


----------
http://www.imho.ws

Всего записей: 2376 | Зарегистр. 12-10-2006 | Отправлено: 22:20 05-03-2009
Kilyan



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
Все бы хорошо, но нужно б еще вывести каких файлов не хватает.  
неплохо былобы как то с такой конструкцией

Цитата:
 
If "%~1"=="" (  
Echo Called without param
)  Else  (  
Echo Called with param: %1
)

Чтоб можно в двух вариациях что то сделать!

Всего записей: 886 | Зарегистр. 04-09-2008 | Отправлено: 23:53 05-03-2009
Maza_Faka



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

Цитата:
неплохо былобы как то с такой конструкцией

Так сделайте! Вам же показали:

Код:
 
@Echo Off
 
for %%N in (file1.ex1 file2.ex2 file3.ex3) do (
  if not exist %%N (
  Echo File: %%N is not exists
  ) Else (
  Echo File: %%N is exists
  )
)
 


Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 07:45 06-03-2009
NvvLazyTiger



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kilya
Цитата:
Как проверить существование нескольких файлов с разными масками?  
Наличие одного файла проверяю if exist <имя файла>  
А как проверить сразу три и только в случае наличия всех-что то делать?  
Можно ли это сделать компактно?

Цитата:
нужно б еще вывести каких файлов не хватает.  

Например можно сделать так:
Код:
@echo off
:: NoTot счётчик отсутствующих файлов
set NoTot=0  
:: NoFil перечень отсутствующих файлов
set NoFil=  
 
:: перебор элементов заданного перечня
for %%a in ( "f i l e 1 .  e x 1" file2.ex2 file3.ex3 ) do call :ChkFile %%a  
 
:: если всё в порядке - делаем то, что нужно
if %NoTot% == 0 goto IfAllOk  
 
:: если чего-то нет - известим о факте
echo ! Missed %NoTot% file(s) [%NoFil% ]  
goto :eof  
 
:ChkFile проверка наличия, учёт отсутствия файла
if exist %1 goto :eof  
:: если файла нет, запомним имя и увеличим счётчик
set NoFil=%NoFil% %1  
set /a NoTot=%NoTot%+1  
goto :eof  
 
:IfAllOk действия при наличии всех файлов из списка
 

NB. Имена файлов с пробелами нужно указывать в двойных кавычках.
BTW На производстве компактность в ущерб простоте и наглядности, как правило, усложняет ремонт при авариях. Иногда - очень сильно [усложняет]...

Всего записей: 257 | Зарегистр. 14-02-2009 | Отправлено: 08:32 06-03-2009
Kilyan



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NvvLazyTiger
Как раз то что нужно! спасиб.

Всего записей: 886 | Зарегистр. 04-09-2008 | Отправлено: 08:43 06-03-2009
vitrzn



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

Всего записей: 1461 | Зарегистр. 28-10-2007 | Отправлено: 09:28 06-03-2009 | Исправлено: vitrzn, 09:34 06-03-2009
Maza_Faka



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vitrzn
Не проще ли воспользоваться wget?

Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 09:48 06-03-2009
vitrzn



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

Цитата:
Не проще ли воспользоваться wget?

 
БУМ юзать !
СПС за совет !!!

Всего записей: 1461 | Зарегистр. 28-10-2007 | Отправлено: 09:59 06-03-2009
Kilyan



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

Код:
SET i_month=""
if "%~1"=="" ( goto :IfAllOk ) else (
(set /A param = "%~1" ) & call :Chkparam %param%
)
:Chkparam проверка параметра
if %1 LSS 10 (Set i_month=0%param) else (set i_month=%1)
 
:IfAllOk  
Echo %i_month%
pause

Необходимо проверить ключ(если он меньше нуля то числовой ключ представить с нулем впереди!)

Всего записей: 886 | Зарегистр. 04-09-2008 | Отправлено: 13:41 06-03-2009 | Исправлено: Kilyan, 13:43 06-03-2009
NvvLazyTiger



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kilyan
Цитата:
Помогите найти ошибку!?

Зачем так сложно? (в тексте минимум одна ошибка - п/п :Chkparam не завершается оператором `goto :eof`)
Проще сделать так:
Код:
SET i_month=%1
:: если параметра нет, сразу идём на метку
if NOT defined i_month goto IfAllOk
:: если в параметре один символ - приписываем слева цифру "0"
if %i_month:~1%. == . set i_month=0%1
 
:IfAllOk  
if defined i_month (echo %i_month%) else (echo NO params!)
pause
NB. Конструкция `%~1` убирает лишь обрамляющие двойные кавычки. Т.е. если таковые есть внутри, или, если параметр отличается от 1..12, то могут быть интересные результаты... ;)
 
А вот в эту конструкцию:
Цитата:
Необходимо проверить ключ(если он меньше нуля то числовой ключ представить с нулем впереди!)
я "въехать" не смог. Может быть таки - "ключ меньше 10" (судя по тексту примера, т.е. 1..9)?  
 
Вдогонку. Можно нейтрализовывать отрицательные значения [первого параметра], можно принимать ТОЛЬКО цифры 1..12. Много чего можно [делать]... А нужно-то таки что?

Всего записей: 257 | Зарегистр. 14-02-2009 | Отправлено: 14:53 06-03-2009 | Исправлено: NvvLazyTiger, 15:07 06-03-2009
Kilyan



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

Цитата:
можно принимать ТОЛЬКО цифры 1..12

А интересно как это?

Всего записей: 886 | Зарегистр. 04-09-2008 | Отправлено: 15:18 06-03-2009
NvvLazyTiger



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну, например так:
Код:
set i_month=
set jTmp0=%1
:: если параметра нет, - значит нет
if NOT defined jTmp0 goto IfAllOk
:: если это 0, - тоже нет
if %jTmp0% == 0 goto IfAllOk
:: если в параметре больше двух символов - и это не то
if NOT %jTmp0:~2%. == . goto IfAllOk
:: убираем лидирующий 0 из входного параметра (если есть)
if %jTmp0:~0,1% == 0 set jTmp0=%jTmp0:~1%
:: результат последовательно сравниваем с числами в интевале 1..12
for /l %%a in (1,1,12) do if NOT defined i_month call :Chkparam %%a
:: и идём докладать...
goto IfAllOk
 
:ChkParam  проверка - это наше число?
if NOT %1 == %jTmp0% goto :eof
:: да, принимаем...
set i_month=%1
:: если это один символ - приписываем слева цифру "0"
if %i_month:~1%. == . set i_month=0%1
goto :eof
 
:IfAllOk
if defined i_month (echo Ok, i_month=%i_month%) else (echo ! NO or BAD param [%%1=%1])
pause
 
NB. Защититься от "чего попало" в параметрах вызова CMD - дело весьма хлопотное, если вообще... А вот от обычных очепяток&Co - вполне...
 
UpDate Упс... просмотрел неточность, исправлено.

Всего записей: 257 | Зарегистр. 14-02-2009 | Отправлено: 16:24 06-03-2009 | Исправлено: NvvLazyTiger, 16:34 06-03-2009
rBBWYwg



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

Прошу помочь с кодом, который может заменять часть имени файлов по маске. Сама не асилила.
Например, файлы в папке FOLDER имеют имена  
12345678.txt
87654321.txt
76543212.txt
 
Надо в их именах заменить, скажем, все 12 на нули.
 
Это актуально. Но если будет настрой - хотелось бы знать такой же прием для субдиректорий определенной папки. Плз.
 

Всего записей: 23 | Зарегистр. 14-10-2008 | Отправлено: 17:19 06-03-2009 | Исправлено: rBBWYwg, 17:26 06-03-2009
Maza_Faka



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

Цитата:
Надо в их именах заменить, скажем, все 12 на нули.

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

Код:
 
@Echo Off
 
Set "MyFolder=C:\Test"
 
::Создаём утилиту sbs2.com
Call :sbs2.com
 
For /F "Usebackq Delims=" %%A In (`Dir %MyFolder%\*.txt /B /S ^| Find "12"`) Do (
  For /F "Usebackq Delims=" %%B In (`Echo %%~nxA ^| "%temp%.\sbs2.com" 0 "12" "00"`) Do Ren "%%A" "%%B"
)
 
Del /F /Q "%temp%.\sbs2.com">Nul
pause
GoTo :EOF
 
:sbs2.com
:: 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"
 

Не забываем про концевые пробелы

Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 08:16 07-03-2009
bk99



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Help!
Помогите организовать синхронизацию (в одну сторону) одинаковых папок на двух не связанных сетью компах. (Существующие программы синхронизации по разным причинам не подходят.) Хотелось бы так:
1. на компе №1 запускаем file1.bat, который создаёт список файлов указанной директории (с путями и подпапками).
2. идём с этим списком на комп №2 и запускаем file2.bat  - при этом на сменный носитель копируются только файлы (с сохранением структуры директорий), отсутсвующие в списке. При этом, одинаковые файлы (т.е. файлы, которые уже есть на обоих компах)должны игнорироваться. Структура директорий должна учитываться обязательно. Например, "dir1/file.aaa" и "dir1/dir2/file.aaa" - должны считаться разными файлами.
3. возвращаемся на комп №1 и сливаем со сменного носителя новые файлы. Здесь тоже, наверное, батник понадобится, чтобы файлы в нужные подпапки попадали.
В идеале хорошо бы учитывать и даты создания файлов и заменять более старые файлы, расположенные на компе №1, более новыми файлами с компа №2.
Спасибо!

Всего записей: 937 | Зарегистр. 27-12-2005 | Отправлено: 11:14 07-03-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

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd) 2
Widok (10-03-2009 12:39): Лимит страниц. Продолжаем здесь.


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru