把一个目录中最新的文件拷到另一台主机

今年看了看我维护的SQLServer系统,发现还有存在一些风险。

目前两块硬盘,一块是数据库盘,一块是操作系统盘。

问题是,每日全备份也在操作系统所在的硬盘上。


看明白后,着实吓我了一跳。

这样的风险在于,不论是数据库所在的盘还是数据库备份文件所在的盘,都是在运行中的硬盘。

硬盘运行,和不运行,使用和不使用,安全性相差是非常大的。

所以,我立即行动,着手写一个脚本,把备份目录下的.bak文件,拷到别的机器上去。


需求:

1。 每天自动运行:用任务调度器就OK了。

2。 只需要最新的一个备份文件拷走。

3。 不要使用Sqlserver的备份任务,因为每天它已经做了一个.bak文件。目录我没有找到,sqlserver可以自己备份后,把.bak文件也放到其它地方一个拷贝的功能。


所以,只能自己写个脚本如下:

1。 作业脚本:

dir %1\%2 /b /o-d > File1.txt
type file1.txt
find /n /v "" File1.txt > File2.txt
type file2.txt
set newset="set Latest="%1\
change File2.txt "[1]" %newset% > nul
type File2.txt | find "set" > Latest.bat
type latest.bat
call Latest.bat
echo Latest=%Latest%
set Latest1="%Latest%"
NET USE Y: /DELETE /Y
NET USE Y: \\desc_host\DBbak echo will copy %Latest1% to %3
copy %Latest1% %3
del File?.txt
del Latest.bat

调用脚本:

cpbak <目录> <过滤条件> <目标目录>

例如:

cpbak ee *.zip E:\Temp\target


讲解:


dir %1\%2 /b /o-d > File1.txt   ;; 把当前目录下的所有的文件输出到file1.txt中
type file1.txt  ;;把file1.的内容打印出来,目的是将来写入日志。
find /n /v "" File1.txt > File2.txt ;;给所有的行打上序号。
type file2.txt  ;;列出file的内容
set newset="set Latest="%1\   设置变量,注意要把目录加上
change File2.txt "[1]" %newset% > nul
type File2.txt | find "set" > Latest.bat
type latest.bat
call Latest.bat
echo Latest=%Latest%
set Latest1="%Latest%" ;;文件名加上双引号

echo will copy %Latest1% to %3 ;;
copy %Latest1% %3 ;;拷贝
del File?.txt
del Latest.bat


=======================================================

差点忘记,上面脚本中,用到一个命令:

change.

这个命令,最后我自己写了一个,因为网上没有change.com,现在变成卖女性的胸罩和丁字库。

只能自己写一个:


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace change
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 3)
            {
                Console.Out.WriteLine("args.Length < 3");
                return;
            }

            String strFileName = args[0];
            if (!File.Exists(strFileName))
            {
               Console.Out.WriteLine("does not find:{0}" , strFileName);
                return;
            }

            string findStr= args[1];
            string ReplaceStr= args[2];          
            string strWrite;
            //定义文件信息对象  

            FileInfo finfo = new FileInfo(strFileName);

            using (System.IO.StreamReader rd = finfo.OpenText())
            {

                //根据上面创建的文件流创建写数据流  
                string allstr = rd.ReadToEnd();
                strWrite=allstr.Replace(findStr,ReplaceStr);                
            }

            finfo.Delete();


            using (FileStream fs = finfo.OpenWrite())
            {

                //根据上面创建的文件流创建写数据流  
                StreamWriter w = new StreamWriter(fs);

                //设置写数据流的起始位置为文件流的末尾  
                w.BaseStream.Seek(0, SeekOrigin.Begin);

                //写入“Log Entry : ”  
                w.Write(strWrite);
                w.Flush();
                w.Close();
            }

        }
    }
}




在win2008 server 中,任务所在位置:

把一个目录中最新的文件拷到另一台主机_第1张图片



change 的代码在这里:里面有代码和编译好的exe


change


你可能感兴趣的:(数据库,备份,脚本,dos,sqlserver)