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

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

Автор: LunQ
Дата сообщения: 07.06.2010 12:46

Цитата:
Если не получается, то в каком виде ошибка выходит, отдельным окошком как ERROR?

Отдельным окошком:
http://s003.radikal.ru/i203/1006/fc/71bc1682bae7.gif
Автор: wolf0425
Дата сообщения: 07.06.2010 13:21
LunQ а что пишет в таком случае
if exist j:\nul if exist j:\MYFOLDER set MYDISK=j:
тоже ошибку?
Автор: Artem_Butenko
Дата сообщения: 07.06.2010 15:25
Ребята, пожалуйста, подскажите в чем ошибка данной комманды:

Start /Wait "Install Files\Install.exe"

Файл Install.exe попросту не запускается. Батч-файл, содержащий данную комманду, лежит рядом с папкой Install Files. Буду рад любому конструктивному предложению!
Автор: yurkesha
Дата сообщения: 07.06.2010 15:41
Artem_Butenko
Start "" /Wait "Install Files\Install.exe"

Добавлено:
wolf0425
Так не сработает - можешь опробовать на a: - проблема собственно в том что точка монтирования есть, а тома нет...

LunQ
а вот вариант с
fsutil.exe fsinfo volumeinfo j:\&&(if exist "j:\MYFOLDER" set "MYDISK=j:")
должен пройти...
Автор: BagaBaga
Дата сообщения: 07.06.2010 16:48
Возможно ли (с помощью sed) из файла получить другой путем замены n-ой (для определенности - четвертой) строки другой, полученной из нее (из заменяемой) путем замены 6 символов, начиная с Z позиции (для определенности 20-ой), на заданные символы (для примера asdfgh)
Автор: LunQ
Дата сообщения: 07.06.2010 17:23

Цитата:
if exist j:\nul if exist j:\MYFOLDER set MYDISK=j:
тоже ошибку?

Та же ошибка.


Цитата:
а вот вариант с
fsutil.exe fsinfo volumeinfo j:\&&(if exist "j:\MYFOLDER" set "MYDISK=j:")
должен пройти...

А вот с этим заработало, СПАСИБО!!!
Автор: wolf0425
Дата сообщения: 07.06.2010 18:48
BagaBaga если я правильно разобрал твои условия (заменить 6 символов в 4й строке, начиная с 20й позиции на явно указанные) то так:

sed -r "4 {s/^(.{19}).{6}/\1asdfgh/}" <file1 >file2

если нужная строка короче 25 символов - то замены не произойдет.
Автор: barsikline
Дата сообщения: 08.06.2010 05:44

Цитата:

Пиши батник в кодировке WINDOWS 1251 ANSI и вначале батника ставь
chcp 1251
двойными кавычками все пути экранируй.
А вообще надо %errorlevel% каждой папки загонять в переменнуюи сравнивать их

С кодировкой пробывал та же хрень...



Цитата:
Цитата:
дата которых больше по сравнению с другими
это типа самая свежая папка нужна? вопрос тоже надо уметь задавть подробно, чётко, ясно и точно.
Цитата:
Необходимо чтобы с ftp качались все файлы или целиком папка дата которых больше по сравнению с другими.
плохая постановка задачи.

Да нужна самая свежая папка. т.е по сути нужно сделать так, чтобы сравнивались даты файлов и выбирались самые свежие ))), а потом качались все файлы с этой датой.
Автор: wolf0425
Дата сообщения: 08.06.2010 06:11

Цитата:
С кодировкой пробывал та же хрень...
ты фонт то у окна переключи на люсиду, а то кракозябры читать любителей мало.
Автор: barsikline
Дата сообщения: 08.06.2010 07:40
wolf0425

Цитата:
ты фонт то у окна переключи на люсиду, а то кракозябры читать любителей мало

там просто прописан путь к файлам... к примеру, "Инструкциия и документация"/"Техническая документация"/"МТ1 РТО и ОФЗ"
Автор: wolf0425
Дата сообщения: 08.06.2010 07:48

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

насколько я понял - сервер интранетовский и посторонние на его зайти потестировать не могут?

на локальном iis у меня код вполне делает то что должен

Код: @echo off
chcp 1251
(echo user anonymous anonymous
echo cd "/Инструкциия и документация/Техническая документация/МТ1 РТО и ОФЗ/"
echo ls -t
echo pwd
) | ftp -n localhost
Автор: dvymp4
Дата сообщения: 08.06.2010 09:24
Подскажите пожалуйста, почему не работает конструкция:
FOR /F "tokens=*" %%I in ('DIR "%variable_1%" | FIND "%variable_2%"') DO ECHO %%I

Пишет:
Непредвиденное появление: |.

Извиняюсь если вопрос уже обсуждался, читать всю тему просто нет сил. BAT файлы пишу нечасто, а тут вот потребовалось.

Помогите пожалуйста.
Автор: yurkesha
Дата сообщения: 08.06.2010 09:26
dvymp4 - все что надо добавить:
^|
Автор: dvymp4
Дата сообщения: 08.06.2010 09:36
Спасибо ОГРОМНОЕ!!!
Автор: Mark_Titov
Дата сообщения: 08.06.2010 12:37
Доброго дня уважаемые гуру...
Помогите пож-ста.

Пытаюсь сделать небольшую систему, которая бы грубо говоря пингами проверяла бы наличие связи. Состоит она вся из батников.
В кратце - пингует, если пинги не прошли пишет логи и отсылает на мыло - это я сделал, отладил - все работает.
Вторая часть этой системы - статистический модуль который тоже пингует объект, создает папки, в них пишет ежедневные логи и на основе ежедневных
логов выводит в отдельном файле txt ежемесячный лог с подсчетом средне-арифметического процента потери связи за месяц.
Потом пишет этот ежемесячный отчет в htm файл и отправляет на мыло...
Так вот со второй частью у меня проблемы возникли.
Не правильно ведет подсчет ежемесячных потерь и пишет ошибку "Missing operator".

Вот весь код -


Код: @echo off
SetLocal EnableDelayedExpansion
:ping
cls
set /a day_sum=0
set /a day_count=0
set /a mes_sum=0
set /a mes_count=0
set /A count=count+1
Title Pinging number %count%
set "site=127.255.255.255"
set "mes=%date:~-7%"
1>nul 2>&1 MD "%systemdrive%\AN-80\%mes%\%date%"
set "Log=%systemdrive%\AN-80\%mes%\%date%\log.txt"
for /f "tokens=2 delims=()" %%a in ('ping -n 4 %site%') do echo.%date% %time:~,8% %%a>> %log%
for /f "tokens=3 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\%date%\log.txt) do set /a day_sum=!day_sum!+%%a*100 & set /a day_count=!day_count!+1
set /a day_average=(%day_sum%)/(%day_count%)+10000
set /a day_average_int=!day_average:~0,-2!-100
echo.>> %systemdrive%\AN-80\%mes%\Monthly-report.txt
echo Средне-арифметический процент потери связи за %date% составил - %day_average_int%.%day_average:~-2%%%> %systemdrive%\AN-80\%mes%\%date%\Daily-report.txt
echo.> %systemdrive%\AN-80\%mes%\Monthly-report.txt
for /r %systemdrive%\AN-80\%mes% %%a in (Daily-report.txt) do if exist %%a type %%a>> %systemdrive%\AN-80\%mes%\Monthly-report.txt

for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do set /a mes_sum=!mes_sum!+%%a*100 & set /a mes_count=!mes_count!+1
set /a mes_average=(%mes_sum%)/(%mes_count%)+10000
set /a mes_average_int=!mes_average:~0,-2!-100

echo.>> %systemdrive%\AN-80\%mes%\Monthly-report.txt
echo>> %systemdrive%\AN-80\%mes%\Monthly-report.txt -------------------------------------------------------------------------
echo Средне-арифметический процент потери связи за %mes% составляет - %mes_average_int%.%mes_average:~-2%%%>> %systemdrive%\AN-80\%mes%\Monthly-report.txt
goto :ping
Автор: yurkesha
Дата сообщения: 08.06.2010 12:55
Mark_Titov
Вообще неплохо было бы привести кусок файла статистики - чтоб не возиться с его созданием...
Попробуй так:
do (set /a mes_sum=!mes_sum!+%%a*100 & set /a mes_count=!mes_count!+1)
Автор: res2001
Дата сообщения: 08.06.2010 13:02
Mark_Titov

Цитата:
for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do set /a mes_sum=!mes_sum!+%%a*100 & set /a mes_count=!mes_count!+1
set /a mes_average=(%mes_sum%)/(%mes_count%)+10000
set /a mes_average_int=!mes_average:~0,-2!-100

На сколько я понимаю в цикле должны выполняться первые 2 set. Тогда оформи цикл так:


Код: for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do (
set /a mes_sum=!mes_sum!+%%a*100
set /a mes_count=!mes_count!+1
)
set /a mes_average=(%mes_sum%)/(%mes_count%)+10000
set /a mes_average_int=!mes_average:~0,-2!-100
Автор: yurkesha
Дата сообщения: 08.06.2010 13:05
Mark_Titov
И кстати - "Missing operator" - это ругань на первую часть:
Код: for /f "tokens=9 delims=%% "
Автор: wolf0425
Дата сообщения: 08.06.2010 13:47

Код: for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do set /a mes_sum=!mes_sum!+%%a*100 & set /a mes_count=!mes_count!+1
Автор: Mark_Titov
Дата сообщения: 08.06.2010 14:07
...пробовал ваши варианты - ругается на суммы, но считает - (опять же теряя 1% при расчетах)

Код: set /a mes_sum=!mes_sum!+23.28 & set /a mes_count=!mes_count!+1
Missing operator.

set /a mes_sum=!mes_sum!+73.20 & set /a mes_count=!mes_count!+1
Missing operator.

set /a mes_sum=!mes_sum!+18.75 & set /a mes_count=!mes_count!+1
Missing operator.
Автор: wolf0425
Дата сообщения: 08.06.2010 14:08
а вообще батник ругается не на выделенную красным часть строки, а на предыдущее присваивание -
set /a mes_sum=!mes_sum!+%%a*100
ещё бы ему не ругаться при %%a равном 100.00
считает соответсвенно тоже неверно - строка трактуется как !mes_sum! + 100
где 100 - это целая часть от 100.00, остаток выражения отбрасывается как бред.
Автор: Mark_Titov
Дата сообщения: 08.06.2010 14:09

Цитата:
или > в нижней строке потеряно или верхняя ничего не делает

...так по другому он вообще не правильно считает

Добавлено:

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

...Да там просто запустить этот батник - он создаст папку с датой и логами, переименовываешь эту папку на вчерашнюю дату и запускаешь батник еще раз - он создаст еще одну папку уже с сегодняшним числом и в Monthly-report.txt будет статистика которую батник и подсчитывает - тогда и будут косяки видны...
Автор: wolf0425
Дата сообщения: 08.06.2010 14:25

Цитата:
...так по другому он вообще не правильно считает
как обнуление файла после того как мы в него что-то записали влияет на правильность подсчета, который неправилен по жизни и прописан в другом месте?
Автор: ComradG
Дата сообщения: 08.06.2010 14:43
01MDM
Ooooops!

Код: set /a "month=1%month%-100"
for /f "tokens=%month%" %%i in ("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec") do set "month=%%i"
Автор: Mark_Titov
Дата сообщения: 08.06.2010 14:48
wolf0425

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

...при обнулении он пересчитывает все заново и подсчитывает средний результат.
А на счет в другом месте - он же и создает эти файлы с папками и пути в нем де прописаны...

Просто код скопируй - сделай батник и запусти, там все понятно будет...
Автор: wolf0425
Дата сообщения: 08.06.2010 15:07
Mark_Titov
Цитата:
...при обнулении он пересчитывает все заново и подсчитывает средний результат.
при этом - подсчитывает текущую статистику за день и за месяц на каждом проходе пинга, я в курсе.
ты чем спорить - лучше бы сам задумался/проверил что изменится если первую из трех процитированных строк тупо удалить.

а хотел ты написать видимо вот это:

Код: @echo off
chcp 1251

:ping
rem cls
set /a day_sum=0
set /a day_count=0
set /a mes_sum=0
set /a mes_count=0
set /A count=count+1
Title Pinging number %count%
set "site=127.255.255.255 -w 10"
set "mes=%date:~-7%"
1>nul 2>&1 MD "%systemdrive%\AN-80\%mes%\%date%"
set "Log=%systemdrive%\AN-80\%mes%\%date%\log.txt"

for /f "tokens=2 delims=()" %%a in ('ping -n 4 %site%') do 1>>%log% echo.%date% %time:~,8% %%a
for /f "tokens=3 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\%date%\log.txt) do set /a day_sum += %%a*100 & set /a day_count += 1

set /a day_average=(%day_sum%)/(%day_count%) +10000
set /a day_average_int = %day_average:~0,-2% -100

1>%systemdrive%\AN-80\%mes%\Monthly-report.txt        echo.%date% %time:~0,-3%
1>%systemdrive%\AN-80\%mes%\%date%\Daily-report.txt     echo Средне-арифметический процент потери связи за %date% составил = %day_average_int%.%day_average:~-2%%%

for /f "delims=" %%a in ('dir /b /s %systemdrive%\AN-80\%mes%\Daily-report.txt') do type %%~fa 1>> %systemdrive%\AN-80\%mes%\Monthly-report.txt
for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do set "mes_tmp=%%a" & set /a mes_count += 1 & call set /a mes_sum += %%mes_tmp:.=%%

set /a mes_average=(%mes_sum%)/(%mes_count%)+10000
set /a mes_average_int=%mes_average:~0,-2%-100
set mes_
1>> %systemdrive%\AN-80\%mes%\Monthly-report.txt (
    echo.
    echo -------------------------------------------------------------------------
    echo Средне-арифметический процент потери связи за %mes% составляет - %mes_average_int%.%mes_average:~-2%%%
)

rem goto :ping
Автор: Mark_Titov
Дата сообщения: 08.06.2010 15:53
wolf0425, спасибо тебе большое.

Цитата:
десятые доли процента дневной статистики - тупо игнорируются

...Действительно -


Цитата:
08.06.2010 17:42:16
Средне-арифметический процент потери связи за 08.06.2010 составил = 18.47%

-------------------------------------------------------------------------
Средне-арифметический процент потери связи за 06.2010 составляет - 18.00%



Цитата:
или надо чего-то с ними придумывать?

...Пожалуйста, если не трудно, очень прошу.
А, можно сделать так - если есть несколько папок с log.txt и Daily-report на разные даты, то что бы он во всех имеющихся подпапках МЕСЯЦА пересчитывал заново и переписывал Monthly-report?

Огромное спасибо за твой труд wolf0425...
Автор: wolf0425
Дата сообщения: 08.06.2010 15:55

Цитата:
..Пожалуйста, если не трудно, очень прошу.
придумал уже, код перезалит


Добавлено:

Цитата:
А, можно сделать так - если есть несколько папок с log.txt и Daily-report на разные даты, то что бы он во всех имеющихся подпапках МЕСЯЦА пересчитывал заново и переписывал Monthly-report?
да всё можно, только не всё нужно. это же небыстрая и жужжащая винтом операция получится.

и у тебя чего-то странное в хотелке:
все Daily-report и в этой версии заново сканируются при каждом создании Monthly-report.
который - единственный в папке месяца и на каждом проходе пересоздается.
так же на каждом проходе пересчитывается текущий Daily-report

напиши заново чего хочешь - чтоб Monthly-report пересчитывался на основании всех log.txt текущего месяца, а не на основании всех Daily-report что-ли?
или все Daily-report за предыдущие дни месяца - тоже предлагается пересчитывать?
Автор: Mark_Titov
Дата сообщения: 08.06.2010 16:10

Цитата:
придумал уже, код перезалит

...Красиво wolf0425!!! Ну ты крут должен сказать...

Спасибо тебе огромное, дружище, как всегда выручил!...
Снимаю шляпу!...

Добавлено:

Цитата:
единственный в папке месяца и на каждом проходе пересоздается.

...вот щас он не пересоздается. Пробовал удалить, код не пересоздал и не пересчитал log.txt.

Добавлено:

Цитата:
напиши заново чего хочешь - чтоб Monthly-report пересчитывался на основании всех log.txt текущего месяца, а не на основании всех Daily-report что-ли?

C последним вариантом кода попробуй создай еще одну папку вчерашним числом и удали из нее Daily-report и еще раз запусти код и посмотри что он посчитает...
Автор: wolf0425
Дата сообщения: 08.06.2010 16:27

Цитата:
...вот щас он не пересоздается. Пробовал удалить, код не пересоздал и не пересчитал log.txt.
ты чего-то путаешь, Monthly-report.txt - пересоздается

Цитата:
попробуй создай еще одну папку вчерашним числом и удали из нее Daily-report и еще раз запусти код и посмотри что он посчитает...
да я и так скажу что посчитает на один Daily-report меньше - в цикле пересчитывается только сегодняшний Daily-report, существующие старые просто окучиваются для генерации Monthly-report.txt.

можно не набор Daily-report.txt окучивать, а генерить статистику просто на основе всех суточных log.txt, вообще не создавая Daily-report
но тут возникает вопрос - а какая точно статистика нужна. выше вопрос про 50% потерь за два дня видишь?

[more=держи переделанную версию]
Код: @echo off
chcp 1251 >nul

:ping
rem cls
set /a mes_sum=0
set /a mes_count=0
set /A count=count+1
Title Pinging number %count%
set "site=127.255.255.255 -w 10"
::set "site=127.0.0.1 -w 10"
set "mes=%date:~-7%"
2>nul MD "%systemdrive%\AN-80\%mes%\%date%"
set "Log=%systemdrive%\AN-80\%mes%\%date%\log.txt"


1>%systemdrive%\AN-80\%mes%\Monthly-report.txt        echo.%date% %time:~0,-3%

for /f "tokens=2 delims=()" %%a in ('ping -n 4 %site%') do 1>>%log% echo.%date% %time:~,8% %%a

for /d %%d in ( "%systemdrive%\AN-80\%mes%\*") do call :day %%d

for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do call :report %%a
set /a mes_average = %mes_sum% / %mes_count% +10000
set /a mes_average_int = %mes_average:~0,-2% -100
set "mes_average_int= %mes_average_int%"
set "mes_average_int=%mes_average_int:~-3%"

1>> %systemdrive%\AN-80\%mes%\Monthly-report.txt (
echo ---------------------------------------------------------------------------
echo Средне-арифметический процент потери связи за %mes% составляет - %mes_average_int%.%mes_average:~-2%%%
)

rem goto :ping
exit

:day
rem echo %~nx1
set /a day_sum=0
set /a day_count=0
for /f "tokens=3 delims=%% " %%a in (%1\log.txt) do set /a day_sum += %%a*100 & set /a day_count += 1
set /a day_average = %day_sum% / %day_count% +10000
set /a day_average_int = %day_average:~0,-2% -100
set "day_average_int= %day_average_int%"
set "day_average_int=%day_average_int:~-3%"

1>>"%systemdrive%\AN-80\%mes%\Monthly-report.txt" echo Средне-арифметический процент потери связи за %~nx1 составил = %day_average_int%.%day_average:~-2%%%
exit /b

:report
set "mes_tmp=%1"
set /a mes_count += 1
set /a mes_sum += %mes_tmp:.=%
exit /b

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

Предыдущая тема: XP не видит второй раздел на съемном USB-HDD


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