• 简单目录备份脚本


    简单目录备份脚本

    写这个脚本的原由是因为我经常会把一些文件放在桌面上,时间一长,桌面也就越来越乱了,自己在整理桌面的时候经常会不小心删除掉一些重要的文件,加上自己有清空回收站的强迫症,所以经常会造成一些悲剧。公司方面考虑到一些安全方面的问题,也不允许我们自己安装一些文件夹备份的软件,所以只好自己动手了~

    脚本功能:

    • 将桌面上的文件备份到D:Desktop-Backup(D:Desktop-Backup这个目录只会增加新文件,并不会删除文件,所以这个目录会越来越大,需要手工进行清理)。
    • 会在D盘根目录生成两个文件:backup.tmp是临时文件,记录当前桌面上的所有文件;backup.log是日志文件,可以通过backup.log来查看已备份的文件(backup.tmp文件大小和你桌面上文件的多少有关;backup.log文件会越来越大,可以手工删除)。
    • 脚本程序每十分钟执行一次。
    • 如果更新过桌面上的文件,那么D:Desktop-Backup目录中对应的文件也会进行更新。

    使用方法:

    • 将Desktop-backup.vbs文件拷贝到“开始菜单”中的“启动”目录下即可开机启动。
    • 如果想停止该脚本,则需要打开“任务管理器”,找到“wscript.exe”进程,点“结束进程”即可。
    复制代码
     1 'FileName : Desktop-backup.vbs
     2 'Author : moose
     3 'Date : 2013/6/18
     4 'Version : 0.2
     5  
     6 'configure
     7 Set ws = CreateObject("wscript.shell")
     8 Set fs = CreateObject("scripting.filesystemobject")
     9  
    10 SRCFLD = ws.SpecialFolders("desktop")
    11 Const TARFLD = "D:Desktop-Backup"  'target folder
    12  
    13 If Not fs.FolderExists(TARFLD) Then
    14     fs.CreateFolder(TARFLD)
    15 End If
    16  
    17 TEMPFILE = "D:ackup.tmp"  'tmp text file .Why can not be const ?
    18 LOGFILE = "D:ackup.log"    'log file
    19  
    20 Set logfile = fs.OpenTextFile(LOGFILE, 8, True)
    21 logfile.WriteLine "****************************"&now&"****************************"
    22 logfile.WriteBlankLines 1
    23 'start sync
    24 Do While True
    25     If fs.FileExists(TEMPFILE) Then
    26         fs.DeleteFile TEMPFILE, True
    27     End If
    28  
    29     Set tmpFile = fs.OpenTextFile(TEMPFILE,8,True)
    30     fileTree(SRCFLD)
    31     tmpFile.Close
    32  
    33     syncFolder TEMPFILE,SRCFLD,TARFLD
    34     WScript.Sleep 1000*60*10    '10 minutes/backup
    35 Loop
    36  
    37 'delete tmpfile
    38 'fs.DeleteFile TEMPFILE, True
    39  
    40 '==================================================================
    41  
    42 'sync folder
    43 Function syncFolder(txtFile,srcPath,tarPath)
    44     'WScript.Echo TypeName(txtFile)  'if change TEMPFILE to TMPFILE than the type will be TextStream not string ! why ?
    45     'readline from tmp file
    46     Set dbFile = fs.OpenTextFile(txtFile,1)
    47  
    48     Do Until dbFile.AtEndOfStream
    49         sp = dbFile.ReadLine
    50         tp = Replace(sp,srcPath,tarPath)
    51  
    52         If Right(tp,1) = "" Then
    53             'this record is folder, if not exist than create it
    54             If Not fs.FolderExists(tp) Then
    55                 fs.CreateFolder(tp)
    56                 'WScript.Echo "Create Folder :"&tp
    57                 logfile.WriteLine Now & "  Create Folder :"&tp
    58             End If
    59         Else
    60             'this record is file
    61             If Not fs.FileExists(tp) Then
    62                 'if file not exist
    63                 fs.CopyFile sp, tp
    64                 'WScript.Echo "Create File : "&tp
    65                 logfile.WriteLine Now & "  Create File :"&tp
    66             Else
    67                 'if file has been updated
    68                 If fs.GetFile(sp).DateLastModified >fs.GetFile(tp).DateLastModified Then
    69                     fs.CopyFile sp, tp, True
    70                     'WScript.Echo "Replace File : "&tp
    71                     logfile.WriteLine Now & "  Replace File :"&tp
    72                 End If
    73             End If
    74         End If
    75     Loop
    76     dbFile.Close
    77 End Function
    78  
    79 'generate file tree and write file info to the tmp file
    80 Function fileTree(folderPath)
    81     If Not fs.FolderExists(folderPath) Then
    82         WScript.Echo "Folder does not exists ~"
    83         WScript.Quit
    84     End If
    85     Set fld = fs.GetFolder(folderPath)
    86  
    87     'print files
    88     For Each file In fld.Files
    89         'WScript.Echo file
    90         tmpFile.WriteLine file.Path
    91     Next
    92  
    93     'print sub folders
    94     For Each subfld In fld.SubFolders
    95         'WScript.Echo subfld
    96         tmpFile.WriteLine subfld.Path&""
    97         fileTree(subfld)
    98     Next
    99 End Function
    复制代码

    PS:我一直纠结在是否要通过对比文件的MD5值来判断该文件是否要备份,但是因为现在的硬盘越来越廉价,加上MD5需要花费额外的时间,所以最后我采用对比文件的文件名和最后修改日期来判断文件是否需要备份。

     
     
     
    标签: vbs目录备份

    dynamic的一些使用心得

    2013-07-02 14:05 by 楼上那个男人, 480 阅读, 3 评论, 收藏编辑

            dynamic关键字才出来的时候,觉得真是没什么用,谁总是和com交互来交互去啊,唯恐避之不及啊。

            后来逐渐算是有了一些使用心得,发现这货还真是犀利啊,故在此举几个例子,起抛砖引玉之用。

    1.替代XXX.GetType().GetProperty("YYY").GetValue(XXX)

            static object GetPerson()
            {
                return new Person { Name = "Leo" };
            }    

            有时候难免会遇到这种返回object的倒霉代码(特别是跟反射有关的时候),这时我们又要访问其中的某个属性,那个费劲啊,现在有了dynamic感觉好多了。

    复制代码
                object objPerson = GetPerson();
                var objName =  objPerson.GetType().GetProperty("Name").GetValue(objPerson);
                Console.WriteLine(objName);
    
                dynamic dynPerson = GetPerson();
                var dynName = dynPerson.Name;
                Console.WriteLine(dynName);
    复制代码

            另一个好处是性能会得到一程度的提升:

    复制代码
                Watch = new Stopwatch();
                Watch.Start();
                for (int i = 0; i < 1000000; i++)
                {
                    objName = objPerson.GetType().GetProperty("Name").GetValue(objPerson);
                }
                Watch.Stop();
                Console.WriteLine(Watch.Elapsed);
    
    
                Watch.Restart();
                for (int i = 0; i < 1000000; i++)
                {
                    dynName = dynPerson.Name;
                }
                Watch.Stop();
                Console.WriteLine(Watch.Elapsed);
    复制代码

            大致结果如下图,还是快了很多的:

        

    2.拯救接手接口没设计好的代码的倒霉孩子

            比如这里有N个WCF服务,返回了N个对象的集合,这几个对象没啥关系,其实又有一点关系,倒霉孩子又不会让Entity Framework生成的类自动继承某个接口(本文里用本地方法代替WCF服务)。

            这里来举一个例子,首先有下面2个倒霉的类,同样string类型的name是可以提取接口的(这里真的合适提取么……),同样名称但不同类型的ID,完全无关的Age和Price。

    复制代码
        public class Person
        {
            public int ID { get; set; }
    
            public string Name { get; set; }
    
            public int Age { get; set; }
    
            public static List<Person> GetPersonList()
            {
                return new List<Person>
                {
                    new Person{ Name = "Leo1" , Age = 10 },
                    new Person{ Name = "Leo2" , Age = 20 },
                    new Person{ Name = "Leo3" , Age= 30 }
                };
            }
        }
    
        public class Car
        {
            public Guid ID { get; set; }
    
            public string Name { get; set; }
    
            public double Price { get; set; }
    
            public static List<Car> GetCarList()
            {
                return new List<Car>
                {
                    new Car{ Name = "Focus1" , Price = 100 },
                    new Car{ Name = "Focus2" , Price = 200 },
                    new Car{ Name = "Focus3" , Price = 300 }
                };
            }
        }
    复制代码

            我用2个static方法返回不同类型的List<T>来模拟WCF中最普通的调用。

    复制代码
            static void Main(string[] args)
            {
                List<dynamic> list = new List<dynamic>();
                //用本地方法替代WCF服务,您假装是通过WCF获取的list
                Person.GetPersonList().ForEach((p) => list.Add(p));
                TestDynamic2(list,"Leo2");
    
                list = new List<dynamic>();
                //用本地方法替代WCF服务,您假装是通过WCF获取的list
                Car.GetCarList().ForEach((c) => list.Add(c));
                TestDynamic2(list,"Focus3");
    
                Console.ReadKey();
            }
    
            private static void TestDynamic2(List<dynamic> list,string name)
            {
                //可以无差别的使用ID和Name属性
                dynamic first = list.OrderBy(d => d.ID).FirstOrDefault(d => d.Name.Contains(name));
    
                //差别对待不同的属性,这里供参考,不建议这么写,这会导致依赖具体的类型
                if (first is Person)
                {
                    Console.WriteLine(first.Age);
                }
                else
                {
                    Console.WriteLine(first.Price);
                }
            }
    复制代码

           本文提供了使用dynamic的一点心得,如果有不对的对方,还望各位不吝指出,非常感谢!

     
     
     
    标签: C# 4.0dynamic反射
  • 相关阅读:
    TSQL--NESTED LOOPS JOIN
    TSQL--SORT MERGE JOIN
    TSQL--HASH JOIN
    Backup--备份相关的信息查看及小技巧
    java后台json如何传递到jsp中解析
    大数据资源
    oracle sql生成日历表
    easyUI中onLoadSuccess方法获取多个对象
    征信用户数据分析
    JS优秀资源站点收集
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3167595.html
Copyright © 2020-2023  润新知