Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Архивация файлов с помощью 7zip, имена которых содержат пробел (http://forum.oszone.net/showthread.php?t=246479)

MONaH Rasta 08-11-2012 13:58 2021508

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

$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.p...08#post2024040

Iska 08-11-2012 16:51 2021587

Код:

$Archivate = """" & $ProgramFilesDir & $7z & """ a -mx9 """ & $ArchiveName & """ """ & $File & """ " & $ArchOptions

MONaH Rasta 08-11-2012 17:25 2021614

Код:

"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 2021615

"""" можно заменить на '"'
Я, обычно, так и делаю.

MONaH Rasta 08-11-2012 17:34 2021620

я только не понял чем мой метод не угодил...

Iska 08-11-2012 23:02 2021891

Цитата:

Цитата MONaH Rasta
И так столько раз, сколько файлов в папке. »

Уберите вовсе «@ComSpec & ' /c ' & » из RunWait(). Удаляйте при помощи «FileDelete()».

Цитата:

Цитата MONaH Rasta
Скрипт в том числе самоуничтожается »

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

MONaH Rasta 09-11-2012 13:15 2022203

Поправил 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 2024040

«Правильная версия»
Код:

#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



Время: 00:32.

Время: 00:32.
© OSzone.net 2001-