【问题标题】:Get month and year in a file created date using windows batch script使用 Windows 批处理脚本在文件创建日期中获取月份和年份
【发布时间】:2019-07-25 10:33:28
【问题描述】:

我的要求是创建带有年份的文件夹(“Y”+ yyyy,例如 Y2019),并在该文件夹内创建一个带有月份和年份的子文件夹(yyyymm,例如 201904),然后我需要将我的文件移到里面文件夹。

我已经分析并找到了仅从当前日期获取年份和月份的代码。

%DATE%

我已使用以下命令成功检索了文件创建日期,但无法找到从中获取仅年份和月份的方法。

dir /T:C filename

请提供一种从文件中检索的日期获取年份和月份的方法。

【问题讨论】:

标签: batch-file cmd


【解决方案1】:

鉴于您的示例 dir cmd,您似乎希望根据写入文件的年份和月份将文件移动到文件夹中。

使用您的确切方法 od 查找日期是一种选择,其中 4 种很快就会浮现在脑海中。 (想到一个For 循环、DirWhereForfiles

要从任何这些 cmd 选项中分离出可用的日期,您可以将日期的 cmd 输出保存到变量中,并通过将其切割成特定的小节或使用 FOR /F 循环来标记化来手动操作它(将其切成小块)使用您在输出中显示的delimiters 日期的部分。

但是,要从 Dir 将其捕获到变量中,需要在 For /F 循环中进行解析,在这种情况下,我们可以直接标记日期,而不是创建临时变量。

出于这些原因和其他原因(例如能够在 cmd 脚本或 CLI 中以相同的逻辑运行),我更喜欢使用For /F 循环。

这可以直接粘贴到命令行中:

@FOR /F "Tokens=2-3 delims=- " %A IN ('
  dir  /A-D /T:C "C:\Sethu\LICENSE"
  ^| Find /I "LICENSE"
') DO @(
  MD "C:\Sethu\Y%B\%B%A\"
  MOVE /Y "C:\Sethu\LICENSE" "C:\Sethu\Y%B\%B%A\LICENSE"
)

或者,如果您希望有一个 CMD 脚本,您可以编辑路径和文件所在的位置,您可以使用:

@(
  SETLOCAL EnableDelayedExpansion
  ECHO OFF
  SET "_Path=C:\Sethu"
  SET "_File=LICENSE"
)

FOR /F "Tokens=2-3 delims=- " %%A IN ('
  dir /A-D /T:C "%_Path%\%_File%"
  ^| Find /I "%_File%"
') DO (
  IF NOT EXIST "%_Path%\Y%%B\%%B%%A\" (
    MD "%_Path%\Y%%B\%%B%%A\"
  )
  MOVE /Y "%_Path%\%_File%" "%_Path%\Y%%B\%%B%%A\%_File%"
)

如上所述,我使用FOR /F 循环来解析 DIR 的输出并将日期分成两个标记,%%A 代表月份,%%B 代表年份。

然后我使用这些令牌创建目录和子目录MD "%_Path%\Y%%B\%%B%%A\" 并将文件移动到该目录。


以上示例适用于一个特定文件,以下示例适用于多个文件

以上示例适用于一个特定文件,以下示例适用于多个文件,并允许组合完全定义的文件名和路径,以及包含通配符的文件名的路径以匹配多个文件。

在 CLI(CMD 提示符)处

FOR %a IN (
  "C:\Sethu\LICENSE"
  "C:\Some\Folder\thisthat.txt"
  "C:\Another\Folder\*.xls*"
) DO @(
  FOR /F "Tokens=2-3 delims=/ " %A IN (
    "%~ta"
  ) DO @(
    MD "%~dpaY%B\%B%A\"
    MOVE /Y "%~fa" "%~dpaY%B\%B%A\%~nxa"
  )
)

在 CMD 脚本中:

@(
  SETLOCAL EnableDelayedExpansion
  ECHO OFF
)

FOR %%a IN (
  "C:\Sethu\LICENSE"
  "C:\Some\Folder\thisthat.txt"
  "C:\Another\Folder\*.xls*"
) DO @(
  FOR /F "Tokens=2-3 delims=/ " %%A IN (
    "%%~ta"
  ) DO @(
    MD "%%~dpaY%%B\%%B%%A\"
    MOVE /Y "%%~fa" "%%~dpaY%%B\%%B%%A\%%~nxa"
  )
)
PAUSE

【讨论】:

  • @Stephan 哈哈!哇,我不敢相信我这样做了,而不是更改为 FOR 循环或在 Dir 上使用 Find!好吧,分心就像我想的那样分心!多么简单的错误啊! :) 感谢斯蒂芬指出,快速修复,但仍然如此。
【解决方案2】:

我建议将 结合使用来完成此任务。

您可以通过

@For /F %%A In (
    'PowerShell -NoP "(GCI LICENSE).CreationTime.ToString('Yyyyy\\yyyyMM')" 2^>NUL'
)Do @RoboCopy . %%A LICENSE /Mov>NUL 2>&1

或直接来自

For /F %A In ('PowerShell -NoP "(GCI LICENSE).CreationTime.ToString('Yyyyy\\yyyyMM')" 2^>NUL')Do @RoboCopy . %A LICENSE /Mov>NUL 2>&1

如果,基于 cmets,您决定改用修改时间,只需将 CreationTime 更改为 LastWriteTime

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2018-10-15
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多