批處理還有兩個功能不明 柯南 16級 2010-05-24 回答

@echo off

title 佳為資料庫自動備份龍小文QQ280554520 TEL:13489850030

setlocal enabledelayedexpansion

set d=%date:~,10%

set fdn=佳為軟體資料備份

set/a nmb=1024*1024

net stop mssqlserver

echo 資料庫自動備份中。。。

for /f “tokens=1,2,3” %%i in (‘wmic logicaldisk where “DriveType=3” get DeviceID^,FreeSpace^,Size^|more +1’) do (

set dn=%%i&set dn=!dn:~,1!

if /i !dn! gtr d (

if not exist !dn!:\%fdn%\%d%\ (

set !dn!fs=%%j

set !dn!ts=%%k

call :CalcMB !dn!fs&call :CalcMB !dn!ts

call set/a per=%%!dn!fs%%000/%%!dn!ts%%

if !per! gtr 150 (

call :backup !dn!

) else (

call :cleanbk !dn!

if !cflag!==1 call :backup !dn!

) else (

echo !dn!盤今天已經備份!

:end

net start mssqlserver

pause

exit

:CalcMB

call set num=%%%1%%

set s=

if %num:~,7% lss %nmb% (

set ys=!num:~,7!&set num=!num:~7!

) else (

set ys=!num:~,6!&set num=!num:~6!

:Loop

set/a ss=%ys%%num:~,1%/%nmb%

set s=%s%%ss%

set /a ys=%ys%%num:~,1%%%%nmb%

set num=%num:~1%

if defined num goto Loop

set %1=%s%

goto :eof

:backup

echo 正在備份%1盤。。。

if /i %1==e (

call :bked E

) else (

if exist e:\%fdn%\%d%\ (

xcopy e:\%fdn%\%d% %1:\%fdn%\%d%\ /e /q >nul

) else (

call :bked %1

goto :eof

:bked

xcopy d:\jdn_db %1:\%fdn%\%d%\jdn_db\ /e /h >nul

xcopy d:\JwForAll %1:\%fdn%\%d%\JwForAll\ /e /h >nul

xcopy d:\jwpos %1:\%fdn%\%d%\jwpos\ /e /h >nul

xcopy d:\ls %1:\%fdn%\%d%\ls\ /e /h >nul

xcopy “c:\Program Files\Microsoft SQL Server\MSSQL\Data” %1:\%fdn%\%d%\Data\ /e /h >nul

goto :eof

:cleanbk

set year=%date:~,3%&set cflag=0

if exist %1:\%fdn%\ (

cd /d %1:\%fdn%\

for /f %%i in (‘dir %year%* /ad /b /od’) do (

set efd=%%i&goto delfd

echo %1盤沒有早期備份!剩餘空間小於15%!清理%1盤後再備份!

goto endclean

:delfd

rd %efd% /q /s

set cflag=1

:endclean

goto :eof

說明:

1,不借助第三方的命令列工具,實現你的第1個要求,至少我知道的做不到。

2,可以不用:md f:\佳為軟體資料備份\“%date%”\jdn_db

和echo d|,用xcopy可以直接複製。看程式碼你就知道了,或者自己試驗一下。

3,實際驗證過,透過!