2017-02-15 1 views
0

Je travaille actuellement à mon premier poste de technicien informatique junior et j'ai des problèmes avec un simple fichier de traitement par lots.Nettoyage de dossier programmé - Fichier de traitement par lots

Essentiellement, le fichier est exécuté chaque semaine via le planificateur de tâches. Il supprime les fichiers et les dossiers d'un répertoire de serveur datant de plus de 8 jours. Il est également censé supprimer les dossiers vides.

forfiles /p "P:\blahblah" /s /m * /d -8 /c "cmd /c del /Q /S /F /A @path" 
cd /d P:\blahblah 
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d" 
REM robocopy "P:\blahblah" "P:\blahblah" /s /move" 

Il y a deux problèmes ici; Il supprimera occasionnellement des fichiers vieux de quelques jours seulement. Il ne supprime pas les dossiers vides.

Le fichier a été écrit par un ancien employé informatique et il n'y a pas de documentation. Ma conjecture est que plusieurs méthodes ont été utilisées afin d'assurer le nettoyage (ironiquement). J'ai cherché google et voici mes pensées actuelles sur chaque commande ..

1) forfiles - la commande forfiles semble être écrite correctement et je ne vois aucun problème avec elle.

2) cd - assez simple

3) pour - pas tout à fait sûr. Les variables de lot sont nouvelles pour moi et je ne suis pas sûr si cela fonctionne correctement.

4) robocopy - Je n'ai pas été capable de trouver une instance en ligne où quelqu'un copie un répertoire à lui-même pour le nettoyage. Je remarque également la citation supplémentaire, mais je ne suis pas certain de son inexactitude. Cette ligne me semble particulièrement étrange.

Normalement, j'essaierais de tester mon par quelque chose comme ça, mais c'est un peu plus difficile à tester rapidement étant donné que j'ai besoin de voir si c'est enlever des choses en fonction de la date du calendrier. Voilà pourquoi je suis là!

Je promets que je n'aurais pas demandé si je n'avais pas déjà parcouru internet pour une idée. Toute aide serait grandement appréciée, et j'aimerais en apprendre un peu plus sur les commandes ci-dessus!

Merci pour votre aide!

+0

Votre commande FOR échouera car il manque un signe d'insertion pour échapper au PIPE. De plus, la commande FOR devrait vraiment utiliser l'option delims pour le forcer à ne pas utiliser de délimiteurs. Vous ne devriez pas avoir besoin de l'option usebackq non plus. Robocopy ne s'exécute pas car il est commenté avec la commande REM. – Squashman

Répondre

0
  1. forfiles

    Être syntaxiquement correct ne signifie pas qu'il fait ce que vous voulez, il fait ce que vous demandez. Ici, le problème est la commande del. Il va supprimer ce que le forfiles a sélectionné, mais vous devez tester l'élément sélectionné n'est pas un dossier. Si vous appelez del /q /s /f /a avec une référence de dossier, vous supprimez le contenu du dossier.

  2. cd

    assez simple, mais comme vous ne cochez pas l'opération a été réussie (peut-être P: est non disponible) peut-être la commande suivante for supprime les informations où il ne devrait pas.

  3. for

    Comme commentaires Squashman, si vous modifiez les citations de retour dans des guillemets simples que vous ne aurez pas besoin du usebackq.

    Mais vous avez besoin de la clause delims pour éviter les problèmes de chemins contenant des espaces.for /f ne parcourt pas les références de fichiers, mais les lignes de texte (générées par une commande dir). Par défaut, les onglets et les espaces sont des délimiteurs qui séparent les lignes en cours de traitement et, par défaut, seul le premier jeton est récupéré. Définir la clause delims à une liste vide de caractères désactivera ce comportement.

Vous pouvez essayer avec quelque chose comme

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    pushd "p:\blahblah" && (
     forfiles /s /m * /d -8 /c "cmd /c if @isdir==FALSE del /q /f /a @path" 
     for /f "delims=" %%d in ('" dir /ad /s /b | sort /R "') do rd "%%d" 
     popd 
    ) 

Le pushd va changer le répertoire actif à celui requis. Si la commande est réussie, l'opérateur conditionnel && (exécuter la commande suivante si la précédente n'a pas échoué) exécutera le reste du code, en restaurant le répertoire actif à la fin.

4) robocopy

Il peut être utilisé pour faire le nettoyage, mais pas d'un dossier en lui-même.

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    pushd "p:\blahblah" && (
     rem Use a random temporary folder 
     for %%t in ("%temp%\clean_%random%%random%%random%%random%.tmp") do (

      rem Select the files to keep 
      robocopy "." "%%~ft" /MAXAGE:8 /CREATE /s /njh /njs /nfl /nc /ns 

      rem Remove anything not selected 
      robocopy "%%~ft" "." /NOCOPY /PURGE /e /njh /njs /nfl /nc /ns 

      rem remove temporary folder 
     ) & rd /s /q "%%~ft" 

     rem Restore previous active directory 
     popd 
    ) 

Ce code crée une réplique de tous les fichiers sélectionnés (pas plus de 8 jours) dans un dossier temporaire, mais le commutateur /CREATE dit robocopy de ne pas copier les fichiers, mais pour créer 0 octets fichiers dans le temporaire cible. Une fois que nous avons une réplique avec seulement les éléments sélectionnés, l'opération oposite est faite, du dossier temporaire au dossier de travail mais demandant qu'aucune opération de copie ne soit faite (/NOCOPY), juste une suppression des éléments non présents dans la source ().

+0

Merci pour l'aide MD. Je vais jeter un coup d'oeil à cela et mettre à jour mes résultats. – Boognish