使用Windows批处理脚本获取文件创建日期中的月份和年份

时间:2019-07-25 10:33:28

标签: batch-file cmd

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

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

%DATE%

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

dir /T:C filename

enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

使用确切的方法或找到日期是一种选择,很快就会想到4种选择。 (我想到了For循环,DirWhereForfiles

要将日期从所有这些cmd选项中分离出来,您可以将日期的cmd输出保存到变量中,并通过将其切成特定的小节或使用FOR /F循环来手动操作使用您在输出中显示的delim iter s对日期的各个部分进行标记(切成小块)。

但是,要将其捕获到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保留年份。 / p>

然后我使用这些标记来创建目录和子目录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

答案 1 :(得分:0)

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

您可以从进行操作:

@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

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