Добавить к имени файла дату и время последнего изменения с помощью командного файла

Я пытаюсь скопировать все *.csv файлы из папки в другую папку, но при копировании мне нужно добавить измененную дату и время файла в имя файла. Например, если имя файла Test.csv и это было изменено на 11/21/201815: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.

Надеюсь, это поможет вам, так как это быстрее.

Другие вопросы по тегам