2011-03-25 79 views
1

更新已解決 - 問題不在我的代碼中。在命令處理器中有一個設計限制(有些人可能會說「bug」)。 IF比較運算符不能使用高於2147483648的值。現在我只需要弄清楚如何去掉解決方法中的一些最低有效位。感謝大家的閱讀。爲什麼我的IF比較操作失敗?

=======

打招呼勁茂在那裏,

我管理一個小公司的網絡。我正在嘗試使用在服務器上運行的批處理文件來設置自動歸檔進程,並且需要一些邏輯幫助。我不是程序員,也沒有時間學習PowerShell或VBscript。我已經閱讀並重新閱讀關於IF,FOR和CALL的MS命令參考,並且無法弄清楚我做錯了什麼。

我們有一臺帶有兩個磁盤驅動器和磁帶機的Windows 2000 Server。一個磁盤有一個共享文件夾,稱之爲Public;另一個磁盤不共享,稱它爲Staging。

公共驅動器將接受來自客戶端桌面的傳入備份。我需要該過程將文件從公共驅動器移動到暫存驅動器,直到驅動器太滿而無法接受任何更多文件,然後磁帶備份開始。磁帶運行完成後,分段驅動器將被清空,並且該過程將繼續將文件從公共移動到分段。

目標是自動永久性地將桌面備份文件存檔到磁帶,除了更換磁帶以外不需要用戶干預。

你可能會問,爲什麼涉及兩個驅動器?原因有兩個:

1)如果桌面直接備份到暫存驅動器,某些時候客戶端桌面備份將因目標驅動器空間不足而失敗。我無法預測何時會發生這種情況。我能想到的唯一可定義的條件是可用磁盤空間的任意閾值,但由於要歸檔的備份文件大小不同,因此我可能會遇到目標驅動器可用空間高於閾值的情況,但是下一次備份超過該空間。結果:客戶端桌面備份失敗,服務器磁帶備份無法啓動。 2)如果由於某種原因(磁帶未更改或其他原因)磁帶備份失敗,將臺式機備份到公共磁盤驅動器會導致我花費一些時間在桌面備份之前解決磁帶問題開始失敗。

這裏是算法我試圖代碼:

1)開始

2)上登臺驅動

3獲取的可用空間)公共驅動器上獲取最小文件的大小(如果沒有文件目前,出口)

4)上登臺驅動

5)如果文件將適合,它移動到登臺驅動器與自由空間比較文件的大小;否則,退出並啓動磁帶備份

6)返回到開始

這裏是不工作我的批處理代碼。在測試的這個階段,我在公用驅動器中有一個文件(8 GB),它將放置在分段驅動器上的可用空間(32 GB)中。set命令確認變量正在按預期設置;該方法在聲明失敗而不是文件的[IF%BKFsize%LSS%DiskFree%」]被移動,由‘其他’中指定的磁帶程序被調用,而不是:

@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 

我知道這一定是相當簡單,但就像我說過的,我不是程序員,我向你的高級技能傾訴,任何意見都非常感謝,並且感謝你。

回答

1

在批處理文件中,字符串和整數類型之間沒有真正的區別,但這不是你的問題。

的問題是,整數只能在32位帶符號的範圍。
-2147483648 to 2147483647

但是您的文件大小和磁盤空間都很大。 要測試這個,你可以嘗試添加一個。

Set /a myvar=BKFsize+1 
Set /a myvar=DiskFree+1 

我想你會得到一個錯誤。

你可以解決它,如果你嘗試使用字符串比較,目前你做一個字符串比較,但你的數字是相同長度的沒有,所以你得到「不可預測」的結果。
但是,如果你調整/填充串用零,使他們具有相同的長度,它應該工作。

set "strBKSize=000000000000000000%bkSize%" 
set "strBKSize=%strBKSize:~-15%" 
set "strDisksize=000000000000000000%Disksize%" 
set "strDisksize=%strDisksize:~-15%" 

或者您嘗試不使用字節進行計算,而是使用MB或GB來刪除6或9個數字/字符。

set BKFsizeGB=%BKFsize:~0,-9% 

然後你可以使用它們作爲數字。

+0

謝謝 - 我現在只是自己想清楚了。如果MS記錄了這個限制,會是很好的,它會爲我節省幾個小時。 – user75900 2011-03-26 00:36:25

1

也許變量中包含的值不是整數,而是字符串

我想這是比較:8 < 3 ==假

+0

謝謝;我的SET命令(用於調試)批量確認變量是整數。 – user75900 2011-03-25 19:53:40