1

Я использую командный файл для резервного копирования файлов в 7-Zip архивы. Он создает архив для каждого файла отдельно в папке, где находится исходный файл. Работает с подпапками.

FOR /r %%i IN (*.*) DO ( "c:\program files\7-zip\7z.exe" a "%%~i.7z" "%%i" -p"%variable%" -t7z -mx0 -mhe -mmt )

Затем я клонирую исходное дерево каталогов (здесь не копируются файлы) с помощью XXCopy в новое место назначения.

XXCopy "%DirectorySource%" "%DirectoryDestination%" /T /ED5 /Q3 /YY

Затем я перемещаю все файлы 7z в клонированную структуру каталогов выше.

XXCopy "%DirectorySource%\*.7z" "%DirectoryDestination%" /S /ED /RC /YY /Q3

Это прекрасно работает, хотя я хотел бы создать архивы 7z непосредственно в клонированной структуре каталогов. Нет файлов, которые будут созданы или изменены в исходном местоположении.

Спасибо!

1 ответ1

2

AutoHotKey на помощь! Ограничивать себя командной строкой Windows - это больно. Поскольку вы упомянули, что вы собираетесь сделать этот цикл в сочетании с AutoHotKey, почему бы просто не использовать AutoHotKey для всего этого?

Используйте StrLen и SubStr, чтобы извлечь переменную часть вашего пути к файлу. Файловый цикл будет проходить через все файлы, которые вы хотите. И тогда это просто вопрос использования RunWait для передачи сгенерированных вами путей в 7-Zip. « ,, Hide указанное в конце RunWait указывает скрыть созданные окна команд.

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

InputBox, password, Enter Password for Archives, The generated archives will be protected with the password you enter below. Your input will be masked., hide
; Using FileSelectFolder is just one way of choosing your folders.
FileSelectFolder, sourcepath,,, Source Folder
sourcepath := RegExReplace(sourcepath, "\\$")  ; Removes the trailing backslash, if present.
FileSelectFolder, destinationpath,,, Destination Folder
destinationpath := RegExReplace(destinationpath, "\\$")  ; Removes the trailing backslash, if present.

; This is the meat of the answer:
sourcelen := StrLen(sourcepath) + 1    ; Determine the start of the variable part of the path.
Loop, Files, %sourcepath%\*.*, R       ; Here's the replacement for your batch file loop.
{
    varfilepath := SubStr(A_LoopFileFullPath, sourcelen) ; Grab everything to the right of the source folder.
    RunWait, "c:\program files\7-zip\7z.exe" a "%destinationpath%%varfilepath%.7z" "%A_LoopFileFullPath%" -p"%password%" -t7z -mx0 -mhe -mmt,, Hide
    FileCount := a_index
}
Msgbox Archives Created: %FileCount%`nSource: %sourcepath%`nDestination: %destinationpath%

Обратите внимание, что вам нужен v1.1.21+ AHK или выше, чтобы файловый цикл работал как написано.

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