Доброго дня всем!
Решал задачу сверять файлы, имеющиеся у пользователя в папке и вложенных подпапках, с файлами-эталонами, и в случае, если в эталоне появляются новые (по дате модификации), автообновлять их у пользователя.
Те файлы, которые отсутствуют у пользователя, но имеются в эталоне, копироваться не должны.
Скрипт должен работать на 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
	
			
				Последнее редактирование модератором: 
			
		
	
								
								
									
	
		
			
		
		
	
	
	
		
			
		
		
	
								
							
							
