Архивные файлы с определенным расширением - PullRequest
1 голос
/ 30 апреля 2010

Итак, мне нужен Windows Script, который я могу указать каталогу, через который он будет проходить, и он будет анализировать все подкаталоги и, находясь в каждом подкаталоге, будет архивировать все файлы с определенным расширением и сохранять его в том же подкаталоге, затем перейдите к следующему.

Какой лучший способ сделать это? Скрипты автоматизации Perl, AutoIt?

Какой пример кода вы, ребята, можете мне дать?

Ответы [ 4 ]

3 голосов
/ 30 апреля 2010

Perl более мощный, чем пакетные сценарии, но поскольку Perl не включен в Windows, он кажется излишним для таких задач, как эта. Это должно, например, работать:

FOR /R C:\hello\ %%G IN (*.txt) DO "c:\Program Files\7-Zip\7z.exe" a %%G.zip %%G && del %%G

Обратите внимание, что вы не можете сделать это непосредственно в приглашении, вы должны сохранить его как файл .bat. Конечно, также возможно разрешить пользователю указывать пути и расширения с помощью командной строки следующим образом:

FOR /R %1 %%G IN (%2) DO "c:\Program Files\7-Zip\7z.exe" a %%G.zip %%G && del %%G

Более подробную информацию о FOR и других командах командной строки Windows можно найти здесь: http://ss64.com/nt/

Это будет тогда выполняться с:

test.bat C:\Hello\ *.txt

РЕДАКТИРОВАТЬ: Это, очевидно, требует, чтобы у вас был установлен 7-Zip, но совершенно очевидно, где изменить код, если вы хотите использовать другую молнию. Также имейте в виду, что всегда будьте предельно осторожны при экспериментировании с такими скриптами, как этот. Одна небольшая ошибка может привести к удалению большого количества файлов, поэтому всегда проверяйте ее на копии файловой системы, пока не убедитесь, что она работает.

3 голосов
/ 30 апреля 2010

FORFILES включен в Windows и может быть более применим, чем FOR к тому, что вы пытаетесь сделать:

FORFILES [/ P pathname] [/ M searchmask] [/ S] [/ C команда] [/ D [+ | -] {ММ / ДД / ГГГГ | дд}]

Описание: Выбирает файл (или набор файлов) и выполняет Команда в этом файле. Это полезно для пакетных заданий.

Список параметров:

/P    pathname      Indicates the path to start searching.
                    The default folder is the current working
                    directory (.).

/M    searchmask    Searches files according to a searchmask.
                    The default searchmask is '*' .

/S                  Instructs forfiles to recurse into
                    subdirectories. Like "DIR /S".

/C    command       Indicates the command to execute for each file.
                    Command strings should be wrapped in double
                    quotes.

                    The default command is "cmd /c echo @file".

                    The following variables can be used in the
                    command string:
                    @file    - returns the name of the file.
                    @fname   - returns the file name without
                               extension.
                    @ext     - returns only the extension of the
                               file.
                    @path    - returns the full path of the file.
                    @relpath - returns the relative path of the
                               file.
                    @isdir   - returns "TRUE" if a file type is
                               a directory, and "FALSE" for files.
                    @fsize   - returns the size of the file in
                               bytes.
                    @fdate   - returns the last modified date of the
                               file.
                    @ftime   - returns the last modified time of the
                               file.

                    To include special characters in the command
                    line, use the hexadecimal code for the character
                    in 0xHH format (ex. 0x09 for tab). Internal
                    CMD.exe commands should be preceded with
                    "cmd /c".

/D    date          Selects files with a last modified date greater
                    than or equal to (+), or less than or equal to
                    (-), the specified date using the
                    "MM/dd/yyyy" format; or selects files with a
                    last modified date greater than or equal to (+)
                    the current date plus "dd" days, or less than or
                    equal to (-) the current date minus "dd" days. A
                    valid "dd" number of days can be any number in
                    the range of 0 - 32768.
                    "+" is taken as default sign if not specified.
1 голос
/ 01 мая 2010

Ниже один способ, которым я бы сделал это в AutoIt, так как вы спросили. Замените строку MsgBox на любой код, который вам нужен, чтобы делать то, что вы хотите. АвтоЭто забавная штука!

#include <File.au3>

archiveDir(InputBox("Path","Enter your start path."))

Func archiveDir($rootDirectory)
    $aFiles = _FileListToArray($rootDirectory)

    For $i = 1 To UBound($aFiles) - 1
        If StringInStr(FileGetAttrib($aFiles[$i]),"D") Then archiveDir($rootDirectory & $aFiles[$i] & "\")
        MsgBox(0,"This would be your archive step!",'"Archiving" ' & $rootDirectory & $aFiles[$i])
    Next
EndFunc
0 голосов
/ 30 апреля 2010

Одним из решений может быть:

my $dirCnt = 0;
traverse_directory('C:\Test');

sub traverse_directory{
    my $directory = shift(@_);  
    $dirCnt++;

    my $dirHandle = "DIR".$dirCnt;    
    opendir($dirHandle, $directory);

    while (defined(my $file = readdir($dirHandle))){
         next if $file =~ /^\.\.?$/;                # skip . and .. ...
         if (-d "$directory\\$file"){  traverse_directory("$directory\\$file");  }
         if ($file =~ /\.txt/){  #find txt files, for example

             print "$file\n";      #do something with the text file here
         }
    }
    closedir($dirHandle);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...