2011-06-04 158 views
0

我有一个批处理脚本用于显示文件的修改日期列表&时间。解析修改日期和时间

这是脚本代码:

for %%v in (*.html) do ( 
    echo %%~tv 
) 

的问题是,我该如何解析结果为两个变量。每个日期和时间连续。

请指教。

问候,

迪诺

回答

3

如果我要解决这样的问题我自己,我会做到以下几点:

  1. 我会跑你那剧本看什么输出它产生。说实话,我运行该脚本,这里是我得到了什么:那么

    12/15/2009 08:54 AM 
    12/15/2009 09:30 AM 
    05/31/2011 07:35 PM 
    12/02/2009 05:53 PM 
    12/19/2009 09:33 PM 
    04/10/2010 02:07 PM 
    11/23/2010 03:21 PM 
    01/06/2010 12:03 PM 
    
  2. 我的下一步将是确定(视觉)是每个字符串的一部分是日期和哪一部分是时候,我的意思是,子串的起始位置和长度是多少。

    对我来说,这似乎是...(这里是我的尺子?)

      1 1 
    0 5 0 5  
    |||||||||||||||||||| 
    04/10/2010 02:07 PM 
    

    是啊,位置0,日期和位置11,长度为8的时间长度为10。 (正如你所看到的,对于批处理脚本中的字符串,我有一个从0开始的特殊标尺。)

  3. 现在我知道在输出中找到日期和时间,我可以相应地提取它们。但首先我需要一个整个字符串的变量,因为提取应用于环境变量,而不是循环变量。在这里:

    SETLOCAL EnableDelayedExpansion 
    FOR %%v IN (*.html) DO ( 
        SET datetime=%%~tv 
        ECHO !datetime:~0,10! 
        ECHO !datetime:~11,8! 
    ) 
    ENDLOCAL 
    

    您可能已经注意到,从引入可变我还添加了启用延迟扩展(变量),除了。这是必要的,因为眼前的扩张,即是这样的:

    FOR %%v IN (*.html) DO ( 
        SET datetime=%%~tv 
        ECHO %datetime:~0,10% 
        ECHO %datetime:~11,8% 
    ) 
    

    是行不通的。事情是,%datetime:…%表达式将在调用循环之前在之前评估,因此会产生空字符串。 (这种行为的特殊性适用于所有在圆括号中有一堆命令的情况,无论是FOR循环,IF还是IF..ELSE命令,或者甚至仅应用于一组命令的重定向,如>file (commands))。

    而不是仅仅输出,你可以将它们存储在其他变量后的循环体来处理值:

    SETLOCAL EnableDelayedExpansion 
    FOR %%v IN (*.html) DO ( 
        SET datetime=%%~tv 
        SET fdate=!datetime:~0,10! 
        SET ftime=!datetime:~11,8! 
        :: now do whatever you like with !fdate! and !ftime! 
        … 
    ) 
    ENDLOCAL 
    
+0

嗨Andiy,伟大的答案和解释。只有最后一个注释的修改,我正在使用!fdate!和!ftime!而不是%fdate%和%ftime%。非常感谢 !迪诺。 – Dino 2011-06-04 15:30:49

+0

@Dino:很好,相应地更新了我的答案。谢谢你提到它。 – 2011-06-04 17:24:47