1

Углубленное объяснение проблемы:

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

Теперь я пытаюсь выяснить, как я могу получить содержимое txt-файла из каталога и добавить его в "основной файл". Итак, в принципе, как это работает сейчас, у меня есть архив по электронной почте мне каждый день [TODAY'S_DATE] .zip. Скрипт перемещает этот архив в папку. Затем у меня есть файл .bat, который извлекает содержимое в папку с именем [TODAY'S_DATE] и перемещает архив в папку с именем "Завершено". Мне нужно знать, как извлечь текст из файла при его извлечении и сбросить его в файл «Master.txt», который будет постоянно увеличиваться.

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

Моя настройка:

  • Использование Windows 7
  • Использование 7zip командной строки для извлечения
  • С помощью .Bat файл для извлечения файла из архива в каталог

Проблема:

  • Нужно взять txt из архива и объединить его в файл «master.txt».

Текущее содержимое .bat файла:

7za x *.zip -o*

COPY /Y *.zip " \Completed\"

@echo extraction complete

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

5 ответов5

1

Я не уверен, что понимаю ваш комментарий о незнании названия вашего файла.  Я полагаю, ваша ситуация такова, что у вас есть структура каталогов примерно такая:

|       ︙
|
+---current
|       730643_594352.txt
|
+---master
|       master.txt

где вы не знаете имя (730643_594352.txt) current файла - но это единственный файл (или, по крайней мере, единственный файл .txt) в current каталоге, поэтому *.txt работает.  Если это так, почему бы и нет

ren current\*.txt current\today.txt

а потом оперируете по имени (today.txt)?  Если вам нужно сохранить его имя в полученном виде по электронной почте, создайте параллельный temp каталог и выполните

copy current\*.txt temp\today.txt
1

Это просто:
copy file1.txt+fileX.txt intome.txt или copy singlefile.txt+intome.txt

РЕДАКТИРОВАТЬ: просто прочитайте ваш комментарий к вашему сообщению. Значит, вы не знаете имен файлов? Позвольте мне расширить материал выше ... всего на секунду :)

EDIT2: мне пришлось искать его, и я думаю, что самое простое, что вы можете сделать, это не зная имя файла: copy /b *.txt newfile.txt из командной строки или пакетный cmd для объединения нескольких файлов

1

Вы можете добавить содержимое одного файла в другой с помощью команды "type" и оператора «>>» следующим образом:

type todaysfile.txt >> masterfile.txt

Сначала вам может понадобиться вставить новую строку в ваш мастер-файл, чтобы новый контент начинался с отдельной новой строки, например:

echo. >> masterfile

Если вы не знаете имен файлов, вы можете добавить каждый файл в каталог "завершено" следующим образом:

type completed\* >> masterfile.txt

"type" и "echo" будут выводить данные, а оператор «>>» говорит ему добавить эти выходные данные в файл.

Источник: тип, эхо, перенаправление команд

0

У вас есть новый файл с именем [TODAY'S_DATE] .zip, который каким-то процессом перемещается в папку.

Я предполагаю, что:

  1. Файл на самом деле называется примерно так: 2013-0511.zip, и каждый день он меняется .
  2. Текущий каталог во время запуска .bat файла - это та же папка, в которой был создан новый .zip файл.
  3. Существует только один файл .zip для обработки в любой момент времени.
  4. Папка, в которую извлекается файл .txt, создается процессом распаковки. Другими словами, папка назначения именуется в файле .zip поэтому вы ничего не делаете для создания папки назначения в командах внутри пакетного файла.
  5. Часть имени файла .zip (таким образом, «2013-0511» в моем примере выше) совпадает с именем папки внутри файла .zip и с именем папки, в которую извлекается файл .txt,
  6. Полный путь и имя файла «Master.txt» постоянны.

Вот пакетный файл, который должен работать для вас:

@echo off

rem    define the full path and filename of the "Master.txt" file
set "zzmaster=C:\Master\Master.txt"

for %%f in ("*.zip") do call :work "%%~dpf" "%%~nf"

rem        other processing here..., then goto :EOF
rem        recommend moving or deleting the .zip file so it is not present 
rem        the next time this is run, or use MOVE instead of COPY below


rem        cleanup environemnt variables if necessary
set "zzmaster="
set "zzpath="
set "zzname="
set "zztxt="


goto :EOF



:work
rem:work %1, %2 will contain the Path and Name of the .zip file (extension is of course .zip)

set "zzpath=%~1"
set "zzname=%~2"

rem        this will extract the .zip file as you specified before
7za x "%zzname%.zip" -o*
COPY /Y "%zzname%.zip" "\Completed\"
@echo extraction complete

rem        you know the folder that the .txt file was extracted into is the sane as %zzname%
rem        this will look in the new folder created by the unzip process and get all files with an extension of .txt
rem        this can easily be adjusted if it is not what you want.

for %%g in ("%zzname%\*.txt") do call :doappend "%%~nxg"


rem        optional: delete the folder that contained the extracted .txt file(s)
rem rd "%zzname%">nul 2>&1

goto :EOF



:doappend
rem:doappend %1 is the name.ext of the file to append to master

set "zztxt=%~1"

rem        optional: if Master file already exists, add a blank line to the end of Master file
if exist "%zzmaster%" echo.>> "%zzmaster%"


rem        append the contents of the extracted .txt file to the end of the Master file
type "%zzname%\%zztxt%" >> "%zzmaster%"


rem        optional: delete the extracted .txt file
rem del "%zzname%\%zztxt%">nul 2>&1


goto :EOF

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

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

0

Я хочу поблагодарить всех, кто нашел время, чтобы ответить. Я стал больше копаться в документации 7Zip, проверил некоторые вещи и в итоге пришел к ответу.

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

Необходим был переход с 7zip (-so). Это позволяет извлечь файл в STDOUT и перенаправить поток в любой файл, который вы хотите.

Вот как это выглядит:

7za e *.zip -y -so >> masterlist.txt

Это позволило мне вообще пропустить извлечение файла в каталог, что помогает сэкономить дисковое пространство и обработку файла. Если у вас есть структура каталога, и вы знаете имя файла (у меня не было такой роскоши), то вы можете использовать:

7za e *.zip -ir!PATH\FILENAME.txt -y -so >> masterlist.txt

Кроме того, на случай, если кто-то захочет увидеть рабочий файл .bat, это то, что у меня есть.

7za e *.zip -y -so >> masterlist.txt
MOVE /Y *.zip  Completed
@echo extraction complete

Строка 1: 7zip извлекает отдельный файл и отправляет вывод в STDOUT, который затем добавляется (>>) в masterlist.txt.

Строка 2: почтовый архив перемещается в папку «Завершено», поэтому в будущем он не будет обрабатываться снова.

Строка 3: она позволяет вам знать, что извлечение завершено, хотя вы, вероятно, этого не увидите (по крайней мере, так, как я это использую).

Я надеюсь, что это поможет кому-то. :-)

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