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

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

Автор: Maximus777
Дата сообщения: 12.10.2010 16:27
01MDM
спасибо и за такой вариант. Код от GORA2 у меня сработал не так, как мне надо. Но думаю трабл где-то не в коде. Вывод был с полными путями. Попробую ваш.
Автор: res2001
Дата сообщения: 12.10.2010 19:37
Maximus777
Доделал перевод даты/времени в секунды и назад:
[more=тут]Код перевода даты/времени в секунды от начала эпохи и назад.
Дата время задается в переменных YEAR,MONTH,DAY,HOUR,MIN,SEC, сейчас берется текущая дата/время.
Начало эпохи задается в YEARBEGIN.
Процедура dat2timestamp - вычисляет секунды от начала эпохи, timestamp2date - обратная операция.

Код: @ECHO OFF
SetLocal EnableDelayedExpansion
set "YEARBEGIN=1970"
set "YEAR=%date:~6,4%"
set /a "DAY=1%date:~,2%-100"
set /a "MONTH=1%date:~3,2%-100"
rem set "DAY=42"
rem set "MONTH=10"
rem set "YEAR=1991"
set /a "HOUR=1%time:~,2%-100"
set /a "MIN=1%time:~3,2%-100"
set /a "SEC=1%time:~6,2%-100"
set /a "TOTALSEC=0"

rem Инициализация таблиц длин месяцев
rem 1 2 3 4 5 6 7 8 9 10 11 12
set "regul=31 28 31 30 31 30 31 31 30 31 30 31"
set "visok=31 29 31 30 31 30 31 31 30 31 30 31"

echo %DAY%.%MONTH%.%YEAR% %HOUR%:%MIN%:%SEC%
call:date2timestamp %YEAR% %MONTH% %DAY% %HOUR% %MIN% %SEC%
set TOTALSEC
call :timestamp2date %TOTALSEC%
echo %DAY%.%MONTH%.%YEAR% %HOUR%:%MIN%:%SEC%
exit

rem перевести секунды в дату
rem %1 - timestap время в секундах с 01.01.%YEARBEGIN%
rem Возврат в переменных YEAR, MONTH, DAY, HOUR, MIN, SEC
:timestamp2date
set "TT=%1"
set /a "SEC=TT%%60"
set /a "TT=(TT-SEC)/60"
set /a "MIN=TT%%60"
set /a "TT=(TT-MIN)/60"
set /a "HOUR=TT%%24"
set /a "TT=(TT-HOUR)/24"
set /a "YEAR=TT/365"
set /a "TT-=YEAR*365"
set /a "YEAR=YEAR+YEARBEGIN"
for /l %%i in (%YEARBEGIN%,1,%YEAR%) do (
call:isleap %%i
set /a "TT-=LEAP"
)
set /a "TT+=LEAP"
set "MONTH=1"
if %LEAP% equ 1 (set "mdays=%visok%") else (set "mdays=%regul%")
for %%i in (%mdays%) do (
if %%i gtr !TT! goto:step3
set /a "TT-=%%i"
set /a "MONTH+=1"
)
:step3
set /a "DAY=TT+1"
set "TT="
exit /b

rem перевести дату в секунды
rem %1 - год (4 знака), %2 - месяц (1-12) %3 - день (1-31) %4 - часы (0-23) %5 - минуты (0-59) %6 - секунды (0-59)
:date2timestamp
rem yearsecs=31536000 HOURSSEC=3600 daysecs=86400
set /a "TOTALSEC=(%1-YEARBEGIN)*31536000"
for /l %%i in (%YEARBEGIN%;1;%1) do (
call:isleap %%i
if !LEAP! equ 1 set /a "TOTALSEC+=86400"
)
call:isleap %1
if %LEAP% equ 1 (call:month2sec "%visok%" %2) else (call:month2sec "%regul%" %2)
set /a "TOTALSEC+=(%3-1)*86400"
set /a "TOTALSEC+=%4*3600"
set /a "TOTALSEC+=%5*60+%6"
exit /b

rem определяет високосность года
rem Если год точно делится на 4, но не делится на 100 или если он точно делится на 400
rem function isleap(year)
rem возврат в переменной LEAP=1 - год высокосный, иначе - 0
:isleap
set "LEAP=0"
set /a "L1=%1%%4"
set /a "L2=%1%%100"
set /a "L3=%1%%400"
if %L1% equ 0 if %L2% neq 0 set "LEAP=1"
if %L3% equ 0 set "LEAP=1"
set L1=
set L2=
set L3=
exit /b

rem %1 - массив regul или visok, %2 - текущий месяц
:month2sec
set /a "COUNT=1"
for %%i in (%~1) do (
if !COUNT! LSS %2 set /a "TOTALSEC+=%%i*86400"
set /a "COUNT+=1"
)
set COUNT=
exit /b
Автор: Maximus777
Дата сообщения: 13.10.2010 06:59
res2001
нехилый получился кусок кода. Спасибо. Может пригодится когда. С разбором обычной даты конечно коду меньше, пока его юзаю. В Линуксе зато кайф, просто опция команды и дата в секундах.

Добавлено:
Подскажите плиз, как надо правильно. Данный кусок не работает:

Код: for /r %%i in (.) do (
set curdir=%%i:~0,-1%
echo %curdir%
)
Автор: res2001
Дата сообщения: 13.10.2010 09:11
Maximus777
Цитата:

Подскажите плиз, как надо правильно. Данный кусок не работает:

Со счетчиками внутри цикла и параметрами такая фишка не прокатывает. Надо предварительно присвоить переменной, а затем уже вырезать куски из нее.

Код: SetLocal EnableDelayedExpansion
for /r %%i in (.) do (
set curdir=%%i
set curdir=!curdir:~0,-1!
echo !curdir!
)
Автор: wolf0425
Дата сообщения: 13.10.2010 09:17

Цитата:
но мне сам принцип внутри цикла интересен.
ошибок аж две:
для переменной типа %%i не работает обрезание по длине и прочие прелести :~
внутри цикла echo %curdir% работает не так как тебе бы хотелось - значение %curdir% подставляется то, что было до старта цикла. поэтому смотри пример выше по странице с SetLocal enabledelayedexpansion и echo !ti:%msc%=!

Автор: Maximus777
Дата сообщения: 13.10.2010 09:21

Цитата:
Надо предварительно присвоить переменной, а затем уже вырезать куски из нее.

Спасибо. Работает!
Автор: SANIOK_AV
Дата сообщения: 13.10.2010 09:24
01MDM

Цитата:
Код:
@echo off
setlocal
1>nul chcp 1251

set "regroot=HKLM\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}"

for /f "tokens=3*" %%i in ('reg query "%regroot%" /s ^| findstr "Name"') do echo %%i %%j

1>nul chcp 866

Подскажите пожалуйста как работают конструкции

Код: 1>nul chcp 1251
Автор: Maximus777
Дата сообщения: 13.10.2010 09:29
wolf0425
Цитата:
SetLocal enabledelayedexpansion и echo !ti:%msc%=!

Объясните плиз на пальцах, что происходит в ti:%msc%= ?
Автор: king_stiven
Дата сообщения: 13.10.2010 09:47
Maximus777
шапка

Цитата:
setlocal enabledelayedexpansion и переменные окружения

А также запустить батник без
@echo off
и с
pause
в конце батника и смотреть, думать.
Также
set /?
там всё понятно
Автор: Maximus777
Дата сообщения: 13.10.2010 09:47

Код: E:\distr\Utils>attrib
Не найден файл: E:\distr\Utils\*.*
Автор: 01MDM
Дата сообщения: 13.10.2010 09:50
SANIOK_AV

Цитата:

Подскажите пожалуйста как работают конструкции

1>nul chcp 1251

Ты берешь значения из реестра, которые в виндовой кодировке (cp1251), а консоль в OEM-кодировке (cp866). Для нормального отображения кириллических названий в консоли используется команда 'chcp 1251', "1>nul" подавляет служебный вывод этой команды.

Автор: Maximus777
Дата сообщения: 13.10.2010 09:52

Цитата:
А также запустить батник без
@echo off
и с
pause
в конце батника и смотреть, думать.

Не помогает. Сделал даже так:

Код: for /R %%i in (*.*) do (
Set ti=%%i
echo %%i
echo !ti:%msc%=!
Автор: king_stiven
Дата сообщения: 13.10.2010 10:11

Код: SetLocal enabledelayedexpansion
for /R %%i in (*.*) do (
Set ti=%%i
1>>1.txt echo !ti:%cd%\=!
)
Автор: wolf0425
Дата сообщения: 13.10.2010 10:27

Цитата:
Строки просто дублируются и всё. Просто в двух словах скажите, что там такое делается. Именно в !ti:%msc%=!
чтение set /? не помогло?
в echo !ti:%msc%=! - печатается значение переменной ti, получающееся после удаления (замены на ничто) из неё подстроки равной значению %msc%
Автор: Maximus777
Дата сообщения: 13.10.2010 10:36
king_stiven
Цитата:
запусти мой батник и смотри 1.txt

Всё. Понял.

Добавлено:
wolf0425
Цитата:
в echo !ti:%msc%=! - печатается значение переменной ti, получающееся после удаления (замены на ничто) из неё подстроки равной значению %msc%

Вот это мне и хотелось узнать. Спасибо. В справке непонятно было как получить такой эффект.
Автор: GORA2
Дата сообщения: 13.10.2010 11:23
Maximus777

Цитата:
Код от GORA2 у меня сработал не так, как мне надо

Извиняюсь, еще раз перечитал условия, поправил ниже, хотя это уже написал king_stiven.

01MDM

Цитата:
Вариант не совсем надежен, не будет корректно работать если в названии будет "!"

Согласен. Но в путях\названиях могут встречаться не только "!", а и другие спец символы, как то "%", "(", ")" и т.д. Задачу не всегда можно решить... Я считаю, что применение спец. символов в путях - моветон. Мне довелось разбираться с неработающим батником который запускался в системной временной папке, а папка у пользователя была: C:\Windows\%Temp%\
Вот и попробуй предусмотреть такой вариант!

А конкретно по "!" и если речь идет только о выводе списка в консоль, то можно и так:
Код: @echo off
for /R %%i in (*.*) do (
    Set ti=%%i
    Call echo %%ti:%CD%\=%%
)
Pause
Автор: SANIOK_AV
Дата сообщения: 13.10.2010 12:38
01MDM

Цитата:
Ты берешь значения из реестра, которые в виндовой кодировке (cp1251), а консоль в OEM-кодировке (cp866). Для нормального отображения кириллических названий в консоли используется команда 'chcp 1251', "1>nul" подавляет служебный вывод этой команды.

Спасибо большое!!!
Автор: Inside13
Дата сообщения: 13.10.2010 14:44
Хелп) Программа проверяет подпись файлов из списка srv_log.txt

Код: @Echo Off
del srv_log.txt
eventcreate /L Application /T INFORMATION /SO Sigcheck /ID 747 /D "Sigcheck started"
For /F %%A In (sclst.txt) Do sigcheck -q -u %%A>>srv_log.txt
For /F %%i in (srv_log.txt) Do eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D "%%i"
Автор: king_stiven
Дата сообщения: 13.10.2010 14:57
Inside13
Если первую строку то
...
For /F %%i in (srv_log.txt) do (
eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D "%%i"
goto :eof
)
Автор: Inside13
Дата сообщения: 13.10.2010 15:15
2 king_stiven
Сори, я немного не правильно вопрос поставил:

Код: For /F %%i in (srv_log.txt) Do eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D "%%i"
Автор: res2001
Дата сообщения: 13.10.2010 15:24
Inside13
а пути к DLL какие в этом файле? Все в system32 ведут или есть еще куда?
Или скажем у тебя там в путях только DLL файлы или могут быть разные?
Короче, нужна строка для фильтрации, по которой можно было бы отделить зерна от плевел.
Автор: Inside13
Дата сообщения: 13.10.2010 15:40
res2001
все файлы \system32\ и все, эти файлы из списка sclst.txt (только DLL и EXE)
я пока накодил тут для "No matching files"

Код: @Echo Off
del srv_log.txt
eventcreate /L Application /T INFORMATION /SO Sigcheck /ID 747 /D "Sigcheck started"
For /F %%A In (sclst.txt) Do sigcheck -q -u %%A>>srv_log.txt
For /F %%i in (srv_log.txt) Do (
If "%%i"=="No" eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D "Not enough Files"
)
Автор: res2001
Дата сообщения: 13.10.2010 15:56
Inside13
For /F "tokens=* delims=" %%i in ('findstr /i "windows matching" ^<srv_log.txt') Do (
eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D %%i
)
Автор: Inside13
Дата сообщения: 13.10.2010 16:08
res2001
Спасибо, на тест файле работает, запустил уже почти рабочую версию ) думаю все ок будет
еще раз сенкс, все работает норм)
Автор: king_stiven
Дата сообщения: 14.10.2010 10:29
Прошу проверить на истинность: команда echo "% %#&&@4$$? % ?? №а;: ? & ? *" всегда правильно сработает, если обрамлена двойными кавычками, несмотря на любые проблемные знаки кроме двойных кавычек.
Автор: BagaBaga
Дата сообщения: 14.10.2010 11:04
Как с помощью sed сделать такое:
есть файл, в нем только одна строка.
Если в строке две и менее фамилий (фамилии разделены запятыми, т.е. в строке не более 1 запятой), то вернуть строку как есть.
Если в строке 3 и более фамилии (т.е. 2 и более запятые), то, если первый символ русский, вернуть Первая_Фамилия и др., если английский - Famili et al.

Т.е.
Иванов И.И. => Иванов И.И.
Иванов И.И., Петров П.П. => Иванов И.И., Петров П.П.
Иванов И.И., Петров П.П., Сидоров С.С. => Иванов И.И. и др.
Ivanov I.I., Petrov P.P, Sidorov S.S.=> Ivanov I.I. et al.



Автор: wolf0425
Дата сообщения: 14.10.2010 13:21
king_stiven команда echo трактует неудвоенные символы % как служебные (начало/конец переменной) со всеми вытекающими...


Добавлено:
BagaBaga вроде так:

Код: @echo off
chcp 1251
sed -r "s/([a-z][^,]*),.*/\1 et al./gi;s/([^,]*),([^,]*),.*/\1,\2, и др./gi" <file1
Автор: king_stiven
Дата сообщения: 14.10.2010 14:11
wolf0425
понял, если вводить в батник как %1(сбрасывать файлы на батник мышкой) то нормально всё, а если непосредственно в батнике написать, то команда echo трактует неудвоенные символы % как служебные
Автор: wolf0425
Дата сообщения: 14.10.2010 15:39

Цитата:
если вводить в батник как %1(сбрасывать файлы на батник мышкой) то нормально всё
ага, %1 и переменные циклов - подставляются в команды без прохода по ним препроцессором.
Автор: Accessor
Дата сообщения: 14.10.2010 17:26
Народ, а кто решал задачу получения своего внешнего IP из командного файла? Есть какие-нибудь наработки?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Windows 7 Starter


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