@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
1. Подскажите, пожалуйста, как можно, не слишком раздувая код, избежать вывода в консоли сообщений от вложенных в циклы FOR команд DIR, в случае, если они не находят в искомой папке файлов (echo off на них не влияет);
2. Каким образом лучше организовать автоматическое закрытие файлов exe, которым требуется обновление, в случае, если они открыты у пользователя (вопрос утерянных данных не актуален).
del /f /a "%file%" || move /y "%file%" "%file%.tmp"
move /y "%source%" "%file%"
del /F /A /Q /S "%directory%\*.tmp"
Первый раз такое слышу. Покажите скриншот, чисто из академического интереса.Скрипт вылетает с сообщением о внезапной встрече этой самой тильды.
Это из-за знаков пробела. Все пути нужно обрамлять кавычками.невозможность для команды dir обработать путь, содержащий пробелы (такой как 'D:\Test\Target\Profiles\Иркутский выпуск (приложение)').
Goto :next_target_dir
@echo off
SetLocal EnableExtensions
chcp 866 >NUL
SET "WorkDir=c:\temp"
SET "SourceDir=%WorkDir%\Source"
SET "TargetDir=%WorkDir%\Target"
:: считаем кол-во \
set tok=0& for %%a in ("%TargetDir:\=" "%") do set /a tok+=1
:: добавляем поддержку всех символов из кодовой таблицы 1251
set CP=&>NUL chcp 1251>nul
:: перечисляем все файлы в папке TargetDir
for /f "delims=" %%t in ('dir /b /s /a-d "%TargetDir%\*"') do (
rem служебная
if not defined CP (set CP=+&>NUL chcp 866)
rem извлекаем r (относительный путь)
for /f "delims=\ tokens=%tok%*" %%q in ("%%t") do (
rem построение пути к источнику
for /f "delims=" %%s in ("%SourceDir%\%%r") do (
rem проверка условий
rem 1. Источник существует ?
if exist "%%s" (
rem 2. Сравнение дат модификации
if "%%~ts" neq "%%~tt" (
rem копируем из s (источника) в t (целевой). XCOPY - потому что поддерживает копирование скрытых / системных файлов.
echo Copying "%%s" --^> "%%t"
echo F|>NUL xcopy /c /h /r /y /k "%%s" "%%t" && echo SUCCESS: "%%t" is up to date! || echo FAILED: to copy "%%s" --^> "%%t"
) else (
call echo %%DATE%% %%Time:~0,5%% File "%%t" is actual.
)
) else (
echo SOURCE: "%%s" is not exists in source!
)
)
)
)
pause
goto :eof
~ спецсимволом не считается. Проблема была из-за "(". В некоторых случаях ")". В не-"закавыченном" виде воспринимаются как часть синтаксиса, а не пути.в коротком виде представлялось как "_()~1"
У меня через xcopy (но это внешня утилита). Быстрее будет через copy, но чуть длиннее скрипт (это если захочется с защитой на случай скрытых / системных файлов в источнике).Ваш вариант явно компактнее и, судя по всему, быстрее.
@echo off
SetLocal EnableExtensions
chcp 866 >NUL
SET "WorkDir=c:\temp"
SET "SourceDir=%WorkDir%\Source"
SET "TargetDir=%WorkDir%\Target"
:: считаем кол-во \
set tok=0& for %%a in ("%TargetDir:\=" "%") do set /a tok+=1
:: добавляем поддержку всех символов из кодовой таблицы 1251
set CP=&>NUL chcp 1251>nul
:: перечисляем все файлы в папке TargetDir
for /f "delims=" %%t in ('dir /b /s /a-d "%TargetDir%\*"') do (
rem служебная
if not defined CP (set CP=+&>NUL chcp 866)
rem извлекаем r (относительный путь)
for /f "delims=\ tokens=%tok%*" %%q in ("%%t") do (
rem построение пути к источнику
for /f "delims=" %%s in ("%SourceDir%\%%r") do (
rem проверка условий
rem 1. Источник существует ?
if exist "%%s" (
rem 2. Сравнение дат модификации
if "%%~ts" neq "%%~tt" (
rem копируем из s (источника) в t (целевой).
echo Copying "%%s" --^> "%%t"
2>NUL >&2 copy /y "%%s" "%%t" && echo SUCCESS: "%%t" is up to date! || (
rem если ошибка из-за того, что файл загружен как образ процесса
move /y "%%t" "%%t.tmp"
rem XCOPY, если ошибка из-за того, что файл в источнике скрытый и/или системный.
echo F|>NUL xcopy /c /h /r /y /k "%%s" "%%t" && echo SUCCESS: "%%t" is up to date! || (
echo FAILED: to copy "%%s" --^> "%%t"
))
) else (
call echo %%DATE%% %%Time:~0,5%% File "%%t" is actual.
)
) else (
rem Если файла нет в исходной папке, проверим причину:
rem Если в целевой папке прошлый раз файл был переименован в *.tmp потому, что был открыт процессом, удаляем его как мусор
if "%%~xt"==".tmp" (del /f /a "%%t") else (echo SOURCE: "%%s" is not exists in source!)
)
)
)
)
pause
goto :eof
Так нельзя делать!barret написал(а):if "%%~ts" gtr "%%~tt" (
Возможен ли у Вас сценарий, когда данные в источнике старее, чем в целевом каталоге?
Во всех остальных случаях Errorlevel будет ненулевой.Скопировано файлов: 0.
@echo off
SetLocal EnableExtensions
chcp 866 >NUL
SET "WorkDir=c:\temp"
SET "SourceDir=%WorkDir%\Source"
SET "TargetDir=%WorkDir%\Target"
:: считаем кол-во \
set tok=0& for %%a in ("%TargetDir:\=" "%") do set /a tok+=1
:: добавляем поддержку всех символов из кодовой таблицы 1251
set CP=&>NUL chcp 1251>nul
:: перечисляем все файлы в папке TargetDir
for /f "delims=" %%t in ('dir /b /s /a-d "%TargetDir%\*"') do (
rem служебная
if not defined CP (set CP=+&>NUL chcp 866)
rem извлекаем r (относительный путь)
for /f "delims=\ tokens=%tok%*" %%q in ("%%t") do (
rem построение пути к источнику
for /f "delims=" %%s in ("%SourceDir%\%%r") do (
rem проверка условий
rem 1. Источник существует ?
if exist "%%s" (
rem резервное копирование, а также переименование файла, если он является образом запущенного процесса
attrib -s -h "%%t"
move /y "%%t" "%%t.bak" >NUL
copy "%%t.bak" "%%t" >NUL
rem копируем из s (источника) в t (целевой).
echo Copying "%%s" --^> "%%t"
echo F|>NUL xcopy /c /h /r /y /k /d "%%s" "%%t" && (
rem o - old target
for %%o in ("%%t.bak") do (
rem выполнено ли копирование?
if "%%~ts"=="%%~tt" (
rem у старого файла дата отличалась?
if "%%~ts" neq "%%~to" (
echo SUCCESS: "%%t" is up to date!
) else (
call echo %%DATE%% %%Time:~0,5%% File "%%t" is actual.
)
) else (
call echo %%DATE%% %%Time:~0,5%% File "%%t" is actual.
)
)
) || echo FAILED: to copy "%%s" --^> "%%t"
) else (
if "%%~xt" neq ".bak" echo SOURCE: "%%s" is not exists in source!
)
)
)
)
pause
goto :eof
gpg --print-md md5 имя файл
имя файл: F1 7B BE 5C 77 A8 EA B7 36 9D CF 4C 7C FE 20 28
if "gpg --print-md md5 %%s" neq "gpg --print-md md5 %%е" (
gpg --print-md md5 1.cmd > 0.tmp
gpg --print-md md5 1.cmd > 1.tmp
set /p AA="" <0.tmp
set /p BB="" <1.tmp
if "%AA%"=="%BB%" (
echo yes
) else (
echo no
)
del 0.tmp
del 1.tmp
работа с строкой? можно разобрать работу?
откуда здесь
%%r
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?