Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 2

Автор: royt
Дата сообщения: 31.01.2007 19:24
Кто знает, есть ли какое-то ограничение на глубину рекурсивных вызовов внутри батника?
Автор: Elroir
Дата сообщения: 31.01.2007 19:43
royt
Что ты имеешь в виду? Сколько раз батник может вызывать самого себя?
Автор: ViSiToR
Дата сообщения: 31.01.2007 22:29
igor_andreev

Цитата:
Отсюда начни http://www.rsdn.ru/article/winshell/batanyca.xml


Класное пособие, в шапку добавил (и ссылку на команды RunDll32 тоже).



Примечание к утилите для выключения (SBS):
1) Ограничение в милисекундах стоит на 2147483647 (24 дня).
2) Эта утилита также може служить простому простою, т.е вместо Sleep - для этого нужно задать только первый параметр (120-s), и запускать утилиту с ключом /wait:

Код: Start /wait SBS 120-s
Автор: Elroir
Дата сообщения: 31.01.2007 22:40
ViSiToR

Цитата:
я вижу уже кто-то до меня добавил (кто? признавайтесь)

Ну я добавил...

Добавлено:
Кстати, шапка большая становится - надо как-то ее "перестроить".
Автор: Tipulatoid
Дата сообщения: 01.02.2007 01:23
Можно ли задать следующее:
если переменная %product_3% - пустая (т.е. задана уже раньше, но не содержит ни одного символа), то сделать то-то, иначе - се-то

If defined похоже не подходит. Переменная-то то уже определена. Просто значения у нее нет.
Автор: Elroir
Дата сообщения: 01.02.2007 01:28
Tipulatoid
Если у переменной нет значения, значит она не определена. Я не могу себе представить, как можно создать переменную без значения.

Добавлено:
То есть, если присвоить существующей переменной несуществующее значение (например set test=1 & set test=%1, при том, что %1 - не задан) то переменная просто исчезнет. И тогда можно проверять if defined.
Автор: ViSiToR
Дата сообщения: 01.02.2007 03:59
Tipulatoid

Цитата:
если переменная %product_3% - пустая

А в чём проблема просто сравнить её с пустым значением?


Код: If "%product_3%"=="" (echo Hello!) else (echo Goodby!)
Автор: Tipulatoid
Дата сообщения: 01.02.2007 04:47
Elroir
Да, вы правы как всегда Код мой совсем по другой причине глючил.

Добавлено:
ViSiToR
Да, так можно, но выяснилось что это совсем необязательно
Автор: DocBeen
Дата сообщения: 01.02.2007 10:44
Добрый День колееги,
столкнулся с такой проблемой - подскажите пожалуйста:
необходимо сделать синхронизацию с ftp сервером, причем виндовая ftp.exe в полне устраивает за исключением того что не может работать с группой файлов по маске ( с примеру *.dbf ) для синхронизации сперва надо удалить все файлы dbf а потом туда закачать другие.... возможно ли использования при этом списка ( list.txt - в котором указываются удоляемы а потом загружаемые файлы). и как бы затем этот процесс поставить на автомат к примеру в разные часы чтоб выполнялся....
Автор: royt
Дата сообщения: 01.02.2007 12:17
Elroir

Цитата:
Что ты имеешь в виду? Сколько раз батник может вызывать самого себя?
И Сам себя (в т.ч. косвенно - через другой батник). Но прежде всего - вызов в батнике в "процедуре" самой себя, типа:

:SOME_CODE
...
CALL :SOME_CODE
...
GOTO :EOF

Есть ли на это какие-то ограничения?
Автор: igor_andreev
Дата сообщения: 01.02.2007 13:52
DocBeen
C помощью стандартной ftp.exe и батника можно что угодно сделать, в том числе и синхронизацию каталогов, только батник может сложным получиться. Желательно для начала хотя бы основные ftp-шные команды знать.
Цитата:
исключением того что не может работать с группой файлов по маске
работает, хэлп комманд mput, mget и mdelete читайте

Цитата:
синхронизации сперва надо удалить все файлы
синхронизация - это удалить не все, а только отсутствующие на другом компьютере. И закачать только обновленные
Цитата:
возможно ли использования при этом списка
Да, -s
Цитата:
и как бы затем этот процесс поставить на автомат
Как и все ставят . Слово планировщик знакомо?

royt
Я как-то сталкивался, что CALL :SOME_CODE не полностью срабатывал в батнике на Win2000(а на XP работало), только там кажется сработало какое-то ограничение команды FOR которая была в этом :SOME_CODE, вроде как есть что-то. Но инфы толком не нашел никакой. А у тебя спотыкается после 65000 вызовов?
Автор: ViSiToR
Дата сообщения: 01.02.2007 14:00
DocBeen

Цитата:
возможно ли использования при этом списка

Я не сталкивался с работой утилиты ftp, но по списку можно примерно так:


Код: For /f %%i in (list.txt) do del %%i
For /f %%i in (list.txt) do ftp %%i
Автор: Elroir
Дата сообщения: 01.02.2007 15:04
royt
Есть -

Цитата:

****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=1240, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******

То есть в WinXP SP2 - 1240, на других системах я видел 1267, 864.
У себя можно легко проверить запустив код, который ты привел.
Автор: royt
Дата сообщения: 01.02.2007 15:05
igor_andreev
Цитата:
А у тебя спотыкается после 65000 вызовов?
нет, но спотыкается когда один скрипт вызывается не напрямую, а косвенно (опосредованно через другой скрипт) где-то на 5-ом уровне вложенности. Но я не уверен, что именно в рекурсии дело - просто хочу узнать на всякий случай.


Elroir
Цитата:
То есть в WinXP SP2 - 1240, на других системах я видел 1267, 864.
У себя можно легко проверить запустив код, который ты привел.
В том то и дело, что непонятно, от чего это зависит. По идее, может зависеть от:
1) наличия определенных ресурсов в ОС
2) ограничения ресурсов "внутри" cmd.exe (неизвестно ведь, что там внутри наворочено - может там для некоторых команд на все экземпляры есть что-то вроде общего буфера и из-за этого скажем в зависимости от длины строки, передаваемой в качестве параметра команде CALL, кол-во рекурсивных вызовов может быть ограничено 4000, а может и 256 на одной и той же системе).


И еще вопрос:
как определить - выполняется ли в текущем окне консоли (в котором выполняется батник) какая-либо другая программа (процесс), по имени файла этого процесса. Другими словами - запущен ли текущий выполняемый батник внутри того же окна, что и процесс, для которого указано имя его исполняемого файла.

Ноги растут отсюда: хочется в батнике увеличивать кол-во строк до некоторого довольно большого значения (командой вида "mode con cols=2048") - но только в том случае, если батник не был запущен под FAR-ом непосредственно в его окне. Т.е. если в том же консольном окне, где работает батник, работает FAR - то кол-во строк не меняем. Нужно это для того, чтобы после отработки батника окно консоли сохраняло изначальное кол-во строк, да и колонок тоже. Вариант менять кол-во строк, а в конце батника возвращать обратно - неприемлем, по многим причинам (например, выполнение батника может быть прервано до достижения его конца).
Надо иметь ввиду, что батник может быть запущен из под FAR-а командой Shift-Enter - тогда батник (cmd.exe) запускается в отдельном окне и соответсвенно кол-во строк увеличиваем.
Автор: Elroir
Дата сообщения: 01.02.2007 15:15
ViSiToR

Цитата:
For /f %%i in (list.txt) do ftp %%i

Так, к сожалению, не получится - после того, как было установлено соединение, ftp не возвращает контроль cmd - у него своя среда.

DocBeen
В текстовом файле прописываешь команды ftp (скрипт), которые надо выполнить - каждая команда на отдельной строке, а потом, как и сказал igor_andreev, запускаешь ftp с ключом -s и названием созданного скрипта.

Добавлено:
royt

Цитата:
В том то и дело, что непонятно, от чего это зависит.

Ага - как я не старался найти информацию по этому вопросу - глухо. Microsoft молчит как партизан, а больше, видимо, никто не знает.

Цитата:
может там для некоторых команд на все экземпляры есть что-то вроде общего буфера и из-за этого скажем в зависимости от длины строки, передаваемой в качестве параметра команде CALL, кол-во рекурсивных вызовов может быть ограничено

Если судить по моим экспериментам, то ни от параметров, ни от количества определяемых переменных не зависит.
Автор: evgeni666
Дата сообщения: 01.02.2007 16:04
Насколько я помню, раньше все упиралось в область, отведенную под переменные. Было что-то в районе 64кб. При превышении этого порога все благополучно падало. А при вызове одного батника из другого эта область благополучно заполняется.
Автор: igor_andreev
Дата сообщения: 01.02.2007 16:23
Elroir

Цитата:
Так, к сожалению, не получится - после того, как было установлено соединение, ftp не возвращает контроль cmd - у него своя среда.

В том то и дело, что возвращает. Это все из-за этих дурацких советов типа

Цитата:
Напишите файлик такого содержания

open ftp.host.ru
user
pass
put file.ext
close

и запустите ftp -s:файлик

Один какой-то сайт написал это в качестве примера и все как попки давай дружно повторять на своих сайтах. А это то-же самое, что в батнике написать @ECHO OFF

Держите самые простые образцы, что можно делать с ftp.exe
ftpscript.zip(полтора килобайта) Readme внутри, установить очень желательно, удаляется легко через Установка-удаление программ "Explorer shell extension "FTP Script""
и два примера mcafee-dat.zip и rarlab-job.zip, оба меньше килобайта. После запуска оставят файлики mcafee.txt и rarlab.txt
Это действительно самые простые, для примера, а можно уу-у какие синхронизации делать. Только надо батники уметь писать Писались под XP, поэтому содержат команду TSKILL, на 2000 можно любую другую прибивалку процессов использовать.
Автор: DocBeen
Дата сообщения: 01.02.2007 17:14
igor_andreev


Цитата:
Держите самые простые образцы, что можно делать с ftp.exe
ftpscript.zip(полтора килобайта) Readme внутри, установить очень желательно, удаляется легко через Установка-удаление программ "Explorer shell extension "FTP Script""


а с помощью данных скриптов - реально вообще что то с файлами делать на удаленном сервере....

к примеру - один скрипт - проверяет по Дате файлы *.dbf и если дата отличаетс от заданной то он удаляет все из Каталога, а другой наооборот - заливает файлы,

Автор: igor_andreev
Дата сообщения: 01.02.2007 17:35
DocBeen
При закачке файла на фтп-сервер дата у него меняется на текущую. Из фтп-клиентов кажется только FTP Voyager умеет при закачке сохранять дату локального файла. И то, только если закачивает на Serv-U Можно проверять по размеру, но это ненадежно. Я обычно просто удаляю с ftp, если такого файла нет на компе и закачиваю те файлы, которые имеют атрибут "архивный", после этого сбрасываю атрибут.

Добавлено:

Цитата:
а с помощью данных скриптов - реально вообще что то с файлами делать на удаленном сервере....

Можно все, что позволяет file transfer protocol удалять-создавать папки, скачивать-закачивать файлы, переходить из папки в папку и т.д. Или вернее - что позволяет виндовая ftp.exe(она не в курсе о существовании passive и reget)

Добавлено:
По дате вообще можно конечно, команда DIR в FTP выдает даты файлов на сервере. А можно просто записывать дату синхронизации в какой-нибудь *.ini файл и при следующем соединении проверять дату изменения файлов на компе, если новее - закачивать их.
Автор: Elroir
Дата сообщения: 01.02.2007 18:24
igor_andreev

Цитата:
В том то и дело, что возвращает

Э... подожди. Под словами "не возвращает контроль cmd", я подразумевал, что запустив команду "ftp ...", я не возвращаюсь в CMD prompt, a остаюсь внутри оболочки ftp. То что можно запустить консольную команду символом "!", я знаю. Ты же все равно запускаешь команды из скрипта, а не каждую команду отдельно из командной строки.
Или я чего-то не понимаю?
Автор: igor_andreev
Дата сообщения: 01.02.2007 18:47
Elroir
Но можно непосредственно из ftp-скрипта написать батник, запустить его, подождать, пока он обработает данные. Можно отсоединиться от сервера, проделать уйму работы и опять соединиться. Можно из ftp-скрипта написать другой ftp-script и запустить его.
Автор: Lyrik
Дата сообщения: 01.02.2007 23:41
Подскажите что не так?
Создал bat файл:

Код: net user adm_user /add
net localgroup Администраторы adm_user /add
pause
Автор: Elroir
Дата сообщения: 01.02.2007 23:45
Lyrik

Цитата:
Как решить?

Первой строчкой пропиши:

Код: chcp 1251
Автор: Lyrik
Дата сообщения: 01.02.2007 23:54
Elroir
Спасибо за ответ и за оперативность! Супер! ))))
Автор: StanislavG
Дата сообщения: 02.02.2007 07:14
Elroir
У меня опять проблема вот смотри мой батник

Цитата:
rem @echo off
rem start %time%
setlocal
set dt=%date%
FOR %%I IN (*.*) DO call :finddate "%%I" %dt:~0,2% %dt:~3,2% %dt:~6,4%

rem cd w:\nbumail\journal
REM arj32 m w:\nbumail\journal\jour%prevd%%prevm%.dh0 w:\nbumail\journal\ *.old *.rsa *.ind *.key *.pud *.rsa *.lo1 *.er1 *.err *.nbu *.pub *.new *.log

goto :EOF

:finddate
for /F "usebackq tokens=1,2,3,4 delims=. " %%A IN (`"dir /T:C %1 | find %1"`) DO call :test %%A %%B %%C %1 %2 %3 %4
goto :EOF

:test
rem File's date
set fd=%1
set fm=%2
set fy=%3
rem Current date
set curd=%5
set curm=%6
set cury=%7
set /a prevd=%curd%-1
set prevm=%curm%
set prevy=%cury%
set prevye=%cury%
if %curm%==12 (set prevme=11& set days=30)
if %curm%==11 (set prevme=10& set days=31)
if %curm%==10 ( set prevme=09& set days=30)
if %curm%==09 ( set prevme=08& set days=31)
if %curm%==08 ( set prevme=07& set days=31)
if %curm%==07 ( set prevme=06& set days=30)
if %curm%==06 ( set prevme=05& set days=31)
if %curm%==05 ( set prevme=04& set days=30)
if %curm%==04 ( set prevme=03& set days=31)
if %curm%==03 ( set prevme=02& set days=28)
if %curm%==02 ( set prevme=01& set days=31)
if %curm%==01 ( set prevme=12& set days=31& set /a prevye=%prevy%-1)
if %prevd% LEQ 0 (
set /a prevd=%days%+%prevd%
set prevm=%prevme%
set prevy=%prevye%)
set match=true
if not "%fd%"=="%prevd%" ( set match=false)
if not "%fm%"=="%prevm%" ( set match=false)
if not "%fy%"=="%prevy%" ( set match=false)
if "%match%"=="true" (
copy c:\tcpfoss.452\%4 c:\tcpfoss.452\jnin\
copy c:\tcpfoss.452\log\%4 c:\tcpfoss.452\jnin\
move c:\tcpfoss.452\%4 w:\nbumail\journal
move c:\tcpfoss.452\log\%4 w:\nbumail\journal
)

он отработал нормально но 1 числа не собрал файлы я начел смотреть и вот нашел

Цитата:
C:\tcpfoss.452>set match=true

C:\tcpfoss.452>if not "01" == "1" (set match=false )

C:\tcpfoss.452>if not "02" == "02" (set match=false )

C:\tcpfoss.452>if not "2007" == "2007" (set match=false )

нет нуля и поэтому не собирает объясни в чем проблема
Автор: igor_andreev
Дата сообщения: 02.02.2007 09:08

Цитата:
нет нуля и поэтому не собирает объясни в чем проблема

Дак в том и проблема, что нуля нет

Не про ноль - я бы, честно говоря, поместил в шапку в качестве примера вычисления предыдущей даты вот такой:

Код:
ECHO wscript.echo date-1>tmp.vbs
FOR /F %%A IN ('cscript tmp.vbs //Nologo') DO SET "YESTERDAY=%%A"
ECHO %YESTERDAY%&DEL tmp.vbs
Автор: StanislavG
Дата сообщения: 02.02.2007 10:38
Все большое спасибо я нашел ответ

Цитата:
set /a fd=%fd%-00

Автор: Elroir
Дата сообщения: 02.02.2007 11:10
StanislavG
В этом коде, вообще проблема с числами меньше 10 (и дни и месяцы). Я когда писал код, который ты брал в качестве примера, не учел, что CMD воспринимает числа с первым нулем, как восьмеричные.
Так что код надо править. У меня сейчас нет времени - потом попробую написать.

igor_andreev

Цитата:
Покороче будет, чем те, что в шапке. А WSH стараниями Microsoft стоит на любой машине с 2000/XP/2003, чего ж им не пользоваться.

Супер!!!
Автор: igor_andreev
Дата сообщения: 02.02.2007 11:24

Цитата:
Супер!!!

Нее, не супер, в vbscript это самые рядовые функции. Таким же макаром, без уймы строчек, возможных ошибок, вне зависимости от "високосности", от формата даты на компе и т.п., файлик *.vbs

Код:
wscript.echo day(date) & " " & month(date) & " " & year(date)
Автор: Elroir
Дата сообщения: 02.02.2007 11:54
igor_andreev

Цитата:
в vbscript это самые рядовые функции

Так поэтому и супер
К сожалению, я VBScript не знаю.
И еще - единственный недостаток, то что надо вспомогательный файл создавать.

Добавлено:
StanislavG
Вот так все должно работать:

Код:
@echo off
rem start %time%
setlocal
set "dt=%date%"
FOR %%I IN (*.*) DO call :finddate "%%I" %dt:~0,2% %dt:~3,2% %dt:~6,4%

rem cd w:\nbumail\journal
REM arj32 m w:\nbumail\journal\jour%prevd%%prevm%.dh0 w:\nbumail\journal\ *.old *.rsa *.ind *.key *.pud *.rsa *.lo1 *.er1 *.err *.nbu *.pub *.new *.log

goto :EOF

:finddate
for /F "usebackq tokens=1,2,3,4 delims=. " %%A IN (`"dir /T:C %1 | find %1"`) DO call :test %%A %%B %%C %1 %2 %3 %4
goto :EOF

:test
rem File's date
set "fd=%1"
set "fm=%2"
set "fy=%3"
rem Get rid of leeding zero
if %fd% LSS 10 set "fd=%fd:~-1%"
if %fm% LSS 10 set "fm=%fm:~-1%"
if %fy% LSS 10 set "fm=%fy:~-1%"
rem Current date
set "curd=%5"
set "curm=%6"
set "cury=%7"
rem Get rid of leeding zero
if %curd% LSS 10 set "curd=%curd:~-1%"
if %curm% LSS 10 set "curm=%curm:~-1%"
if %cury% LSS 10 set "cury=%cury:~-1%"

set /a "prevd=%curd%-1"
set "prevm=%curm%"
set "prevy=%cury%"
set "prevye=%cury%"
if %curm%==12 ( set "prevme=11"& set "days=30")
if %curm%==11 ( set "prevme=10"& set "days=31")
if %curm%==10 ( set "prevme=9"& set "days=30")
if %curm%==9 ( set "prevme=8"& set "days=31")
if %curm%==8 ( set "prevme=7"& set "days=31")
if %curm%==7 ( set "prevme=6"& set "days=30")
if %curm%==6 ( set "prevme=5"& set "days=31")
if %curm%==5 ( set "prevme=4"& set "days=30")
if %curm%==4 ( set "prevme=3"& set "days=31")
if %curm%==3 ( set "prevme=2"& set "days=28")
if %curm%==2 ( set "prevme=1"& set "days=31")
if %curm%==1 ( set "prevme=12"& set "days=31"& set /a "prevye=%prevy%-1")
if %prevd% LEQ 0 (
set /a "prevd=%days%+%prevd%"
set "prevm=%prevme%"
set "prevy=%prevye%")
set "match=true"
if not "%fd%"=="%prevd%" ( set "match=false")
if not "%fm%"=="%prevm%" ( set "match=false")
if not "%fy%"=="%prevy%" ( set "match=false")
if "%match%"=="true" (
copy c:\tcpfoss.452\%4 c:\tcpfoss.452\jnin\
copy c:\tcpfoss.452\log\%4 c:\tcpfoss.452\jnin\
move c:\tcpfoss.452\%4 w:\nbumail\journal
move c:\tcpfoss.452\log\%4 w:\nbumail\journal
)

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Сбой активации XP sp2


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.