Windows CMD / BATCH Сохранять новейший файл с отметкой даты - PullRequest
0 голосов
/ 14 февраля 2019

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

Вот соглашение об именах файлов. ФайлABC_YYYYMMDD.txt

  • ФайлABC_20190201.txt
  • ФайлABC_20190125.txt
  • Файл ABC_20190118.txt
  • Файл ABC_201901.*
  • ФайлABC_20190104.txt

Вы можете видеть, что отметка даты находится в самом имени файла.Эти файлы создаются еженедельно.Поэтому я бы хотел пройти через них пакетный файл и удалить все файлы, кроме наиболее устаревших на данный момент.Я действительно искал, как сделать это лучше всего, и я не нахожу много, поэтому мне нужны идеи.Я предпочитаю чистое решение cmd, но я также открыт для решений powershell.


Я пытаюсь разобрать дату с помощью ...

@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims= " %%G IN ('dir/b /a-d "C:\Users\thomas.maus\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName\FileABC_*.txt"') do (

            set fileName=%%G 
            Set theDate=!fileName:~8,8!
            echo !theDate!


)

Затем я хочу как-то взять эти даты из результатов цикла исделать что-то вроде

if "%theDate%" GEQ "*****not sure what to put here*****" (
    del *all the old files, also not sure what to put here*
)  

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

В качестве дополнительной опции, на всякий случай, если префикс имени файла изменяется повсеместно, и только _YYYYMMDD.txt остается постоянным, вы все равно можете выполнить задачу, используя эту дату, так как она уже сортируется по алфавиту.

Вот пример:

@Echo Off
Set "SrcDir=%UserProfile%\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName"
For /F "Delims==" %%A In ('Set $ 2^>Nul') Do Set "%%A="
Set "_="
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt 2^>Nul'
) Do Set "_=%%~nA" & Call Set "$%%_:~-8%%=%%A"
If Not Defined _ Exit /B
For /F "Tokens=1* Delims==" %%A In ('Set $ 2^>Nul') Do Set "_=%%B"
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt^|Find /V "%_%"'
) Do Del /A /F "%%A"

При этом используется тот факт, что команда Set будет выводить переменные в алфавитном порядке.

  • Строки 2 - 4 просто определяют и отменяют определение переменныхмы будем использовать.
  • Линии 5 и 6 - это одна строка, разбитая на две строки для удобства чтения.Это установит переменные, использующие последние восемь символов базовых имен файлов, к значению полного имени файла.
  • Строка 7 включена для выхода из сценария, на случай, если нет .txt файлов с базовым именемв каталоге, указанном в строке 2, было найдено подчеркивание, за которым следуют восемь символов.
  • Специальная строка 8 здесь выводит каждую переменную и соответствующее значение в алфавитном порядке.Выходные данные устанавливаются в переменную, которая перезаписывается, пока цикл не завершится.Это означает, что самый новый файл, последний в алфавитном порядке , хранится со значением файла, названного самой новой датой.
  • Линии 9 & 10 снова являются единичнымиСтрока разделена на две для удобочитаемости.Это снова зацикливает все совпадающие файлы в каталоге и использует команду Find, чтобы исключить вывод того, который совпадает с тем, который содержится в переменной, как файл с самой новой датой.Каждый вывод файла просто удаляется с помощью команды Del.

Обратите внимание, что в этом сценарии предполагается, что у вас есть только один файл с каждой датой, поскольку вы только заявили, что файлыгенерируются еженедельно.

0 голосов
/ 14 февраля 2019

Мы просто циклически перебираем файлы, отсортированные по дате в порядке убывания, затем пропускаем первый файл, теперь самый последний:

@for /f "skip=1" %%a in ('dir /b /o-d *.txt') do @echo @del %%a

Важно!

Этот пример будет только echo командой удаления в качестве безопасной меры, поэтому вы не удаляете файлы, которые вы не должны иметь.Чтобы выполнить фактическое удаление, удалите @echo из строки.

Чтобы узнать больше о функциях, которые мы использовали, выполните следующую команду из cmd.exe

  • for /?
  • dir /?
0 голосов
/ 14 февраля 2019

Если вас не интересуют даты файла, а только даты в именах файлов, вы можете сделать следующее, учитывая, что часть FileABC всегда одинакова и не содержит никаких _ сама по себе:

pushd "C:\Users\thomas.maus\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName" && (
    for /F "skip=1 delims= eol=|" %%F in ('
        dir /B /A:-D "FileABC_????????.txt" ^
            ^| sort /R
    ') do (
        del "%%F"
    )
    popd
)

Хотя sort /R выполняет алфавитную сортировку, это работает из-за выбранного вами формата даты, который гарантирует, что алфавитный порядок равен буквенно-цифровому.

0 голосов
/ 14 февраля 2019

Как насчет этого?

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do del %%i

Если вы просто хотите сначала проверить его (посмотреть, что он будет удалять), выполните:

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do echo %%i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...