我的要求是创建一个带有年份(“ Y” + yyyy,例如Y2019)的文件夹,并在该文件夹中创建一个包含月份和年份的子文件夹(yyyymm,例如201904),然后我需要在其中移动文件文件夹。
我已经分析并找到了仅从当前日期开始获取年份和月份的代码。
%DATE%
我已使用以下命令成功检索了文件创建日期,但无法找到从中获取年月的方法。
dir /T:C filename
请提供一种从文件中检索日期获取年份和月份的方法。
答案 0 :(得分:1)
鉴于您的示例dir cmd,您似乎想根据文件写入的年月将文件移动到文件夹。
使用确切的方法或找到日期是一种选择,很快就会想到4种选择。 (我想到了For
循环,Dir
,Where
和Forfiles
)
要将日期从所有这些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"
)
@(
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\"
,并将文件移至该目录。
上面的示例适用于一个特定文件,下面的示例适用于多个文件,并允许完全定义的文件名和路径以及带有包含通配符的文件名的路径的组合,以匹配多个文件。
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"
)
)
@(
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)
我建议结合使用powershell和robocopy来完成此任务。
您可以从batch-file进行操作:
@For /F %%A In (
'PowerShell -NoP "(GCI LICENSE).CreationTime.ToString('Yyyyy\\yyyyMM')" 2^>NUL'
)Do @RoboCopy . %%A LICENSE /Mov>NUL 2>&1
或直接从cmd:
For /F %A In ('PowerShell -NoP "(GCI LICENSE).CreationTime.ToString('Yyyyy\\yyyyMM')" 2^>NUL')Do @RoboCopy . %A LICENSE /Mov>NUL 2>&1
如果基于评论,而您决定改用修改时间,只需将CreationTime
更改为LastWriteTime
。