3

У меня есть много файлов .txt в каталоге. В каталоге также содержатся файлы .png и некоторые файлы .pdf. Я успешно конкатенировал .txt файлы с помощью этой команды:

@ECHO Off
SETLOCAL
for /r %%f in (*.txt) do (
echo.
type "%%f"
)>> output.doc

GOTO :EOF

Вышеуказанная команда была получена с одного из интернет-сайтов. Эта команда объединит файлы .txt в алфавитном порядке. Но я не хочу, чтобы это было так, я хочу, чтобы это было сделано к дате изменения или создания (изменение рекомендуется). У меня есть подсказка, что линия

for /r %%f in(*.txt) do ( 

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

Извините, что не включил этот вопрос в первый раз. У меня есть еще одно требование, основанное на другом вопросе, который я задавал ранее (Вопрос) У меня есть пакетный файл для объединения файлов .txt и для добавления двух строк поверх каждого файла (одна для записи имени файла без расширения и другая для записи даты, связанной с составным файлом).Может кто-нибудь, пожалуйста, измените приведенный ниже пакетный файл, чтобы объединить файлы .txt в порядке изменения даты и добавить две строки в верхней части каждого файла.

@echo off
SETLOCAL
for /r %%f in (*.txt) do (
echo File Name   : %%~nf 
FOR /f %%d IN ("%%~tf") DO echo Date        : %%d
echo.
type "%%f"
) >> output_text.doc

GOTO :EOF

Каждая проблема решена окончательным пакетным файлом:

@echo off
setlocal enableextensions disabledelayedexpansion

set "root=%cd%"

>"output.doc" (
    for /f "tokens=1,2,*" %%a in ('
        robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
        ^| sort 
    ') do (
     echo( %%~nc
     for /f "tokens=1-3 delims=/" %%d in ("%%a") do echo %%f/%%e/%%d
     type "%%~fc"
    )
)

3 ответа3

1
@echo off
    setlocal enableextensions disabledelayedexpansion

    set "root=%cd%"

    >"output.doc" (
        for /f "tokens=2,*" %%a in ('
            robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
            ^| sort 
        ') do type "%%~fb"
    )

Это позволит использовать robocopy чтобы получить список всех файлов .txt в указанной корневой папке.

Список файлов создается с указанием даты последнего изменения файлов. robocopy печатает время UTC в формате yyyy/mm/dd hh:mm:ss , поэтому список можно правильно отсортировать.

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

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

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "root=%cd%"

    >"output.doc" (
        for /f "tokens=1,2,*" %%a in ('
            robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
            ^| sort 
        ') do (
            echo(%%~nc
            echo(%%a %%b [%%~tc]
            type "%%~fc"
        )
    )

Предложение tokens было изменено, чтобы получить метку времени из robocopy чтобы мы могли включить ее в вывод. %%a будет содержать дату, %%b время и %%c имя файла с полным путем.

Для каждого файла сначала выводится имя файла без расширения (%%~nc), затем отметка времени robocopy и, просто для сравнения, поскольку выводом robocopy является время UTC, отметка времени файла (%%~tc). Затем файл набирается.

Как и прежде, весь вывод перенаправляется в конечный файл.

1

Powershell (3 см. Примечание) один вкладыш:

gci *.txt -Recurse -File |sort -Property LastWriteTime |% {(gc $_) + "`n"} >output.doc

  • Сначала перечисляются все подходящие файлы (gci)
  • затем сортирует их по дате изменения (sort)
  • затем получает содержимое файла и добавляет новую строку к каждому (gc)
  • и, наконец, записывает все в выходной файл.

Примечание: потому что он использует -File который был представлен в PS3. Это может быть переписано в синтаксисе Ps2, но это более многословно.

Изменить: в соответствии с запросом OP: изменить {(gc $ _) + "` n "} следующим образом:

{"$($_.basename)`n$(get-date -u %d/%m/%Y $_.lastwritetime)`n$(gc $_)`n"}


(интерполяция строк используется на этот раз, чтобы показать различные варианты)

Примечание: [возможные] несоответствия и проблемы с кодировкой файлов не решены.


1
for /f "delims=:" %f in ('dir *.txt /O:D /T:W /B') do @echo %f

Эта команда будет использовать dir для сортировки по самой старой и самой новой дате (/O:D), используя последнюю записанную дату (/T:W) и пустой формат (/B), чтобы просто вернуть имена файлов. Установка delims на : в команде for предотвращает попытку анализа имени файла на основе пробелов или запятых, поскольку : в имени файла не допускается.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .