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

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%
    )

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%
        )
    )

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.