Сохраните метку времени последнего созданного CSV-файла в каталоге в переменную - PullRequest
0 голосов
/ 28 февраля 2019

Я новичок в пакетных файлах и хотел бы получить метку времени последнего созданного файла определенного типа в папке и сохранить эту метку в переменной.

Пока это то, что у меня есть:

FOR /f %%i in ('dir /O:D /T:C /b *.csv') DO (set LAST=%%i
    goto stop)

:stop

echo Last created file:%LAST%

Вывод - имя файла, но мне также нужна временная метка.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я решил добавить это в качестве альтернативного ответа для предоставления созданной метки времени, включая секунды, т.е. yyyy/MM/dd @hh:mm:ss.Метод определения файла не изменился, DIR, я только что использовал утилиту командной строки WMI wmic.exe, чтобы получить дату не зависящим от локали способом.

@Echo Off
If Not Exist *.csv Exit/B
For /F Delims^=^= %%A In ('Set _ 2^>Nul')Do Set "%%A="
For /F Delims^=^ EOL^= %%A In ('Dir/B/OD/TC *.csv 2^>Nul'
    )Do If /I "%%~xA"==".csv" Set "_F=%__CD__%%%A"
For /F Delims^=^ EOL^= %%A In ('WMIC DataFile Where "Name='%_F:\=\\%'"^
 Get CreationDate 2^>Nul')Do For %%B In (%%~nA)Do Set "_C=%%B"
If Not Defined _C Exit /B
Set "_C=%_C:~,4%/%_C:~4,2%/%_C:~6,2% @ %_C:~-6,2%:%_C:~-4,2%.%_C:~-2%"
If Defined _F Echo( Your latest file, %_F%, was created on %_C%&Pause

Если вам нужна только временная метка в качестве переменной, вы можете использовать более простые методы поиска.

Вы можете использовать powershell.exe из своего пакетного файла, , что также обеспечивает точность секунд :

@For /F "Tokens=*" %%A In ('PowerShell -NoP^
 "Ls *.csv|Sort CreationTime|Select CreationTime" 2^>Nul'
)Do @Set "CTS=%%A"
@Set CTS 2>Nul&&Pause

Эта версия предпочтительна, если в текущем каталоге имеется большое количество csv-файлов, и она даст вам способ управления -F ormat результата) :

@For /F "Tokens=*" %%A In ('PowerShell -NoP^
 "Ls . -Filt *.csv|Sort CreationTime -Des|Select -F 1 -Exp CreationTime|"^
 "Date -F 'yyyy/MM/dd @hh:mm:ss'" 2^>Nul')Do @Set "CTS=%%A"
@Set CTS 2>Nul&&Pause

Или, если вы хотите придерживаться только cmd.exe, вы удовлетворены тем, что дата и время всегда отображаются в виде первой и второй строк, разделенных пробелом команды DIR, и ненужна более минутная точность, тогда я бы посоветовал вам использовать это:

@For /F "EOL= Delims=" %%A In ('Dir/OD/TC *.csv 2^>Nul'
    )Do @If /I "%%~xA"==".csv" For /F "Tokens=1-2" %%B In ("%%A"
    )Do @Set "CTS=%%B @%%C"
@Set CTS 2>Nul&&Pause
0 голосов
/ 28 февраля 2019

Попробуйте это:

::@echo off
set LAST=
set TimeStamp=
FOR /f "tokens=1,2,4" %%i in ('dir /O:-D /T:C *.csv^|findstr .csv') DO (
    set "LAST=%%k"
    set "TimeStamp=%%i %%j"
    goto stopfor
)
:stopfor

echo Last created file: %LAST%
echo Time Stamp: %TimeStamp%

- перед D для убывания.
Удалено -b, потому что это не позволит отображать метку времени.
А затем направить вfindstr, чтобы показать только эти строки файла.(Игнорировать сводки)
Проверьте for /?, dir /? и findstr /? для получения дополнительной информации.

Другой способ, нет необходимости передавать по трубопроводу на findstr:

::@echo off
set LAST=
set TimeStamp=
FOR /f  %%i in ('dir /O:-D /T:C /b *.csv') DO (
    set "LAST=%%i"
    set "TimeStamp=%%~ti"
    goto stopfor
)
:stopfor

echo Last created file: %LAST%
echo Time Stamp: %TimeStamp%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...