批處理還有兩個功能不明
@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,實際驗證過,透過!