Добавить к имени файла дату и время последнего изменения с помощью командного файла
Я пытаюсь скопировать все *.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")
Заранее спасибо за помощь.
2 ответа
На SO есть несколько примеров добавления даты,
но я бы использовал PowerShell в качестве инструмента для этого (в пакетном режиме).
:: Q:\Test\2018\11\23\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
в конце.
Путь @LotPings длится много времени, если PowerShell не загружен.
Итак, я предоставлю гораздо более быстрый и понятный способ в пакетном файле, который требует 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"
значит запустить команду (/C
) для файла, указанного в /M
вариант (file.ext
). "cmd /C echo @fdate @ftime"
означает открыть новый cmd и выполнить команду, указанную в строке, а затем завершиться. @fdate
дата последнего изменения файла и @ftime
время последнего изменения файла.
Мы устанавливаем переменные line1
а также line2
для каждого из @fdate
а также @ftime
а затем мы вносим в них некоторые изменения формата.
Наконец, мы переименовываем file.ext
в fileDD-MM-YYYYHH-MM-SS.ext
,
Для получения дополнительной информации типа for /? & forfiles /?
в свежем cmd.
Надеюсь, это поможет вам, так как это быстрее.