2017-10-14 16 views
1

J'essaie de créer un script pour copier les dossiers dans "C: \" qui ne correspondent pas à certains noms particuliers en utilisant le fichier batch.Comment copier des dossiers qui ne correspondent pas à certains noms spécifiés, en utilisant le lot

Par exemple. Disons que nous avons les dossiers suivants:

  • C: \ Windows
  • C: \ Program Files (x86)
  • C: \ Charlie
  • C: \ Adam
  • C: \ Program Les données
  • C: \ Drivers
  • C: \ PerfLogs
  • etc

Parce que Windows', Program Files (x86) `, 'Program Data', 'Drivers' .... etc. sont des dossiers créés par notre image standard, nous ne devons pas les copier, mais voulons seulement copier les dossiers "Adam" et "Charlie". Nous connaissons les noms de tous ces dossiers générés par le système. Il ya beaucoup de réponses ici et sur les forums, qui montrent ce qu'il faut faire pour une recherche générique (par exemple ci-dessous), mais dans ce cas, je veux que les dossiers ne correspondent pas au nom donné, ont des flèches à côté d'eux, selon l'image ci-dessous. [1] [1]

J'ai essayé d'utiliser quelque chose comme ça, mais utiliser cette option signifie que le compilateur cherche dans les sous-dossiers, par exemple: vérifie C: \ Windows * tout dans cet emplacement **, ce qui prend beaucoup de temps.

FOR /D %%G in ("C:\*") DO ( 
IF /I %%G NEQ "C:\Windows" (
    IF /I %%G NEQ "C:\Drivers" (
     IF /I %%G NEQ "C:\inetpub" (
      IF /I %%G NEQ "C:\Intel" (
       IF /I %%G NEQ "C:\MSOCache" (
        IF /I %%G NEQ "C:\PerfLogs" (
+0

Que voulez-vous dire par dossiers réguliers? Pouvez-vous s'il vous plaît essayer d'expliquer exactement ce que vous voulez copier. Voulez-vous simplement copier des répertoires de profils d'utilisateurs individuels, uniquement des répertoires non système ou autre chose. – Compo

+0

Désolé, je voulais dire que Windows, Program Files, Program Files (x86), Utilisateurs, ProgramData etc. sont souvent créés par le système, et je voulais seulement créer une sauvegarde pour les dossiers créés par l'utilisateur, au cas où ils créeraient des dossiers personnels – user3839914

+0

Votre question est donc beaucoup trop large, il est impossible qu'une commande simple ou relativement complexe puisse facilement différencier les fichiers et les répertoires créés par l'utilisateur, ceux qui sont créés par le système, ceux qui ont des permissions utilisateur, ceux qui existent utilisateur créé dans ceux qui ont été créés par le système, etc. Même en vérifiant ce qui a été créé, ou modifié après une date spécifique, vous n'isolerez pas ce dont vous avez besoin. – Compo

Répondre

1

cela devrait vous aider à aller dans la bonne direction:

FOR /D %%G in ("C:\*") DO ( 
    IF /I %%G NEQ C:\Windows (
    echo %%G | FINDSTR /I /R ".*program.files.*" > NUL 
    IF ERRORLEVEL 1 echo do something with %%G 
) 
) 
+0

Merci Ken, j'apprécie. – user3839914

+0

Merci Ken, ça marche, mais j'ai des problèmes de performance avec ça. – user3839914

+0

Pouvez-vous être un peu plus précis? Notez que vous voulez désactiver l'écho ... et notez que ERRORLEVEL est une variable spéciale - no% used ... –

1

Il y a beaucoup de possibilités pour copier tous les dossiers d'un lecteur à un autre lecteur, par exemple pour l'opération de sauvegarde, sauf certains dossiers spécifiés.

Voici une solution de travail pour Windows XP et toute version de Windows plus tard:

@echo off 

:FindDrive 
cls 
echo Search for external USB hard disk for backup ... 

%SystemRoot%\System32\wbem\wmic.exe LOGICALDISK GET DeviceID,DriveType /Format:CSV >"%TEMP%\DataBackup.tmp" 

for /F "skip=2 tokens=2,3 delims=," %%A in ('type "%TEMP%\DataBackup.tmp"') do (
    if "%%B" == "3" if exist "%%A\DataBackup\" set "BackupDrive=%%A" & goto RunBackup 
) 

del "%TEMP%\DataBackup.tmp" 
echo/ 
echo Could not find USB hard disk with folder DataBackup. 
echo/ 
%SystemRoot%\System32\choice.exe /C YN /N /T 10 /D Y /M "Try again (Y/n): " 
if errorlevel 2 goto :EOF 
goto FindDrive 


:RunBackup 
del "%TEMP%\DataBackup.tmp" 
echo USB hard disk detected as drive %BackupDrive% 

for /D %%D in (%SystemDrive%\*) do :BackupFolder "%%D" 
rem for /F "delims=" %%D in ('dir %SystemDrive%\* /AD /B 2^>nul') do call :BackupFolder "%SystemDrive%\%%D" 
goto :EOF 


:BackupFolder 
if /I "%~1" == "%SystemRoot%" goto :EOF 
if /I "%~1" == "%ProgramFiles%" goto :EOF 
if /I "%~1" == "%ProgramFiles(x86)%" goto :EOF 
if /I "%~1" == "%SystemDrive%\$RECYCLE.BIN" goto :EOF 
if /I "%~1" == "%SystemDrive%\System Volume Information" goto :EOF 
echo/ 
echo Creating backup of folder "%~1" ... 
echo/ 
%SystemRoot%\System32\xcopy.exe "%~1\*" "%BackupDrive%\DataBackup\%~nx1\" /C /E /H /I /K /M /Q /R /Y 
goto :EOF 

La partie supérieure est juste pour savoir si un disque dur USB avec le dossier DataBackup est actuellement branché et quel est son lecteur lettre.

L'utilisateur du fichier batch est averti du disque dur USB manquant avec le dossier pour la sauvegarde des données et peut annuler l'opération de sauvegarde en appuyant sur la touche N (insensible à la casse). Ou l'utilisateur appuie sur la touche Y et une autre approche est faite pour trouver le disque dur de sauvegarde. Après 10 secondes, le fichier de commandes répond automatiquement à l'invite avec Y et effectue une approche supplémentaire pour trouver le lecteur de sauvegarde.

Pièce selon la question commence par la ligne de commande:

for /D %%D in (%SystemDrive%\*) do :BackupFolder "%%D" 

Les POUR appels en boucle pour chaque répertoire non caché dans la racine du système d'entraînement du sous-programme BackupFolder avec le nom du répertoire en tant que paramètre.

La ligne suivante commentée avec la commande REM traiterait également les répertoires à la racine du lecteur système avec l'ensemble d'attributs masqué. Une fois que la boucle a terminé le traitement de tous les dossiers (non cachés) sur le lecteur système, l'exécution du fichier de traitement par lots est exécutée avec la commande goto :EOF en évitant le sous-programme BackupFolder sous le code principal du fichier séquentiel. Le sous-programme BackupFolder contient en premier plusieurs comparaisons exécutées entre majuscules et minuscules du nom de dossier transmis avec chemin d'accès avec des chaînes prédéfinies pour ignorer les dossiers standard Windows. Le répertoire Windows, les répertoires des fichiers programme et les répertoires cachés de la corbeille et la restauration du système sont ignorés en quittant le sous-programme avec goto :EOF sur une comparaison de chaîne positive. Sinon, tous les fichiers et sous-dossiers du dossier transmis avec le jeu d'attributs d'archivage sont copiés dans le dossier de sauvegarde de données sur le disque dur USB et l'attribut archive sur les fichiers du dossier source est supprimé pour éviter de copier les mêmes fichiers non modifiés . Par conséquent, la commande XCOPY copie uniquement les fichiers et dossiers nouveaux ou modifiés depuis la dernière exécution de ce fichier batch sur le disque dur de sauvegarde, ce qui réduit le temps total nécessaire à la sauvegarde. Bien qu'il existe de nombreuses autres possibilités pour exclure des fichiers et dossiers d'une opération de sauvegarde, je préfère cette méthode car il est très facile de dupliquer une des lignes de commande if /I "%~1" == "..." goto :EOF et de modifier la chaîne à droite pour ignorer un fichier de plus ou dossier. Et plus de dossiers à partir d'autres lecteurs peuvent être facilement copiés en appelant BackupFolder dans le bloc de commande ci-dessous l'étiquette RunBackup pour ces dossiers supplémentaires.

Veuillez noter que ce fichier de commandes ne supprime jamais les fichiers et les dossiers sur un lecteur de sauvegarde qui n'existe plus dans le dossier source. Donc, un nettoyage de fichier/dossier sur le disque de sauvegarde doit être fait de temps en temps manuellement. Ceci est pour la sécurité pour empêcher une suppression automatique du dossier/dossier de sauvegarde si un fichier/dossier dans un dossier source a été supprimé par erreur et cela n'a pas été immédiatement reconnu et le fichier/dossier a été restauré en utilisant le disque dur de sauvegarde. Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.

  • choice /?
  • cls /?
  • del /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • type /?
  • wmic /?
  • wmic logicaldisk /?
  • wmic logicaldisk get /?
  • xcopy /?

Lire aussi l'article Microsoft à propos Using Command Redirection Operators et la réponse sur Single line with multiple commands using Windows batch file.

+0

Merci beaucoup Mofi. Appréciez-le. – user3839914