PDA

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


MONaH Rasta
08-11-2012, 13:58
Приветствую всех.
Задача проста, скрипт должен бесшумно архивировать все файлы в дирректории и удалять их после архивирования. Хорошо бы, конечно, по расширению определять и исключать архивы, но можно и без этого.
Написал, как смог, прошу сильно не пинать.
$K='"'
$DEL = "DEL /F /Q "
$7z = '7-Zip\7z.exe'
$ArchOptions = ' -mmt -ms=off'
$CurrentDir= @ScriptDir & '\'
$ProgramFilesDir = @ProgramFilesDir & '\'

$Search = FileFindFirstFile("*.*")
If $Search = -1 Then
Exit
EndIf

While 1
$File = FileFindNextFile($Search)

If @error Then
ExitLoop
ElseIf $File = @ScriptName Then
$File = FileFindNextFile($Search)
EndIf

$ArchiveName = $File & '.7z'
$Archivate = $K & $ProgramFilesDir & $7z & $K & ' a -mx9 ' & $ArchiveName & ' ' & $File & $ArchOptions
Archivate($File)
WEnd

Func Archivate($File)
RunWait(@ComSpec & ' /c ' & $Archivate, "")
RunWait(@ComSpec & ' /c ' & $DEL & $K & $CurrentDir & $File & $K, "")
EndFunc

FileClose($Search)
Сыроват, будет доработан, это всё понятно. Столкнулся с проблемой и не могу решить. Если имена файлов содержат пробелы, их необходимо заключать в кавычки. Ок, попробовал сделать вот так:
$K='"'
$DEL = "DEL /F /Q "
$7z = '7-Zip\7z.exe'
$ArchOptions = ' -mmt -ms=off'
$CurrentDir= @ScriptDir & '\'
$ProgramFilesDir = @ProgramFilesDir & '\'

$Search = FileFindFirstFile("*.*")
If $Search = -1 Then
Exit
EndIf

While 1
$File = FileFindNextFile($Search)

If @error Then
ExitLoop
ElseIf $File = @ScriptName Then
$File = FileFindNextFile($Search)
EndIf

$ArchiveName = $File & '.7z'
$Archivate = $K & $ProgramFilesDir & $7z & $K & ' a -mx9 ' & $K & $ArchiveName & $K & ' ' & $K & $File & $K & $ArchOptions
Archivate($File)
WEnd

Func Archivate($File)
RunWait(@ComSpec & ' /c ' & $Archivate, "")
RunWait(@ComSpec & ' /c ' & $DEL & $K & $CurrentDir & $File & $K, "")
EndFunc

FileClose($Search)
На что я получаю сообщение:
"C:\Program" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

D:\Program Files\AutoIt3\M\TMP>
Не совсем понимаю в чём проблема. Дописываю копирование в буфер комманды, которая отправляется скриптом в @ComSpec.
Func Archivate($File)
ClipPut($Archivate)
RunWait(@ComSpec & ' /k ' & $Archivate, "")
RunWait(@ComSpec & ' /c ' & $DEL & $K & $CurrentDir & $File & $K, "")
EndFunc
Вот что в результате получаю в буфер:
"C:\Program Files\7-Zip\7z.exe" a -mx9 "TESTкопия.au3.7z" "TESTкопия.au3" -mmt -ms=off
Открываю cmd, ctrl+v -> enter. Всё ок, работает...
Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

d:\Program Files\AutoIt3\M\TMP>"C:\Program Files\7-Zip\7z.exe" a -mx9 "TESTкопия.au3.7z" "TESTкопия.au3" -mmt -ms=off

7-Zip [64] 9.22 beta Copyright (c) 1999-2011 Igor Pavlov 2011-04-18
Scanning

Creating archive TESTкопия.au3.7z

Compressing TESTкопия.au3

Everything is Ok

d:\Program Files\AutoIt3\M\TMP>

Прошу помощи...

UPD: Решение тут: http://forum.oszone.net/showthread.php?p=2021508#post2024040

Iska
08-11-2012, 16:51
$Archivate = """" & $ProgramFilesDir & $7z & """ a -mx9 """ & $ArchiveName & """ """ & $File & """ " & $ArchOptions

MONaH Rasta
08-11-2012, 17:25
"TEST" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

D:\Program Files\AutoIt3\M\TMP>
И так столько раз, сколько файлов в папке. Скрипт в том числе самоуничтожается :)

список файлов в папке: TEST.au3
TEST - копия.au3
TEST - копия (4).au3
TEST - копия (5).au3
TEST - копия (6).au3

madmasles
08-11-2012, 17:27
"""" можно заменить на '"'
Я, обычно, так и делаю.

MONaH Rasta
08-11-2012, 17:34
я только не понял чем мой метод не угодил...

Iska
08-11-2012, 23:02
И так столько раз, сколько файлов в папке. »
Уберите вовсе «@ComSpec & ' /c ' & » из RunWait(). Удаляйте при помощи «FileDelete()».

Скрипт в том числе самоуничтожается »
А Вы что ожидали? Что каким-то чудом этого не произойдёт?

MONaH Rasta
09-11-2012, 13:15
Поправил 1 строку и всё заработало, как я хотел (подсказали на другом форуме).

RunWait(@ComSpec & ' /c ' & $K & $Archivate & $K, "")

Так же подправил код, чтобы сам себя скрипт не удалял. Выкладываю, может пригодится кому-нить...
$K='"'
$DEL = "DEL /F /Q "
$7z = '7-Zip\7z.exe'
$ArchOptions = ' -mmt -ms=off'
$CurrentDir= @ScriptDir & '\'
$ProgramFilesDir = @ProgramFilesDir & '\'
$ArchiveName = '\/:*?"<>|'

$Search = FileFindFirstFile("*.*")

If $Search = -1 Then
Exit
EndIf

While 1
$File = FileFindNextFile($Search)

If @error Or $File = "" Then
ExitLoop
ElseIf $File = @ScriptName Or $File = $ArchiveName Then
$File = FileFindNextFile($Search)
If @error Or $File = "" Then
ExitLoop
EndIf
EndIf

$ArchiveName = $File & '.7z'
$Archivate = $K & $ProgramFilesDir & $7z & $K & ' a -mx9 ' & $K & $ArchiveName & $K & ' ' & $K & $File & $K & $ArchOptions

Archivate($File)
WEnd

Func Archivate($File)
RunWait(@ComSpec & ' /c ' & $K & $Archivate & $K, "", @SW_HIDE)
RunWait(@ComSpec & ' /c ' & $DEL & $K & $CurrentDir & $File & $K, "", @SW_HIDE)
EndFunc

FileClose($Search)

Благодарю всех откликнувшихся!

MONaH Rasta
12-11-2012, 13:36
#include <File.au3>

$CurrentDir= @ScriptDir
$ArchOptions = ' -mmt -ms=off'
$7z = StringReplace(RegRead('HKLM\Software\7-Zip','Path')&'\','\\','\') & '7z.exe'
If $7z = "\7z.exe" Then $7z = StringReplace(RegRead('HKLM64\Software\7-Zip','Path')&'\','\\','\') & '7z.exe'

$ver = StringReplace(FileGetVersion($7z),'.','')
If $ver > 92500 Then $ArchOptions &= ' -sdel'

$arrayFile=_FileListToArray($CurrentDir,'*',1)
If @Error Then Exit

For $a=1 To $arrayFile[0]
If $arrayFile[$a] <> @ScriptName AND _FileGetExt($arrayFile[$a]) <> ".7z" Then _Archivate($arrayFile[$a])
Next

Func _FileGetExt($sPath)
Local $NULL, $sExt
_PathSplit($sPath, $NULL, $NULL, $NULL, $sExt)
Return $sExt
EndFunc

Func _Archivate($File)
$err = RunWait('"' & $7z & '" a -mx9 "' & $File & '.7z" "' & $File & '"' & $ArchOptions)
If $err = 0 AND $ver <= 92500 Then FileDelete($File)
EndFunc




© OSzone.net 2001-2012