使用批处理文件附加到文件名上次修改日期和时间
Append to a filename last modified date and time with a batch file
我正在尝试将所有 *.csv
文件从一个文件夹复制到另一个文件夹,但在复制时我需要将文件的修改日期和时间添加到文件名中。例如,如果文件名是 Test.csv
并且它在 11/21/2018
15:01:10
上被修改,输出应该是 Test11-21-201815_01-10.csv
。我找到了一个脚本来向它添加当前时间戳,但我需要添加文件的修改日期。你可以在下面看到它:
@echo off
set Source=C:\csvtest
set Target=C:\csvtest\csvtest\Archive
FOR /f "tokens=1-8 delims=/.:- " %%A in ("%date%%time%") DO (
SET Month=%%B
SET Day=%%C
SET Year=%%D
SET Hours=%%E
SET Minutes=%%F
SET Seconds=%%G
SET All=%%B-%%C-%%D_%%E-%%F-%%G
)
FOR %%i IN ("%Source%\*.csv") DO (
COPY "%%i" "%Target%\%%~Ni %All%.csv")
在此先感谢您的帮助。
SO 上有一些附加日期的示例,
但我会使用 PowerShell 作为工具来完成此任务(批量包装)。
:: Q:\Test18\SO_53450598.cmd
@echo off
set "Source=C:\test"
set "Target=C:\test\Archive"
PowerShell -Nop -C "Get-ChildItem '%Source%\*.csv'|Copy-Item -Destination {'%Target%\{0} {1:MM-dd-yyyy_HH-mm-ss}.csv' -f $_.BaseName,$_.LastWriteTime} -WhatIf"
如果输出看起来没问题,请删除末尾的 -WhatIf
。
如果未加载 PowerShell,@LotPings 方法会持续很长时间。
因此,我将在需要 delayedexpansion
:
的批处理文件中提供一种更快、更易于理解的方法
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-2" %%a IN ('forfiles /M file.ext /C "cmd /C echo @fdate @ftime"') do (
set line1=%%a
set line2=%%b
set line1r=!line1:/=-!
set line2r=!line2::=-!
rename "file.ext" "file!line1r!!line2r!.ext"
)
rem NOTE: Date format is DD-MM-YYYY. Time format is HH-MM-SS.
让我们分解一下:
for /f ...
相信大家都很熟悉。
命令 forfiles /M file.ext /C "cmd /C echo @fdate @ftime"
表示对 /M
选项 (file.ext
) 中指定的文件执行 运行 命令 (/C
)。 "cmd /C echo @fdate @ftime"
表示打开一个新的cmd,执行string指定的命令,然后终止。 @fdate
是文件的最后修改日期,@ftime
是文件的最后修改时间。
我们为每个 @fdate
和 @ftime
设置变量 line1
和 line2
,然后我们对它们进行一些格式更改。
最后,我们将 file.ext
重命名为 fileDD-MM-YYYYHH-MM-SS.ext
。
有关更多信息,请在新的 cmd 中输入 for /? & forfiles /?
。
希望这对你有帮助,因为它更快。
我正在尝试将所有 *.csv
文件从一个文件夹复制到另一个文件夹,但在复制时我需要将文件的修改日期和时间添加到文件名中。例如,如果文件名是 Test.csv
并且它在 11/21/2018
15:01:10
上被修改,输出应该是 Test11-21-201815_01-10.csv
。我找到了一个脚本来向它添加当前时间戳,但我需要添加文件的修改日期。你可以在下面看到它:
@echo off
set Source=C:\csvtest
set Target=C:\csvtest\csvtest\Archive
FOR /f "tokens=1-8 delims=/.:- " %%A in ("%date%%time%") DO (
SET Month=%%B
SET Day=%%C
SET Year=%%D
SET Hours=%%E
SET Minutes=%%F
SET Seconds=%%G
SET All=%%B-%%C-%%D_%%E-%%F-%%G
)
FOR %%i IN ("%Source%\*.csv") DO (
COPY "%%i" "%Target%\%%~Ni %All%.csv")
在此先感谢您的帮助。
SO 上有一些附加日期的示例,
但我会使用 PowerShell 作为工具来完成此任务(批量包装)。
:: Q:\Test18\SO_53450598.cmd
@echo off
set "Source=C:\test"
set "Target=C:\test\Archive"
PowerShell -Nop -C "Get-ChildItem '%Source%\*.csv'|Copy-Item -Destination {'%Target%\{0} {1:MM-dd-yyyy_HH-mm-ss}.csv' -f $_.BaseName,$_.LastWriteTime} -WhatIf"
如果输出看起来没问题,请删除末尾的 -WhatIf
。
如果未加载 PowerShell,@LotPings 方法会持续很长时间。
因此,我将在需要 delayedexpansion
:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-2" %%a IN ('forfiles /M file.ext /C "cmd /C echo @fdate @ftime"') do (
set line1=%%a
set line2=%%b
set line1r=!line1:/=-!
set line2r=!line2::=-!
rename "file.ext" "file!line1r!!line2r!.ext"
)
rem NOTE: Date format is DD-MM-YYYY. Time format is HH-MM-SS.
让我们分解一下:
for /f ...
相信大家都很熟悉。
命令 forfiles /M file.ext /C "cmd /C echo @fdate @ftime"
表示对 /M
选项 (file.ext
) 中指定的文件执行 运行 命令 (/C
)。 "cmd /C echo @fdate @ftime"
表示打开一个新的cmd,执行string指定的命令,然后终止。 @fdate
是文件的最后修改日期,@ftime
是文件的最后修改时间。
我们为每个 @fdate
和 @ftime
设置变量 line1
和 line2
,然后我们对它们进行一些格式更改。
最后,我们将 file.ext
重命名为 fileDD-MM-YYYYHH-MM-SS.ext
。
有关更多信息,请在新的 cmd 中输入 for /? & forfiles /?
。
希望这对你有帮助,因为它更快。