因为工作需要,平生第一次用Windows的Dos命令写脚本。

需求:本地有个软件,每天生成相应的Log文件,并保存在以日期时间为目录的文件夹下。然后需要在后一天,将前一天生成的Log文件及文件夹上传到一个日志服务器进行保存。

实现工具:bat脚本,Ncftp工具,计划任务

其中,因为系统默认的ftp命令行,不支持passive模式,而Port模式下,需要修改或开启Log生成端服务器的防火墙,需要最终改用网络上免费的小工具Ncftp,这个小工具比系统自带的强大了N倍,支持命令行,支持PASV模式也可以切换PORT模式,还支持断点续传,上传成功后删除本地文件等。

实现步骤:

1)转到脚本所在目录;

2)上传之前未能成功上传的文件;

3)取到今天需要上传的文件夹名称;

4)上传今天需要上传的文件夹及文件;

5)如果成功,删除本地文件,如果不成功,将文件夹移到备份目录;

6)删除空目录;

以下是具体的脚本内容(英文版系统):

-----------------------------------------------------------

 

@echo off

 

set dt=%date:~10,4%%date:~4,2%%date:~7,2%

set batpath=%~dp0

set dname=

 

rem Turn to batfile's path

%~d0

cd %batpath%

mkdir bak >nul 2>nul

 

rem Re-upload bak log directory and file to NMS Server

 

type %batpath%Evtlog.txt | find "Ftpfailed" >nul 2>nul 

 

if %errorlevel% EQU 0 goto reupload 

if %errorlevel% NEQ 0 goto reupend

 

:reupload

echo ----------%dt% Re-upload bak Log------------ 2>>%batpath%Evtlog.txt 1>&2

%BatPath%ncftpput -u administrator -p password  -r 5 -z -R -DD 192.168.1.80 /192.168.1.53 %batpath%bak\* 2>>%batpath%Evtlog.txt 1>&2

if %errorlevel% EQU 0 goto cleanrelog

if %errorlevel% NEQ 0 goto reupfailed

 

:cleanrelog

cd.>%batpath%Evtlog.txt

for /f "tokens=*" %%a in ('dir /b /ad /s %batpath%bak\^|sort /r') do rd "%%a" /q 2>nul

goto reupend

 

:reupfailed

echo %dt%:Ftpfailed Reupload files the day before yesterday failed! 2>>%batpath%Evtlog.txt 1>&2

goto reupend

 

:reupend

 

rem Get the yesterday date

for /d %%i in (20*) do if %%i LSS %dt% set dname=%%i

if exist %dname% goto ncftp

if not exist %dname% goto :eof

 

:ncftp

rem Transfer yesterday log file and folder to NMS Server

echo ----------%dt% Ftp Log------------  2>>%batpath%Evtlog.txt 1>&2

%BatPath%ncftpput -u administrator -p password  -r 5 -z -R -DD 192.168.1.80 /192.168.1.53 %batpath%%dname% 2>>%batpath%Evtlog.txt 1>&2

if %errorlevel% EQU 11 goto session

if %errorlevel% EQU 10 goto library

if %errorlevel% EQU 9 goto error

if %errorlevel% EQU 8 goto usage

if %errorlevel% EQU 7 goto url

if %errorlevel% EQU 6 goto directorytimeout

if %errorlevel% EQU 5 goto directory

if %errorlevel% EQU 4 goto transfertimeout

if %errorlevel% EQU 3 goto transfer

if %errorlevel% EQU 2 goto connecttimeout

if %errorlevel% EQU 1 goto connect

if %errorlevel% EQU 0 goto success

 

:success

echo ncFtp:0Success. 2>>%batpath%Evtlog.txt 1>&2

goto exit

 

:connect

echo Ftpfailed:1Could not connect to remote host. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:connecttimeout

echo Ftpfailed:2Could not connect to remote host - timed out. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:transfer

echo Ftpfailed:3Transfer failed. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:transfertimeout

echo Ftpfailed:4Transfer failed - timed out. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:directory

echo Ftpfailed:5Directory change failed. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:directorytimeout

echo Ftpfailed:6Directory change failed - timed out. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:url

echo Ftpfailed:7Malformed URL. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:usage

echo Ftpfailed:8Usage error. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:error

echo Ftpfailed:9Error in login configuration file. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:library

echo Ftpfailed:10Library initialization failed. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:session

echo Ftpfailed:11Session initialization failed. 2>>%batpath%Evtlog.txt 1>&2

goto movefile

 

:movefile

rem Move yesterday log directory trees and files to the destination directory bak 

move /y %batpath%%dname% %batpath%bak\%dname%  2>>%batpath%Evtlog.txt 1>&2

if %errorlevel% NEQ 0 echo Moveerror:A duplicate file name exists, or the file cannot be found. 2>>%batpath%Evtlog.txt 1>&2

if %errorlevel% EQU 0 echo Move finish! 2>>%batpath%Evtlog.txt 1>&2

goto exit

 

:exit

 

rd %batpath%%dname% /q >nul 2>nul

echo ----------%dt% Ftp Log------------  2>>%batpath%Evtlog.txt 1>&2

 

 

 

-----------------------------------------------------------