Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] 40000 дней назад

Ответить
Настройки темы
CMD/BAT - [решено] 40000 дней назад

Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток форумчане!
Обращаюсь к Вам в надежде [надежда умирает последней ] что Вы поможете решить задачу:
1. Создать каталог с названием dir<дата>, где <дата> - дата, которая была 40000дней тому назад;
2. В каталог dir<дата> скопировать все файлы компьютера созданные с 12 дот 13 часов, и с 14 до 16 часов;
3. Количество файлов и их названия записать в файл report.log.
Заранее спасибо!

Отправлено: 15:44, 03-04-2010

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


насколько принципиально использование CMD ?.. просто на VBS будет на порядок проще

п.2 и 3 проблемы не составляют, но в п.1 без ф-ций даты весь календарь придется самому считать, как вариант алгоритма: идти от текущей даты "назад" - сначала годами (корректируя поправки на високосные года), а на последнем шаге днями (пример)

Отправлено: 13:29, 05-04-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


amel27, imho VBS препод не оценит ;-)

и почему многие так любят VBs - ведь это тупиковая технология; почему не Js, навыки работы с которым много где могут пригодится.

Отправлено: 15:18, 06-04-2010 | #3


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Для определения дыта которая было 40000 дней назад используй это: http://www.robvanderwoude.com/files/dateadd_nt.txt

Пример использования:
D:\7496~1\SM-prog\424A~1\BAT'~1>3 -40000

Starting date : 17.04.2010
Days subtracted : 40000
Resulting date : 11.10.1900

Отправлено: 17:33, 17-04-2010 | #4


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip BAT.zip
(2.5 Kb, 25 просмотров)

Всем спасибо за попытку решения проблемы. SMprog - Вам отдельное спасибо. Программу написал, ниже привожу ее код (ars.bat -название bat-файла, определяющего дату -40000; файлы рассматриваю только в каталоге C:\1):
Код: Выделить весь код
@ECHO OFF 
CALL ARS.BAT %DATE% -40000
FOR /F "SKIP=3 TOKENS=4,5* DELIMS=. " %%A IN (ARS.TXT) DO (
  SET DD=%%A
  SET MM=%%B
  SET YYYY=%%C
)
SET YY=%YYYY:~2,2%
SET DIRNAME=DIR%DD%%MM%%YY%
SET DAT=%DD%%MM%%YY%
SET /A IDX = 1
MKDIR %DIRNAME%

DIR C:\1  /A:-D /B >> FIL.TXT
 FOR /F %%X IN (FIL.TXT) DO (
	CALL :PR1 %%X
)

GOTO:EOF

:PR1
	SET A=%1
	FOR /F "TOKENS=2,4 DELIMS=: " %%Y IN ('DIR C:\1\%A% /-C ^| FINDSTR /R /B /C:"[0-9]*\.[0-9]*\.[0-9]*"') DO (
		CALL :PR2 %A% %%Y)

GOTO:EOF

:PR2 
	SET T=%2
	IF "%T%" GEQ "12" (
		IF "%T%" LEQ "13" (
			CALL COPY C:\1\%A% %DIRNAME% 
			SET ARC_FILE=%DAT%%A%
			REN %DIRNAME%\%A% %ARC_FILE%
			RAR A -DF -SL1258291 ARC.ZIP %DIRNAME%\%ARC_FILE%
			RAR VB ARC.ZIP > REPORT.LOG
			ECHO %IDX% >> REPORT.LOG
			SET /A IDX+=1
		)
	)	

	IF "%T%" GEQ "14" (
		IF "%T%" LEQ "16" (
			CALL COPY C:\1\%A% %DIRNAME% 
			SET ARC_FILE=%DAT%%A%
			REN %DIRNAME%\%A% %ARC_FILE%
			RAR A -DF -SL1258291 ARC.ZIP %DIRNAME%\%ARC_FILE%
			RAR VB ARC.ZIP>REPORT.LOG
			ECHO %IDX% >> REPORT.LOG
			SET /A IDX+=1
		)
	)
	
GOTO:EOF

Последний раз редактировалось marat-link, 26-04-2010 в 10:38. Причина: Добавил архив с bat-файлами


Отправлено: 10:34, 26-04-2010 | #5


Пользователь


Сообщения: 72
Благодарности: 27

Профиль | Сайт | Отправить PM | Цитировать


Busla,
Цитата:
и почему многие так любят VBs - ведь это тупиковая технология; почему не Js, навыки работы с которым много где могут пригодится.
Эту фразу можно так же адресовать и к BAT, тем не менее он живет, хотя и не развивается.
Отвечу на вопрос, все же. Они (многие) так любят VBS и BAT, потому что эти технологии очень просты в изучении, а текст кода прозрачен и легкочитаем!

-------
Статьи для системных инженеров http://www.sysengineering.ru


Отправлено: 14:21, 26-04-2010 | #6


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Вот еще несколько прямолинейный вариант решения.
Код: Выделить весь код
Echo off
rem CLS

rem -------------------
rem Предполагаю, что Дата в системе выдаётся в формате дд.мм.гггг чч:мм и т д (разделитель не важен) 
rem -------------------

Set NDays=40000
Set GdeNewDir=C:\Сказка про белого бычка\
Set Otkuda=D:\Update\
Set KudaLog=C:\Сказка про белого бычка\LogFile.txt

Set TimeTop1=12
Set TimeBot1=13

Set TimeTop2=14
Set TimeBot2=16

rem Выделяю из текущей даты день, месяц, год

Set Dt=%Date%

Set Day=%Dt:~0,2%
If %Day:~0,1%==0 Set Day=%Day:~1,1%

Set Mon=%Dt:~3,2%
If %Mon:~0,1%==0 Set Mon=%Mon:~1,1%

Set Yea=%Dt:~6,4%

rem Вычитаю из тек даты указ кол-во дней

Call :MinusDays

rem Создаю выходную директорию с пересчитанной датой в названии

Set OutDir=%GdeNewDir%Dir%Yea%%Mon%%Day%
MD "%OutDir%"

rem Копирую файлы изменённые в указанных временных промежутках 

Echo ----------------- %Date%  %Time% --------------- >>"%KudaLog%"
Set AllCopyFiles=0

for /R "%Otkuda%" %%i in (*.*) do Call :copy2time "%%~fi" "%%~ti" 

Echo ----------------- Всего скопировано файлов %AllCopyFiles% -------------->>"%KudaLog%" 

GoTo End


rem -------------------------------------------------------------
rem Процедура отнимает от даты заданное число дней
rem Дата содержится в трёх переменных Day Mon Yea
rem -------------------------------------------------------------

:MinusDays

Call :DelYear4
For /L %%D IN (1,1,%NDays%) Do Call :OldDt

If %Day% LSS 10 Set Day=0%Day%
If %Mon% LSS 10 Set Mon=0%Mon%

rem Echo %Yea% %Mon% %Day%
rem Pause 

GoTo End

rem -------------------------------------------------------------
rem Процедура отнимает от даты периоды в 4 года в отнимаемых днях
rem -------------------------------------------------------------

:DelYear4
REM 1461 - кол-во дней в 4 годах (с високосным)

If  %NDays% LSS 1461 GoTo End

Set /A iYea=%NDays%/1461
Set /A Yea=%Yea%-%iYea%*4
Set /A NDays=%NDays%-%iYea%*1461
GoTo End
rem -------------------------------------------------------------


rem ---------------------------------
rem Процедура отнимает от даты 1 день
rem ---------------------------------

:OldDt
Set /A Day=%Day%-1

If %Day% GTR 0 GoTo End

Set Day=31

Set /A Mon=%Mon%-1

If %Mon% GTR 0 GoTo BotDay

Set Mon=12
Set /A Yea=%Yea%-1

:BotDay
 
If Not %Mon%==2 GoTo Mon30
Set Day=28

Set iYea=%Yea%
Set /A iYea=%iYea%/4
Set /A iYea=%iYea%*4

If %Yea%==%iYea% Set Day=29
GoTo End 

:Mon30
If %Mon%==4 Set Day=30
If %Mon%==6 Set Day=30
If %Mon%==9 Set Day=30
If %Mon%==11 Set Day=30

GoTo End
rem ---------------------------------


rem ---------------------------------
rem Процедура копирует файлы изменённые в 2 заданных промежутках времени
rem ---------------------------------

:copy2time

Set TimeFile=%2

Set TimeFile=%TimeFile:~12,2%
If %TimeFile:~0,1%==0 Set TimeFile=%TimeFile:~1,1%

:Time1
If %TimeFile% LSS %TimeTop1% GoTo End
If %TimeFile% GEQ %TimeBot1% GoTo Time2
GoTo CopyFile

:Time2
If %TimeFile% LSS %TimeTop2% GoTo End
If %TimeFile% GEQ %TimeBot2% GoTo End
GoTo CopyFile

:CopyFile
Copy %1 "%OutDir%\" >Nul
Echo %1 %2 >>"%KudaLog%" 
Set /A AllCopyFiles=%AllCopyFiles%+1

GoTo End
rem ---------------------------------


:End
А насчёт VBS - Вам надо шашечки или ехать? Для автоматизации работы в Windows VBS удобнее JS (я начинал с JS, т к он более модный), так как почти 100% скриптов успешно отрабатывают в Excell, что даёт дополнительно очень мощные возможности

Последний раз редактировалось megaloman, 29-04-2010 в 20:07. Причина: Исправление ошибок после замечаний Amel27


Отправлено: 20:17, 28-04-2010 | #7


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Подавить сообщение Скопировано файлов: 1 мне не удалось »
как насчет ">Nul 2>Nul" ?

Цитата megaloman:
Set Day=%Dt:~0,2%
Set Mon=%Dt:~3,2%
числа, начинающиеся на "0" интерпретируются CMD как восьмиричные:
Код: Выделить весь код
Set /A V=09+1
PAUSE >Nul
как вариант - обрезать ведущие нули перед арифметическими операциями:
Код: Выделить весь код
If %DATE:~0,1%==0 (Set T_DAY=%DATE:~1,1%) Else Set T_DAY=%DATE:~0,2%
If %DATE:~3,1%==0 (Set T_MONTH=%DATE:~4,1%) Else Set T_MONTH=%DATE:~3,2%
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:39, 29-04-2010 | #8


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Amel27
Цитата:
числа, начинающиеся на "0" интерпретируются CMD как восьмиричные
не подозревал этого.
Самое плохое, что эта ошибка проявлялась бы далеко не каждый раз только для 08 и 09 в исходной дате.
Исправил указанные Вами ошибки. Не знаю, как это корректно с точки зрения поведения на форуме, но исправленный вариант записал вместо старого. Спасибо большое.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 19:57, 29-04-2010 | #9


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


megaloman, мои совсем старые батники на этом форуме остались с этой ошибкой

Отправлено: 03:31, 30-04-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] 40000 дней назад

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Warhammer 40000: Dawn Of War 2 artem7890 Игры 2 15-12-2009 22:37
компьютер для игр до 40000 рублей OBLIVION555 Выбор отдельных компонентов компьютера и конфигурации в целом 2 28-07-2009 06:13
Назад в будущее! Или EcomStation 1.2.5 ecom Новости и флейм из мира *nix 13 05-09-2007 22:12
как все вернуть назад.... ANDRY Microsoft Windows 95/98/Me (архив) 4 11-08-2002 17:14




 
Переход