Доброго дня всем!
Решал задачу сверять файлы, имеющиеся у пользователя в папке и вложенных подпапках, с файлами-эталонами, и в случае, если в эталоне появляются новые (по дате модификации), автообновлять их у пользователя.
Те файлы, которые отсутствуют у пользователя, но имеются в эталоне, копироваться не должны.
Скрипт должен работать на XP, поэтому robocopy не применим. Приводимый вариант, как будто, работает, но есть два вопроса:
1. Подскажите, пожалуйста, как можно, не слишком раздувая код, избежать вывода в консоли сообщений от вложенных в циклы FOR команд DIR, в случае, если они не находят в искомой папке файлов (echo off на них не влияет);
2. Каким образом лучше организовать автоматическое закрытие файлов exe, которым требуется обновление, в случае, если они открыты у пользователя (вопрос утерянных данных не актуален).
Решал задачу сверять файлы, имеющиеся у пользователя в папке и вложенных подпапках, с файлами-эталонами, и в случае, если в эталоне появляются новые (по дате модификации), автообновлять их у пользователя.
Те файлы, которые отсутствуют у пользователя, но имеются в эталоне, копироваться не должны.
Скрипт должен работать на XP, поэтому robocopy не применим. Приводимый вариант, как будто, работает, но есть два вопроса:
1. Подскажите, пожалуйста, как можно, не слишком раздувая код, избежать вывода в консоли сообщений от вложенных в циклы FOR команд DIR, в случае, если они не находят в искомой папке файлов (echo off на них не влияет);
2. Каким образом лучше организовать автоматическое закрытие файлов exe, которым требуется обновление, в случае, если они открыты у пользователя (вопрос утерянных данных не актуален).
CMD/BATCH:
@Echo off
SetLocal EnableDelayedExpansion
SET WorkDir=D:\Test
SET SourceDir=%WorkDir%\Source\
SET TargetDir=%WorkDir%\Target\
Call :perebor_target_dirs
goto :end
:perebor_target_dirs
FOR /R %TargetDir% %%t IN (.) DO (
SET TempTargetDir=%%t
SET TempTargetDir=!TempTargetDir:~0,-1!
Call SET TempSourceDir=%SourceDir%%%TempTargetDir:%TargetDir%=%%
Call :perebor_target_files
)
EXIT /B
:perebor_target_files
IF not exist !TempSourceDir! (
Echo SourceDir !TempSourceDir! is not exist
Goto :next_target_dir
) ELSE (
CD /D !TempTargetDir!
FOR /F "delims=" %%z IN ('dir /O-N /A-D !TempTargetDir!\*.* /b') DO (
SET TargetFileDate=%%~tz
SET TargetFileName=%%~nxz
SET SourceFileName=!TempSourceDir!!TargetFileName!
Call :find_in_source
IF !SourceFileDate! NEQ !TargetFileDate! (
Echo !DATE! !Time:~0,5! File !TargetFileName! is up to date!
REM COPY !SourceFileName! !TempTargetDir!
Echo COPY !SourceFileName! to !TempTargetDir!
) ELSE (
Echo !DATE! !Time:~0,5! File !TargetFileName! is actually.
)
)
)
:next_target_dir
EXIT /B
:find_in_source
Echo !SourceFileName!
IF not exist !SourceFileName! (
Echo SourceFile !SourceFileName! is not exist
SET SourceFileDate=!TargetFileDate!
Goto :next_target_file
) ELSE (
CD /D !TempSourceDir!
FOR /F "delims=" %%a IN ('dir /O-N /A-D !SourceFileName! /b') DO (
SET SourceFileDate=%%~ta
)
CD /D !TempTargetDir!
)
:next_target_file
EXIT /B
:end
Последнее редактирование модератором: