ОБНОВЛЕНИЕ: Я заметил, что многие люди просматривают эту ветку, что заставляет меня поверить, что эта ситуация не так уж редка. Во всяком случае, я задал подобный / связанный вопрос о SO здесь, который также имеет довольно приличные решения, которые могли бы решить проблему лучше.

На моем компьютере с Windows 7 у меня есть каталог, полный загруженных дампов в ZIP-архивах. Каждый архив содержит несколько текстовых файлов, PDF-файлов и редко XML-файлов. Я хочу извлечь все содержимое каждого ZIP-архива в соответствующую папку (должна быть создана во время процесса), исключая / игнорируя извлечение PDF-файлов. После извлечения необходимых файлов из архива обработанный zip-файл не должен быть удален (или я хотел бы знать, как я могу управлять им в различных ситуациях).

Если это помогает узнать, количество архивов в каталоге находится в диапазоне от 60 до 70 тыс. Кроме того, мне нужны отдельные выходные каталоги, потому что файлы в архиве могут иметь те же имена, что и файлы в других.

Например,

  • У меня есть все мои архивы, такие как one.zip , two.zip , .. в, скажем, D:\data
  • Я создаю новую папку для обработанных данных, скажем, D:\extracted
  • Теперь данные из D:\data\one.zip должны идти в D:\extract D:\extracted\one . Здесь D:\extracted\one должен быть создан автоматически.
  • Во время этого полного процесса распаковки не нужно извлекать все обнаруженные PDF-файлы (игнорировать). Нет смысла извлекать, а затем удалять.
  • (Необязательно) Файл журнала должен храниться, скажем, в D:\extracted . Идея состоит в том, чтобы использовать этот файл для возобновления обработки с того места, где он был оставлен в случае ошибки.
  • (Необязательно) Скрипт должен позволить мне решить, хочу ли я сохранить исходные архивы или удалить их после обработки.

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

  1. Рекурсивно разархивируйте файлы, где они находятся, затем удалите архивы
  2. 7 zip экстракт рекурсивно
  3. Можно ли рекурсивно перечислить содержимое файла zip с 7 zip без распаковки

но они не сильно помогли (кстати, я не профессионал в Windows). Я открыт для установки безопасного и без рекламы стороннего программного обеспечения (с открытым исходным кодом), такого как 7-zip.

РЕДАКТИРОВАТЬ: Есть ли готовый инструмент, чтобы сделать то, что мне нужно, я уже пробовал Multi Unpacker. Он не создает новые каталоги, он не может игнорировать файлы * .pdf. Начать даже медленно, я думаю, что сначала он читает все архивы в источнике, а затем начинает их обрабатывать.

Заранее спасибо!

1 ответ1

1

Изменяя найденный здесь ответ, этот фрагмент скрипта PowerShell должен делать то, что вы хотите. Просто сохраните его как файл с расширением ".ps1". При вызове, просто назовите его как ./filename.ps1, и он извлечет файлы в отдельные папки, удалит zip-файлы и удалит все файлы с расширением .pdf. Я не проверял, правильно ли он работает с рекурсивными путями, но стоит проверить его.

Изменить: Если вы не хотите, чтобы ваши zip-файлы были удалены, удалите или закомментируйте (#) строку rmdir -Path $_.FullName -Force

Требования: PowerShell, 7-Zip и для вас, чтобы установить 7-Zip путь в файле.

param([string]$folderPath="D:\Blah\files")

Get-ChildItem $folderPath -recurse | %{ 

    if($_.Name -match "^*.`.zip$")
    {
        $parent="$(Split-Path $_.FullName -Parent)";    
        write-host "Extracting $($_.FullName) to $parent"

        $arguments=@("e", "`"$($_.FullName)`"", "-o`"$($parent)\$($_.BaseName)`"");
        $ex = start-process -FilePath "`"C:\Program Files\7-Zip\7z.exe`"" -ArgumentList $arguments -wait -PassThru;

        if( $ex.ExitCode -eq 0)
        {
            write-host "Extraction successful, deleting $($_.FullName)"
            rmdir -Path $_.FullName -Force
            $arguments1="$($parent)\$($_.BaseName)\*.pdf"
            rmdir -Recurse -Path $arguments1
        }
    }
}

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