Доделал скрипт: 1. сделал отмену изменений (нам же надо не только уметь подменять файл, но и возвращать "как было"). С параметром do - заменить файл, undo - вернуть обратно, без параметров - проверить необходимость изменений. Результат определяется кроме текстовых сообщений по коду возврата. 2. если мы отменяем изменения - логично удалить старые файлы бекапов. Так вот - нюанс в том, что при переименовании какой-то из файлов блокируется. Причем, после переименования файла до перезагрузки заблокирован на удаление файл бекапа, а после перезагрузки - подозреваю, что основной файл c_1252.nls. Значит, надо корректно обрабатывать ошибку удаления файла. Чтобы и в этом случае адекватно работало и переименование файла, и отмена. Или хотя бы возвращало ошибку, ничего не переименовывая. В итоге работает так: при переменовании туда-обратно без перезагрузок - следующее переименование закончится прогнозируемой ошибкой удаления бекап-файла. 3. при отмене изменений, бепакы удалять можно, но очень аккуратно, только при условии, что они действительно бекапы, а не случайно подвернувшиеся файлики с теми же именами. Сравниваем содержимое перед удалением. 4. подумал, что копирование теоретически может быть не выполнено если диск на 100% переполнен. В этом случае, если переименование туда сработало, значит по идее переименование обратно тоже должно сработать. Добавил. 5. весь скрипт сделан в едином стиле, довольно гибко и расширяемо, во всяком случае, самому мне за него не стыдно, хотя и с учетом специфики bat-файла в олдскульном стиле через set и goto.
Цитата: @echo off
set ORIG_SHORT_FILENAME=C_1251.NLS set SYS_DIR=%windir%\System32 set BACKUP_SUFFIX=backup set BACKUP_UNDO_SUFFIX=backup_undo
set DST_SHORT_FILENAME=C_1252.NLS set DST_FILE="%SYS_DIR%\%DST_SHORT_FILENAME%" set ACL_TMPFILE="%tmp%\%DST_SHORT_FILENAME%_acl_%random%"
if "_%1" == "_undo" goto UNDO if "_%1" == "_do" goto DO "%windir%\System32\fc.exe" /b "%SYS_DIR%\%ORIG_SHORT_FILENAME%" %DST_FILE% >nul if ERRORLEVEL 1 exit /b 1 echo files are similar, nothing to do goto END_NOTHING :DO set DST_BACKUP_SHORT_FILENAME=%DST_SHORT_FILENAME%_%BACKUP_SUFFIX% set SRC_SHORT_FILENAME=%ORIG_SHORT_FILENAME% set SRC_FILE="%SYS_DIR%\%SRC_SHORT_FILENAME%" goto START_DEL_OLD :UNDO set DST_BACKUP_SHORT_FILENAME=%DST_SHORT_FILENAME%_%BACKUP_UNDO_SUFFIX% set SRC_SHORT_FILENAME=%DST_SHORT_FILENAME%_backup set SRC_FILE="%SYS_DIR%\%SRC_SHORT_FILENAME%" goto START_DEL_OLD :START_DEL_OLD if not exist "%SYS_DIR%\%DST_BACKUP_SHORT_FILENAME%" goto START echo file "%SYS_DIR%\%DST_BACKUP_SHORT_FILENAME%" exist, comparing "%windir%\System32\fc.exe" /b "%SYS_DIR%\%DST_BACKUP_SHORT_FILENAME%" %DST_FILE% >nul if ERRORLEVEL 1 goto START echo file "%SYS_DIR%\%DST_BACKUP_SHORT_FILENAME%" is similar to %DST_FILE%, deleting del "%SYS_DIR%\%DST_BACKUP_SHORT_FILENAME%"
if exist "%SYS_DIR%\%DST_BACKUP_SHORT_FILENAME%" goto EXIST_AFTER_DEL :START if not exist %SRC_FILE% goto NOTEXIST_SRC_ERR if not exist %DST_FILE% goto NOTEXIST_DST_ERR "%windir%\System32\fc.exe" /b %SRC_FILE% %DST_FILE% >nul if ERRORLEVEL 1 goto PERM echo files already similar, nothing to do set RESULT=nothing goto END_NOTHING :PERM "%windir%\System32\icacls.exe" %DST_FILE% /save %ACL_TMPFILE% if ERRORLEVEL 1 goto ACLSAVE_ERR "%windir%\System32\takeown.exe" /F %DST_FILE% if ERRORLEVEL 1 goto SETOWNER_ERR "%windir%\System32\icacls.exe" %DST_FILE% /grant "%username%":(D) if ERRORLEVEL 1 goto SETPERM_ERR
:REN ren %DST_FILE% "%DST_BACKUP_SHORT_FILENAME%" if ERRORLEVEL 1 goto REN_ERR copy %SRC_FILE% %DST_FILE% if ERRORLEVEL 1 goto COPY_ERR :RESTORE_PERMS "%windir%\System32\icacls.exe" "%SYS_DIR%" /restore %ACL_TMPFILE% if ERRORLEVEL 1 goto ACLRESTORE_ERR :ACLSAVE_DELETE if exist %ACL_TMPFILE% del %ACL_TMPFILE% set RESULT=ok if "_%RESULT%" == "_nothing" goto END_NOTHING if "_%RESULT%" == "_ok" goto END_NOTHING echo Error! result is unknown exit /b 2 goto END_OK :NOTEXIST_DST_ERR echo file not exist: %DST_FILE% goto END_NOTHING :NOTEXIST_SRC_ERR echo file not exist: %SRC_FILE% goto END_NOTHING :EXIST_AFTER_DEL echo file delete failed: "%SYS_DIR%\%DST_BACKUP_SHORT_FILENAME%" goto END_NOTHING :ACLSAVE_ERR echo error saving permissions: %DST_FILE% to file: %ACL_TMPFILE% set RESULT=nothing goto ACLSAVE_DELETE :SETOWNER_ERR echo error changing owner to "%username%": %DST_FILE% set RESULT=nothing goto ACLSAVE_DELETE :SETPERM_ERR echo error setting permissions: %DST_FILE% set RESULT=nothing goto ACLSAVE_DELETE :REN_ERR echo error renaming file: %DST_FILE% to %DST_SHORT_FILENAME%, restoring permissions set RESULT=nothing goto RESTORE_PERMS :COPY_ERR echo error copying file: %SRC_FILE% to %DST_FILE%, renaming back: ren "%SYS_DIR%\%DST_BACKUP_SHORT_FILENAME%" "%DST_SHORT_FILENAME%" ren "%SYS_DIR%\%DST_BACKUP_SHORT_FILENAME%" "%DST_SHORT_FILENAME%" set RESULT=nothing goto RESTORE_PERMS :ACLRESTORE_ERR echo error restoring permissions: %DST_FILE% from file: %ACL_TMPFILE% set RESULT=ok goto ACLSAVE_DELETE
:END_NOTHING exit /b 0 :END_OK echo if you appeared here, that means you should reboot your computer to take effect exit /b 1
|