2010-04-30 9 views
1

J'ai donc besoin d'un script Windows que je peux lui dire un répertoire à parcourir et il va analyser tous les sous-répertoires et dans chaque sous-répertoire, va archiver tous les fichiers avec une certaine extension de fichier le même sous-répertoire, puis passez au suivant.Script Windows Batch Question

Quelle est la meilleure façon de procéder? Perl Automation Scripting, AutoIt?

Un exemple de code que vous pouvez me donner?

+3

Que voulez-vous dire par "archive", exactement? Certains outils d'archivage le feront en une seule commande ... –

+0

Par exemple, j'ai un répertoire avec say 15 sous-répertoires, qui à leur tour ont chacun plus de sous-répertoires. Il y a certaines extensions de fichiers Sharepoint n'aime pas, et donc tous ceux-ci doivent être compressés. – Scott

Répondre

1

Voici une façon que je le ferais dans AutoIt depuis que vous avez demandé. Remplacez la ligne MsgBox par le code dont vous avez besoin pour faire ce que vous voulez faire. AutoIt est amusant!

#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

Une solution pourrait être:

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); 
} 
3

Perl est plus puissant que les scripts de traitement par lots, mais étant donné que Perl ne sont pas inclus avec Windows, il semble exagéré pour des tâches comme celui-ci. Cela devrait par exemple fonctionner:

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

Notez que vous ne pouvez pas faire cela directement dans l'invite, vous devez l'enregistrer en tant que fichier .bat. Il est bien sûr également possible de permettre à l'utilisateur de spécifier les chemins et les extensions avec la ligne de commande comme ceci:

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

Plus d'informations sur FOR et autres fenêtres commandes de ligne de commande se trouve ici: http://ss64.com/nt/

Cette serait alors exécuté avec:

test.bat C:\Hello\ *.txt 

EDIT: Cela vous oblige évidemment d'avoir 7-Zip installé, mais il est assez évident où changer le code si vous souhaitez utiliser une autre fermeture éclair. Gardez également à l'esprit de toujours être extrêmement prudent lors de l'expérimentation avec des scripts tels que celui-ci. Une petite erreur pourrait lui faire supprimer beaucoup de fichiers, donc vous devriez toujours le tester sur une copie du système de fichiers jusqu'à ce que vous soyez absolument sûr que cela fonctionne.

+1

Sur ma planète, Perl fonctionne bien sur Windows depuis de nombreuses années. – mob

+0

Donc, disons que je crée un fichier .bat, le contenu de la seconde pour spécifier les extensions de fichier. Comment pourrais-je courir ça? – Scott

+0

Vous le lanceriez avec "test.bat c: \ hello \ txt". Alternativement, vous pouvez remplacer le *.% 2 dans le fichier bat avec simplement% 2 pour vous permettre de spécifier des caractères génériques. @mobrule: Permettez-moi de reformuler: Il fonctionne nativement, mais seulement si vous installez un interpréteur Perl comme ActivePerl sur votre système. Il est utile à de nombreuses fins, mais il semble que ce soit exagéré ici. – MatsT

3

forfiles est inclus avec Windows et peut-être plus applicable que pour ce que vous essayez de faire:

forfiles [/ chemin P] [/ M searchmask] [/ S] [/ Commande C] [/ D [+ | -] {MM/jj/aaaa | dd}]

Description: Sélectionne un fichier (ou un ensemble de fichiers) et exécute une commande sur ce fichier. Ceci est utile pour les travaux par lots.

Liste des paramètres:

/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. 
+0

Non "inclus avec Windows". Cela fait partie du Kit de ressources Windows. –

+1

A partir de Windows Vista, FORFILES est inclus en natif avec Windows, pas de kit de ressources nécessaire. –