2016-01-12 1 views
1

Je souhaite écrire un lot qui trouve tous les documents inférieurs à 50 mb dans c:\ et les copier dans un dossier mais ignorer les documents du répertoire système. Je préfère qu'il ne cherche même pas dans le répertoire système.commande forfiles ignorer un répertoire

Voici mon lot qui trouve et copie tous les fichiers moins 50 mb dans le bon répertoire mais je ne peux pas le faire pour ignorer le système de la recherche ou le répertoire C:\Windows.

@ECHO off 
:: variables 

SET odrive=%odrive:~0,2% 
SET backupcmd=xcopy /s /c /d /e /h /i /r /y 

MKDIR "C:\Users\Documents\USBBackups\DOC\C" 

forfiles /P C:\ /M *.DOC* /S /C "cmd /c if @fsize leq 50000000 echo @PATH " > "C:\Users\Documents\USBBackups\DOCC.txt" 
FOR /F "tokens=*" %%a in (C:\Users\Documents\USBBackups\DOCC.txt) do xcopy %%a "C:\Users\Documents\USBBackups\DOC\C" /c /h /i /r /y 

@ECHO off 

Répondre

2

Il n'y a aucun moyen de dire forfiles d'exclure certains répertoires lorsque le commutateur /S est fourni. Vous devrez écrire votre propre code pour cela.

Je ne voudrais pas utiliser forfiles pour cette raison de mauvaises performances, mais la norme for à la place:

@echo off 
for /D %%D in ("%SystemDrive%\*.*") do (
    if /I not "%%D"=="%SystemRoot%" (
     pushd "%%D" 
     for /R %%F in ("*.doc?") do (
      if %%~zF LEQ 50000000 (
       echo %%F 
      ) 
     ) 
     popd 
    ) 
) 

Ici, le niveau de répertoire racine est dénombrées par for /D. Tous les répertoires autres que %SystemRoot% sont énumérés récursivement par for /R.

J'ai changé le modèle de recherche *.doc*-*.doc? afin de ne pas inclure les fichiers se terminant par .doc.lnk par exemple, que je suppose que vous ne voulez pas être récupéré. Au lieu de la commande echo, vous pouvez directement placer votre ligne de commande xcopy avec "%%F" comme source de copie.


Vous pouvez faire la même chose directement dans l'invite de commande en tant comme celui-ci, en une ligne:

for /D %D in ("%SystemDrive%\*.*") do @if /I not "%D"=="%SystemRoot%" pushd "%D" & (for /R %F in ("*.doc?") do @if %~zF LEQ 50000000 echo %F) & popd 

Je recommande de ne pas marcher à travers l'arborescence de répertoires et filtrer plus tard par quelque chose comme findstr /V /I /L /B /C:"%SystemRoot%", parce que dans ce cas vous perdiez du temps en énumérant un grand nombre d'éléments que vous ignorez ensuite.

Cependant, si vous ne voulez compter sur forfiles /S, la ligne de commande de travail ressemble à ceci:

2> nul forfiles /S /P "C:\\" /M "*.doc*" /C "cmd /C if @isdir==FALSE if @fsize LEQ 50000000 echo @path" | findstr /V /I /L /B /C:"\"%SystemRoot%" 
+0

Merci beaucoup pour votre aide. Avez-vous un conseil pour augmenter la performance et la vitesse du code? –

+0

De rien!Je ne peux pas vraiment améliorer les performances de l'approche en utilisant des boucles 'for' imbriquées; cependant, pour le rendre plus rapide, vous pourriez peut-être exclure plus de dossiers (comme 'C: \ Program Files'); ou une autre idée n'est pas d'exclure (a) certains dossiers, mais d'inclure uniquement des dossiers dédiés, car cela pourrait aussi réduire le nombre total de dossiers ... – aschipfl

+0

merci pour le conseil d'ailleurs comment puis-je enregistrer le résultat de votre code d'une ligne (pour/D ...) dans un fichier .txt comme celui de mon code forfiles. J'ai vraiment essayé mais il écrase le bloc-notes dans chaque boucle –

0

Adaptez cette technique d'utilisation de findstr pour filtrer certains noms.

Pour voir la taille des dossiers dans Documents, à l'exclusion des dossiers de musique, de vidéo ou d'images.

for /f "skip=3 tokens=3" %A in ('Reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Personal"') do set doc=%A 

for /f "usebackq tokens=2* delims= " %i IN (`dir "%doc%" /a /s ^|findstr /i /v "\/"^|findstr /l /v "Pictures Music Video"`) DO @echo %j&echo. 

Cependant, vous pouvez lancer la commande forfiles dans le c:\users ou les utilisateurs particuliers dossier de base (%userprofile%). Vous spécifiez de commencer à c:\ qui inclut tous les dossiers.

forfiles /P %userprofile% /M .DOC /S /C "cmd /c if @fsize leq 50000000 echo @PATH " 
forfiles /P c:\users /M .DOC /S /C "cmd /c if @fsize leq 50000000 echo @PATH "