Хотите сжать все содержимое (файлы / папки) в 4 разных папках, которые присутствуют в родительской папке - PullRequest
0 голосов
/ 05 ноября 2019

Я хочу сжать все содержимое (папки / файлы), представить внутри 4 разные папки и хочу сохранить сгенерированные 4 разные .zip файлы с тем же именем, что и соответствующая родительская папка.

Например, в папке D:\test\pk у меня есть 4 папок в папке pk:

knomBk-2.4-1
knomBk-2.3-1
knomBk-2.5-1
knomBk-2.6-1

Внутри всех этих четырех папок у меня есть похожий набор содержимого (файлы/ папки). Я хочу сжать все содержимое всех этих четырех папок одну за другой и скопировать получившиеся 4 .zip файлы в папку на моем D: диске.

Так что я получу что-то вроде:

D:\outputzipfiles\knomBk-2.4-1.zip
D:\outputzipfiles\knomBk-2.3-1.zip
D:\outputzipfiles\knomBk-2.5-1.zip
D:\outputzipfiles\knomBk-2.6-1.zip

Как я могу это сделать?

Я попробовал команду цикла for %a in (directory) do {command..}, например:

 D:\test\pk>  FOR %a in (`DIR \b  *-1`) do "C:\\Program Files\\7-Zip\\7z.exe" a -tzip d:/outputzipfiles/   -o"%~na"

Я знаю, что приведенная выше команда неверна, так как она должна выглядеть примерно так: -tzip d: \ outputzipfiles \ knomBk-* .zip, но я не знаю, как это сделать.

Я также пробовал некоторые комбинации, используя команду forfiles, но безуспешно.

1 Ответ

1 голос
/ 05 ноября 2019

Вот моя первоначальная настройка теста (в следующий раз, возможно, вы захотите предоставить что-то подобное нам).

mkdir sotest
cd sotest
mkdir knomBk-2.4-1
mkdir knomBk-2.3-1
mkdir knomBk-2.5-1
mkdir knomBk-2.6-1
echo "oops" > knomBk-2.4-1\a.txt
echo "oops" > knomBk-2.3-1\b.txt
echo "oops" > knomBk-2.5-1\c.txt
echo "oops" > knomBk-2.6-1\d.txt

Когда мне нужно что-то вроде вас, я делаю это шаг за шагом. Изучая эту технику, вы сможете решить множество проблем. Это выглядит так:

  1. Проверьте, работает ли dir \b *-1, как ожидалось:

    D:\temp\sotest>dir \b *-1
     Volume in drive D is Mirror
     Volume Serial Number is B693-F1F1
    
     Directory of D:\
    
    File Not Found
    
     Directory of D:\temp\sotest
    
    05.11.2019  21:47    <DIR>          knomBk-2.3-1
    05.11.2019  21:47    <DIR>          knomBk-2.4-1
    05.11.2019  21:47    <DIR>          knomBk-2.5-1
    05.11.2019  21:47    <DIR>          knomBk-2.6-1
                   0 File(s)              0 bytes
                   4 Dir(s)  2.945.857.200.128 bytes free
    

    Ответ: нет, это не так. Правильно dir /b *-1 с косой чертой

  2. Проверьте, работает ли цикл for:

    D:\temp\sotest>for %a in (`dir /b *-1`) do echo %a
    
    D:\temp\sotest>echo `dir
    `dir
    
    D:\temp\sotest>echo /b
    /b
    

    Ответ: нет, это не так. Правильным является for /F %a in ('dir /b *-1') do echo %a с /F в качестве аргумента и прямыми апострофами.

  3. Проверьте, работают ли мои необходимые аргументы (например, %~na):

    D:\temp\sotest>for /F %a in ('dir /b *-1') do echo "%~na"
    
    D:\temp\sotest>echo "knomBk-2"
    "knomBk-2"
    
    D:\temp\sotest>echo "knomBk-2"
    "knomBk-2"
    
    D:\temp\sotest>echo "knomBk-2"
    "knomBk-2"
    
    D:\temp\sotest>echo "knomBk-2"
    "knomBk-2"
    

    Ответ: нет, это не так. Часть ~n интерпретирует часть .3-1 как расширение файла, что не ожидается. Вместо этого просто используйте "%a".

  4. Проверьте, работает ли команда без цикла for:

    D:\temp\sotest>"C:\Program Files\7-Zip\7z.exe" a -tzip "d:/temp/sotest/" -o"x"
    

    Ответ: нет, это не так. Неверное имя файла, и полученный zip-файл содержит все каталоги, а не один. Косые черты в неправильном направлении. Правильная команда "C:\Program Files\7-Zip\7z.exe" a -tzip -o"d:\temp\sotest\" "x" knomBk-2.3-1/* с -o в правильном месте и именем каталога, который будет добавлен.

  5. Наконец, объедините все:

    for /F %a in ('dir /b *-1' ) do "C:\Program Files\7-Zip\7z.exe" a -tzip -o"d:\temp\sotest\" "%a.zip" "%a/*"
    
...