Обновить РЕШЕНО - проблема не в моем коде. есть конструктивное ограничение (некоторые могут сказать «ошибка») в командном процессоре. операторы сравнения IF не работают со значениями выше 2147483648. протестированы и воспроизведены в Windows 2000, XP и Server 2003.
теперь мне просто нужно выяснить, как удалить некоторые из наименее значимых цифр для обходного пути. спасибо всем за чтение.
=========
Привет, в кибер-стране,
Я управляю сетью небольшой компании. Я пытаюсь настроить автоматизированный процесс архивирования с помощью командного файла, запущенного на сервере, и мне нужна небольшая помощь с логикой. Я не программист и у меня нет времени изучать PowerShell или VBscript. Я прочитал и перечитал справочник команд MS по IF, FOR и CALL и не могу понять, что делаю не так.
У нас есть Windows 2000 Server с двумя дисками и ленточным накопителем. На одном диске есть общая папка, назовите ее Public; другой диск не используется совместно, назовите это промежуточным.
Общий диск будет принимать входящие резервные копии с клиентских компьютеров. Мне нужен процесс для перемещения файлов с общего диска на промежуточный, пока диск не станет слишком полным, чтобы принимать какие-либо файлы, после чего начинается резервное копирование на ленту. По завершении запуска ленты промежуточный диск будет очищен, и процесс возобновит перемещение файлов из общего режима в промежуточный.
Цель состоит в том, чтобы автоматически и постоянно архивировать файлы резервных копий рабочего стола на ленту без какого-либо вмешательства пользователя, кроме замены ленты.
Вы спросите, а зачем задействовать два привода? Две причины:
1) Если резервные копии рабочих столов выполняются непосредственно на промежуточный диск, в какой-то момент резервное копирование клиентских рабочих столов завершится ошибкой из-за нехватки места на целевом диске. Я не могу предсказать, когда это произойдет; единственное определяемое условие, которое я могу придумать, - это произвольный порог свободного дискового пространства, но поскольку файлы резервных копий, которые будут заархивированы, будут иметь разные размеры, я мог бы столкнуться с ситуацией, когда свободное пространство целевого диска превышает пороговое значение, но следующая резервная копия превышает это пространство. Результат: резервное копирование рабочего стола клиента завершается ошибкой, и резервное копирование на ленту сервера не запускается.
2) Если промежуточный накопитель заполняется и резервное копирование на ленту по какой-либо причине не выполняется (лента не заменена или что-то еще), резервное копирование рабочих столов на общий диск дает мне некоторое время, чтобы исправить проблему с лентой, прежде чем резервное копирование рабочего стола начнет давать сбой.
Вот алгоритм, который я пытаюсь кодировать:
1) Начать
2) Получите свободное место на промежуточном диске
3) Получить размер самого маленького файла на общедоступном диске (если файлы отсутствуют, выйдите)
4) Сравните размер файла со свободным местом на промежуточном диске
5) если файл поместится, переместите его на Staging drive; в противном случае выйдите и запустите резервное копирование на ленту
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
Я знаю, что это должно быть довольно просто, но, как я уже сказал, я не программист и преклоняюсь перед вашим превосходным мастерством. Любой совет очень ценен, и спасибо.