【问题标题】:Batch job remove timestamp in a filename with date and time stamp批处理作业删除带有日期和时间戳的文件名中的时间戳
【发布时间】:2020-08-07 20:14:24
【问题描述】:

在一个文件夹中,我有很多文件名,例如:

ABC.DEF.GHI.YYYYMMDDhhmmss
JKL.MNO.PQR.YYYYMMDDhhmmsss

(不知道为什么有时时间戳有 9 位,基于 24 小时)

想要的结果是截断时间戳,只保留YYYMMDD 的文件名:

ABC.DEF.GHI.YYYYMMDD 
JKL.MNO.PQR.YYYYMMDD 

如何在脚本批处理文件、windows(不是 Linux)中执行此操作? 非常感谢您的帮助。

【问题讨论】:

  • 老实说,我不相信你!我完全看不出为什么有人会创建或使用每个扩展名都完全不同并且有两种可能格式的文件,即.YYYYMMDDhhmmss.YYYYMMDDhhmmsss。请提供正确的实际文件名和文件结构。虽然您是 editing your question 这样做,但还请包括批处理文件代码,您希望我们为您提供帮助。考虑到您现在应该已经阅读了How to Ask 的内容,您应该知道您的问题目前不在主题范围内。
  • 您可以使用带有修饰符的嵌套 for 循环分隔扩展之前的标记,以将日期/时间值分配给变量,然后使用子字符串修改修剪结果值。这样做需要启用延迟扩展。
  • @Compo,我理解你为什么不相信我有两种不同的时间格式,但这正是我得到的。这些文件是由供应商软件创建的,而不是由我创建的。我的问题中的文件名正是我所拥有的。从应用程序中,用户提交了生成文件的请求。这些文件是文本文件,但没有扩展名。生成的正确文件名如下所示:
    ABC.DEF.GHI.20200908123945

    JKL.MNO.PQR.20200827230
    和期望的结果是
    ABC.DEF.GHI .20200908
    JKL.MNO.PQR.20200827

标签: batch-file timestamp filenames


【解决方案1】:

这是一个稍微完整的版本,它假定您的目标文件实际上有一个扩展名,您在问题中没有告诉我们。 (我使用.csv 进行演示,根据需要更改即可).

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
For /F Delims^=^ EOL^= %%G In ('Dir /B /A:-D "<.<.<.>>>>>>>>>>>>>>>.csv"') Do (
    For %%H In ("%%~nG") Do (
        Set "DateStamp=%%~xH"
        SetLocal EnableDelayedExpansion
        Ren "%%G" "%%~nH!DateStamp:~,9!%%~xG"
        EndLocal
    )
)

[编辑/]

根据您的说明,您的文件没有被他们的创建软件分配扩展名,您的代码可以简化:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
For /F Delims^=^ EOL^= %%G In ('Dir /B /A:-D "<.<.<.>>>>>>>>>>>>>>>"') Do (
    Set "DateStamp=%%~xG"
    SetLocal EnableDelayedExpansion
    Ren "%%G" "%%~nG!DateStamp:~,9!"
    EndLocal
)

【讨论】:

  • 您好 Compo,非常感谢您的帮助。我会尝试并告诉你它是否有效。
  • 嗨 Compo,我试过了,但是没有用。我修改了删除 .csv 的脚本,如下所示:
    @Echo Off
    SetLocal EnableExtensions DisableDelayedExpansion
    For /F Delims^=^ EOL^= %%G In ('Dir /B /A: -D "<.>>>>>>>>>>>>>>>>.csv"') Do (
    For %%H In ("%%~nG") Do (
    Set "DateStamp=%%~xH"
    SetLocal EnableDelayedExpansion
    Ren "%%G" "%%~nH!DateStamp:~,9!%%~xG"
    EndLocal
    )
    )
  • @Tubi,我在上面的答案中添加了一个编辑,以合并一个修改后的解决方案来满足您没有分配扩展名的文件名。但请注意,现在您的文件名可能有重复,在这种情况下,重命名将不起作用。
  • 成功了。非常感谢你。我还在这里提出了另一个问题(stackoverflow.com/questions/63815654/…),但由于这已经奏效,我将关闭它并在那里提到你的名字。再次感谢。
  • 是的,但请注意,您最初的问题是一个离题的代码请求,而您现在要求在一个多月后对我的代码进行进一步更改。请尝试解决您自己的编码问题,我上面的回答不会将我与未来的支持协议联系起来。使用我编辑中的代码,(但将您从 "&lt;.&lt;.&lt;.&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" 更改为 "D:\Test\&lt;.&lt;.&lt;.&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;",同时将 Ren "%%G" "%%~nG!DateStamp:~,9!" 更改为 Ren "D:\Test\%%G" "%%~nG!DateStamp:~,9!"。然而,我的偏好是保留代码原样,但插入 CD /D "D:\Test" 作为新行 3
【解决方案2】:

我的评论的扩展:

@Echo Off & Setlocal EnableDelayedExpansion
Set "FILENAME.EXT=%~1"
For /F "Delims=" %%X in ("!FILENAME.EXT!") Do for %%F in ("%%~nX") Do (Set "_DT=%%~xF" & Set "_FN=%%~nF.!_DT:~1,8!")
Echo/!_FN!
Endlocal & Exit /B

注意:以上内容并非针对您的具体使用情况编写的,只是以可测试的方式演示原理,以便您能够适应您的需求。

【讨论】:

  • 非常感谢您的建议,我会尝试并告诉您是否有效。
  • 成功了。非常感谢你的建议。它奏效了。
猜你喜欢
  • 2014-12-17
  • 2010-11-07
  • 1970-01-01
  • 2020-07-19
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多