supprimer un dossier spécifique dans la racine et les subordonnés

-1

Je veux supprimer un dossier spécifique dans la racine et les subordonnés, le problème est que mon code supprime uniquement le dossier dans la racine du répertoire:

SET dirname=test
SET directory=%cd%
SET found=false


    if NOT "%1%" == "" (
        set directory=%1%
    )
    echo Searching for %dirname% in %directory%

    for /d %%i in (%directory%\%dirname%) do (
        IF EXIST %%i (
            REM change the sentinel value
            set found=true

            echo Deleting the folder %%i
            REM Delete a folder, even if not empty, and don't prompt for confirmation
            RD  /s /q %%i
        )
    )

    REM logic to do if no files were found
    if NOT "%found%" == "true" (
        echo No directories were found with the name of %dirname%
    )

C'est la structure du dossier:

E:sampledelete
├───folder1
├───folder2
│   └───somefolder
├───test
│   └───somefolder
├───newfolder
│   ├───test
│   │   └───somefolder
├───newfolder2
│   ├───test

après l'exécution du script, il est devenu:

E:sampledelete
├───folder1
├───folder2
│   └───somefolder
├───newfolder
│   ├───test
│   │   └───somefolder
├───newfolder2
│   ├───test
Albert222
la source
Pourriez-vous ajouter un TAG à la question avec la version de Windows que vous utilisez ici?
music2myear
J'utilise windows 10
Albert222
(0) s'il vous plaît modifier votre question pour ajouter la balise [windows10]. (1) Qu'est-ce qu'un "sous-ordre"? (2) s'il vous plaît modifier votre question pour énoncer votre problème plus clairement.
Scott
@ scott je l'ai édité et j'ai testé sur Windows 7 et Windows 10. Il ne fonctionne pas, ne supprime que le dossier dans le répertoire racine
Albert222
Voulez-vous continuer à supprimer en fin de ligne, par exemple: C: \ 1nodeDeep \ 2nodesDeep \ 3nodesDeep \ 4nodesDeep \ ... \ test?
El8dN8

Réponses:

0

Les questions sont annotées ci-dessous. Le problème principal était l'idée fausse d'un répertoire: vous ne cherchiez pas à l'intérieur du répertoire situé sous 1 nœud sous la racine. Vous avez eu la bonne idée. Puisque vous êtes "nouveau" comme vous l'avez dit, il serait intéressant d'analyser les différences.

@echo off
SET dirname=test
SET directory=%cd%
SET found=false

    if NOT "%1%" == "" (
        set directory=%1%
    )

    REM We want to look in the current directory not in for Z:\test
    for /d %%i in (%directory%*) do (
        echo Searching for %%i\%dirname% in %directory%

        REM We already know the folder existed because "do" ran.
        REM We want to look beneath the root directory
        IF EXIST %%i\%dirname% (
            REM change the sentinel value
            set found=true

            REM we want to delete the nodes beneath not the one in root
            echo Deleting the folder %%i\%dirname%

            REM Delete a folder
            REM we want to delete the nodes beneath not the one in root
            RD  /s /q %%i\%dirname%
        )

        IF %%1 == %dirname% (
            REM change the sentinel value
            set found=true

            REM Delete a folder, even if not empty, and don't prompt for confirmation
            echo Deleting the folder %%i\%dirname%
            RD  /s /q %%i
        )
    )

    REM logic to do if no files were found
    if NOT "%found%" == "true" (
        echo No directories were found with the name of %dirname%
    )
El8dN8
la source
merci mais je veux supprimer tous les dossiers de la racine et des sous-dossiers
Albert222
0

Vous ne comprenez pas quoi for /d Est-ce que.

for /d %%i in ( dir  1  fichier  1  dir  2  fichier  2  dir  3  fichier  3  ) faire  déclaration 

Est-ce que

  • SET %%i= dir 1
  • déclaration
  • SET %%i= dir 2
  • déclaration
  • SET %%i= dir 3
  • déclaration

Le problème est que vous ne faites que dire for /d %%i in ( dir 1 ) faire déclaration , où dir 1 est
%directory%\%dirname%. Vous voulez utiliser for /r, qui effectue une recherche de répertoire récursive. Votre boucle devrait ressembler à quelque chose comme

    for /r %directory% %%i in (.) do (
        if exist %%i\%dirname% (
            REM change the sentinel value
            set found=true

            echo Deleting the folder %%i\%dirname%
            REM Delete a folder, even if not empty, and don't prompt for confirmation
            RD  /s /q %%i\%dirname%
        )
    )
Scott
la source
Je n'étais pas sûr qu'elle veuille faire une recherche récursive, juste un nœud en dessous. Juste 1 nœud sous un répertoire donné (ou dans son exemple) avec ce répertoire. J'ai essayé de demander cela, mais aucune réponse pour l'instant.
El8dN8
ce que je sais, c'est que / r supprimera les fichiers tandis que / d supprimera les dossiers
Albert222
Je ne sais pas ce que vous dites. Je sais que le fichier de commandes ci-dessus fonctionne sur Windows7, en supprimant les répertoires nommés test à tous les niveaux de l'arborescence. Etes-vous inquiet qu'il pourrait aussi y avoir des dossiers nommé test? Je n’ai pas testé pour cela.
Scott
Bien? Avez-vous essayé ma réponse? Avez-vous un problème avec la façon dont cela fonctionne?
Scott