обновление решено - проблема не с моим кодом. в командном процессоре есть ограничение дизайна (некоторые могут сказать «ошибка»). операторы сравнения IF не работают со значениями, превышающими 2147483648. Теперь мне просто нужно выяснить, как убрать некоторые из наименее значимых цифр для обходного пути. спасибо всем за чтение.
=======
Привет, в киберланде,
Я управляю сетью небольшой компании. Я пытаюсь настроить автоматизированный процесс архивации, используя пакетный файл, работающий на сервере, и мне нужна небольшая помощь с логикой. Я не программист, и у меня нет времени изучать PowerShell или VBscript. Я прочитал и перечитал справочник команд MS по IF, FOR и CALL и не могу понять, что я делаю неправильно.
У нас есть Windows 2000 Server с двумя дисками и ленточным накопителем. Один диск имеет общую папку, назовите ее Public; другой диск не является общим, назовите его Staging.
Общедоступный диск будет принимать входящие резервные копии с рабочих столов клиентов. Мне нужен процесс для перемещения файлов с общего диска на промежуточный диск до тех пор, пока диск не будет переполнен, чтобы принять больше файлов, после чего начнется резервное копирование на ленту. По завершении запуска ленты накопитель Staging будет очищен, и процесс возобновит перемещение файлов из Public в Staging.
Целью является автоматическое и постоянное архивирование файлов резервных копий рабочего стола на ленту без вмешательства пользователя, кроме замены ленты.
Вы можете спросить, зачем задействовать два диска? Две причины:
1) Если рабочие столы выполняют резервное копирование непосредственно на промежуточный диск, в какой-то момент резервные копии клиентских рабочих столов не будут выполнены из-за недостатка места на целевом диске. У меня нет возможности предсказать, когда это произойдет; единственное определяемое условие, о котором я могу думать, - это произвольный порог свободного дискового пространства, но поскольку файлы резервных копий будут иметь разные размеры, я мог бы столкнуться с ситуацией, когда свободное место на целевом диске превышает пороговое значение, но следующая резервная копия превышает это пространство. Результат: сбой резервного копирования клиентского рабочего стола и резервное копирование на серверную ленту не начинается.
2) Если промежуточный диск заполняется и по какой-то причине происходит сбой резервного копирования на ленту (лента не изменена или что-либо еще), резервное копирование рабочих столов на общедоступный диск дает мне некоторое время для устранения проблемы с лентой до начала резервного копирования рабочего стола потерпеть неудачу.
Вот алгоритм, который я пытаюсь кодировать:
1) Начало
2) Получить свободное место на промежуточном диске
3) Получить размер наименьшего файла на общественном диске (если файлов нет, выйти)
4) Сравнение размера файла со свободным пространством на промежуточном диске
5) если файл подойдет, переместите его на промежуточный диск; еще, выйдите и запустите Tape Backup
6) возврат в начало
А вот мой пакетный код, который не работает. На этом этапе тестирования у меня есть один файл (8 ГБ) на общем диске, который помещается в свободное место (32 ГБ) на промежуточном диске. Команда set подтверждает, что переменные установлены в соответствии с ожиданиями; процесс завершается с ошибкой в операторе [if% BKFsize% LSS% DiskFree% "]. Вместо перемещения файла вместо него вызывается подпрограмма ленты, заданная параметром else:
@echo off
setlocal enableextensions enabledelayedexpansion
:Begin
REM obtain and display free space on Staging drive.
D:
for /f "tokens=3 delims= " %%A in ('dir ^| find "bytes free"') do (
set Z=%%A
set Z=!Z:,=!
)
set DiskFree=!Z!
echo.
echo D: has %DiskFree% bytes free
echo.
REM obtain sizes of files on Public drive to be moved.
E:
cd \backup.email
if not exist *.bkf exit
dir *.bkf /b /os > BKFlist.txt
for /f "tokens=*" %%G in (BKFlist.txt) do call :CheckBKF "%%G"
goto :eof
:CheckBKF
set BKFfile=%1
set BKFsize=%~z1
echo.
echo File %BKFfile% is %BKFsize% bytes
echo.
set
pause
REM move file(s) to Staging drive, space permitting; or,
REM if not enough space for smallest file, start tape backup.
if %BKFsize% LSS %DiskFree% (
echo Moving file %BKFfile% to drive D
echo.
move E:\backup.email\%BKFfile% D:\backup.email
) else (
C:\WINNT\AutoBackup\TapeBKF.cmd
exit
)
goto Begin
:End
Я знаю, что это должно быть довольно просто, но, как я уже сказал, я не программист, и я кланяюсь вашему превосходному мастерству. Любой совет высоко ценится, и спасибо.