用vbs实现按创建日期的顺序列出一个文件夹中的所有文件

问:
你好,脚本专家!如何按创建日期的顺序列出一个文件夹中的所有文件?

-- CL

答:
你好,CL。您知道,如果我们雄心勃勃并且努力工作,我们会坐下来为您写一个脚本,以使用 WMI 返回一个文件夹中的所有文件。该脚本将获取有关所有这些文件的信息,并将该数据存储在未连接的记录集中。然后,在该记录集中设置排序顺序以按创建日期和时间对文件进行排列。(接着,我们进行大量的重复性工作,以将 WMI 的日期时间值转换为易读的日期时间格式。)最后,我们将记录集中的所有值回显到屏幕上。它需要花费大量时间并编写许多代码,但最终您会得到已排序的文件列表,而且每个人都会说“哇,那些脚本专家真是为读者尽心尽力,不是吗?”

而事实上,我们并非雄心勃勃和努力工作;我们只是脚本专家。作为脚本专家,我们一直在寻找最快速、最简便的解决问题的方法。因此,我们没有去写一个冗长而复杂的脚本,而是弄来了一份 Log Parser 2.2,并匆忙完成了以下几行代码:

代码如下:

Set objLogParser = CreateObject("MSUtil.LogQuery") 
Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat") 
objInputFormat.Recurse = 0

Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat") 
objOutputFormat.rtp = -1

strQuery = "SELECT Name, CreationTime FROM 'C:\Scripts\*.*' " & _ 
    "WHERE NOT Attributes LIKE '%D%' ORDER BY CreationTime" 
objLogParser.ExecuteBatch strQuery, objInputFormat, objOutputFormat

猜猜看?此脚本不但能正常工作,还能返回文件列表(按创建日期和时间排序),而不管实际情况怎样。太酷了。

当然,我们通常建议不使用非操作系统内置的解决方案;因为我们不想让人们下载和安装一些不是绝对必需的东西。然而,当要列举文件时,很有必要下载和安装 Log Parser;当您不得不获得有关一组文件的信息时,您会发现 Log Parser 方法优于 WMI 或 FileSystemObject。Log Parser 的七八行代码比得上 WMI 的六七十行代码吗?我们会把决定权留给您。

我们不会花时间介绍有关 Log Parser 的所有信息;有关详细信息,您可以参阅“脚本故事”专栏您需要的所有内容就是日志(即 Log Parser)。现在,我们只需注意,脚本从创建 Log Parser 对象的实例开始,使用易记忆的名称 MSUtil.LogQuery 以便于更好的记忆。然后,我们创建两个其他对象,第一个指定我们正在使用的对象(在此情况下为文件系统,虽然我们也可以使用事件日志、Active Directory、注册表和其他项),第二个指明我们要使用的输出类型(在此示例脚本中,我们要做的所有事情就是将数据写入命令窗口)下列两行代码创建输入对象,并告诉 Log Parser 不从任何子文件夹检索文件:

Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
objInputFormat.Recurse = 0

如果我们确实要检索任意或所有子文件夹的值,该怎么办?在该情况下,我们必须要做的所有事情就是将 Recurse 属性的值设置为 -1:

objInputFormat.Recurse = -1

同时,下列两行代码创建输出对象,并告诉 Log Parser 显示所有数据而不要暂停:

Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat")
objOutputFormat.rtp = -1

或者,我们可以告诉 Log Parser 显示 10 行数据,然后暂停,直到我们按键盘上的某个键,然后再显示下 10 行数据。若要按每 10 行一批的规律显示数据,我们必须要做的所有事情就是将 rtp 属性的值设置为 10:

objOutputFormat.rtp = 10

接下来配置 SQL 查询以检索文件信息。如果您对 SQL 有一些了解,此查询应该相对容易分析一些;如您所见,我们正要查询 C:\Scripts 中所有文件的 Name 和 CreationTime。此外,我们要使返回的数据按创建日期和时间顺序排列,最先创建的文件排在最前面:

strQuery = "SELECT Name, CreationTime FROM 'C:\Scripts\*.*' " & _
    "WHERE NOT Attributes LIKE '%D%' ORDER BY CreationTime DESC"

此查询中唯一不寻常的就是 WHERE 子句:WHERE NOT Attributes LIKE '%D%'。不用作过多的解释,此子句筛选出文件夹,从而只返回文件。包含 Directory 属性的文件系统对象就是文件夹;因为我们不想要文件夹,所以使用 WHERE NOT 语法清除拥有 Directory(缩写为 %D%)属性的所有对象。

最后,调用 ExecuteBatch 方法来运行查询并将返回的数据写入命令窗口。一两秒钟之后,我们将获得如下所示的内容:

我们不需要输入任何特殊的命令就可以获得这一精密的表格输出;Log Parser 为我们处理所有问题。它真是太棒了,不是吗?

诚然,我们不必费很大力气就可以获得这些结果。而且它既快捷又简便。您可以这么来看:任何人都不必知道我们不努力工作,不是吗?

(0)

相关推荐

  • VBS的字符串及日期操作相关函数

    1. Asc(x),Chr(x):转换字符,字符码 2. Filter:搜寻字符串数组中的特定字符串 格式:v=filter(x,s[,include[,compare]]) 实例: Dim x()={"kjwang","wangkj","peter"} Dim v v=filter(x,"kj") '结果v(0)="kjwang",v(1)="wangkj" v=filter(x,&q

  • 用VBSrcipt判断是否是日期

    <SCRIPT LANGUAGE="vbScript"> <!-- '判断是否是日期 function thisdate(dt)     if not IsDate(dt) then         thisdate=false     elseif int(left(dt,4))<int(1750) then         thisdate=false     else         thisdate=true     end if end functio

  • 使用VBS获取当前日期的前一天 并修正输出格式

    获取当前日期方法一: 复制代码 代码如下: Currentdate1=date() msgbox Currentdate1 获取当前日期方法二: 复制代码 代码如下: Currentdate2=year(Now)&"-"&Month(Now)&"-"&day(Now) msgbox Currentdate2 补充一个:如果想获取的日期前面是1位数的前面补0的写法,例如 2016年5月16,如果目录是2016516不如20160516更

  • 用vbs判断一个日期是否在指定的时段内

    问: 您好,脚本专家! 如何判断一个日期是否在指定的时段内? -- JW 答: 您好,JW. 真是巧啊,今天早上在上班的路上,我们听到有两个不同公司的不同的广告,他们都用"七月中的圣诞节"招揽顾客. 这促使着我们一到办公室就立即回答您的问题. 毕竟,如果这些公司都有一份您正在寻找的脚本,他们可能就会知道七月没有圣诞节. 注意: 当然,我们也可能记错了圣诞节的时间,所以也许您应该给所有的脚本专家送一份礼物,以防万一. 那么我们如何才能知晓圣诞节不在七月呢? 只需运行以下脚本即可: 复制代

  • 用vbs实现的简单的服务器文件备份办法压缩文件名自动按日期命名

    简单的服务器文件备份办法压缩文件名自动按日期命名 dim FileName,WshShell,fs,MyCommandFileName=cstr(now)+".RAR" MyCommand="rar a "+FileName+" 要压缩的文件名或目录名" Set WshShell = WScript.CreateObject("WScript.Shell") Set fs=CreateObject("Scriptin

  • vbs获取当前时间日期的代码

    获取当前日期方法一: 复制代码 代码如下: Currentdate1=date()msgbox Currentdate1 获取当前日期方法二: 复制代码 代码如下: Currentdate2=year(Now)&"-"&Month(Now)&"-"&day(Now)msgbox Currentdate2 获取当前时间: 复制代码 代码如下: CurrentTime=Hour(Now)&":"&Min

  • vbs下通过日期查找文件夹的代码

    On Error Resume Next dtmTargetDate = "20020301000000.000000-420" strComputer = "." Set objWMIService = GetObject _     ("winmgmts:" & "!\\" & strComputer & "\root\cimv2") Set colFolders = objWM

  • 用VBS修改(设置)系统时间和日期的代码

    那天跟别人聊到 Y2K38 问题,于是想到一个恶作剧:用 VBS 把系统的时间修改到2038年1月19日3时14分07秒之后,这样某些依赖于 Unix 时间戳的程序就会出问题.那么怎样用 VBS 修改系统的时间呢? 最简单也是最没有技术含量的方法就是调用 cmd 的 date 和 time 命令: 复制代码 代码如下: 'Author: Demon 'Website: http://demon.tw 'Date : 2011/4/27 Dim WshShell Set WshShell = Cr

  • 用vbs实现按创建日期的顺序列出一个文件夹中的所有文件

    问: 你好,脚本专家!如何按创建日期的顺序列出一个文件夹中的所有文件? -- CL 答: 你好,CL.您知道,如果我们雄心勃勃并且努力工作,我们会坐下来为您写一个脚本,以使用 WMI 返回一个文件夹中的所有文件.该脚本将获取有关所有这些文件的信息,并将该数据存储在未连接的记录集中.然后,在该记录集中设置排序顺序以按创建日期和时间对文件进行排列.(接着,我们进行大量的重复性工作,以将 WMI 的日期时间值转换为易读的日期时间格式.)最后,我们将记录集中的所有值回显到屏幕上.它需要花费大量时间并编写

  • python按顺序重命名文件并分类转移到各个文件夹中的实现代码

    系统 ubuntu20.04 工具 python 要求 文件夹中有22个子文件夹,每个子文件又包含56个文件,要求将每个子文件夹中的第一个文件放到一个新文件夹中,第二个放一个新的中,一直到最后. 解决方案 1.复制源文件 import os import shutil #源文件路径 source_path='......' #复制的新文件的路径 copy_source_path='.....' #直接复制过去的话,经常会提示文件存在,所以加个判断语句 #判断路径是否存在源文件,如果有则删除 if

  • 教你用Python按顺序读取文件夹中文件

    我们有时候会读取一个文件夹中的所有的文件.但是,os.listdir()返回的文件名不一定是顺序的,这就要求我们对返回的文件名列表进行排序: 这时我们想到利用Epoch后面的数字对其进行排序,具体代码如下: def file_name(path): train_loss_list = [] val_loss_list = [] loss_file_name = [] files = os.listdir(path) # 采用listdir来读取所有文件 for i in files: loss_

  • 用vbs实现取消隐藏文件夹中的所有文件

    问: 您好,脚本专家!如何运行脚本取消隐藏文件夹中的所有文件? -- GA 答: 您好,GA.您知道我们中的一位脚本专家在年少时和邻居家的其他小孩花费无数的时间玩各种捉迷藏.事实上,这位脚本专家仍清晰地记得躺在浅沟中,让其他组的人从他身上走过,却不知道他就在那儿.(这种方法如此奏效,以致于他正认真考虑在自己的办公室挖一条浅沟,这样有人找他的时候就可以躲在浅沟里了.) 回到那些日子,您不会想要一种能自动取消隐藏一切的脚本:这种脚本可能很有用,但却没什么乐趣.但作为系统管理员,您大概并不愿意与文件玩

  • Python列出一个文件夹及其子目录的所有文件

    python简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl语言一样, Python 源代码同样遵循 GPL(GNU General Public License)协议. >>> import os >>> for i in os.walk("."): ... print i[0],"\n##"

  • 用vbs实现在启动 Windows 资源管理器时打开特定文件夹

    my-script.vbs "c:\scripts" 在文件夹路径的两端必须加双引号吗?本例中不需要.但是,如果路径中有空格,则必须加双引号.以下命令行将不起作用: my-script.vbs c:\documents and settings\kmyer 只要是向脚本传递包含空格的参数,就必须将整个参数括在双引号内(否则无需如此).换句话说: my-script.vbs "c:\documents and settings\kmyer" 这就是命令解释程序的工作方

  • Python实现复制图片到指定文件夹并按顺序重新命名

    最近要做一个图像生成的课题,在网上找了一个混合的数据集.这个数据集中一共有360个文件夹,然后文件夹中有6-9张不等的照片,我的目标就是编写python代码将所有的照片取出来,放到一个指定的文件夹里,并且从1开始按照顺序进行编号. 该数据集有360个文件夹 每个文件夹下面有数量不等的照片: 解决代码如下: import os import shutil path1 = r"F:\cyclegan\新建文件夹\Dataset_Part1" pic=os.listdir(path1) k=

  • vbs 列出该目录下所有文件和文件夹的类型,大小,和所有者

    GetOwner.VBS用法,在命令行下:GetOwner.vbs 目录名会在相应目录下生成一个TXT.TXT文件,内里列出该目录下所有文件和文件夹的类型,大小,和所有者 注意:大小以MB为单位,小于1MB的就显示为0MB, 以下是代码: G = WScript.arguments(0) Set oFSO = CreateObject("Scripting.FileSystemObject") set txt = oFSO.CreateTextFile(G&"TXT.

  • python os.listdir按文件存取时间顺序列出目录的实例

    如下所示: import os DIR = "/home/serho/workspace/lisp" def compare(x, y): stat_x = os.stat(DIR + "/" + x) stat_y = os.stat(DIR + "/" + y) if stat_x.st_ctime < stat_y.st_ctime: return -1 elif stat_x.st_ctime > stat_y.st_ctim

  • VBS获取当前目录下所有文件夹名字的代码

    VBS获取当前目录下所有文件夹名字,不包括子文件夹.我要给每个文件夹进行操作,所以最好用循环输出. 测试的时候要保证当前目录下有文件夹才可以,否则输出为空. 复制代码 代码如下: Set ws=WScript.CreateObject("wscript.shell")w=ws.CurrentDirectorySet fso=WScript.CreateObject("scripting.filesystemobject")Set fs=fso.GetFolder(w

随机推荐