How to remove all folders of name x within a directory using cmd/batch file

后端 未结 4 578
忘了有多久
忘了有多久 2021-02-15 06:04

I have a folder named x with a number of subfolders and files. I want to delete a folder named y that is present in x and all of it\'s subfolders. The said folder that has to be

相关标签:
4条回答
  • 2021-02-15 06:26
    FOR /D /R %%X IN (fileprefix*) DO RD /S /Q "%%X"
    

    Take care of using that...

    for RD command:

    /S      Removes all directories and files in the specified directory
            in addition to the directory itself.  Used to remove a directory
            tree.
    /Q      Quiet mode, do not ask if ok to remove a directory tree with /S
    

    the FOR command is used to loop through a list of files or variables, the options are very easy to memorize, Directory only Recursively.

    0 讨论(0)
  • 2021-02-15 06:28

    Here is another solution for this commented to describe each part of the script:

    @Echo OFF
    REM Important that Delayed Expansion is Enabled
    setlocal enabledelayedexpansion
    REM This sets what folder the batch is looking for and the root in which it starts the search:
    set /p foldername=Please enter the foldername you want to delete: 
    set /p root=Please enter the root directory (ex: C:\TestFolder)
    REM Checks each directory in the given root
    FOR /R %root% %%A IN (.) DO (
        if '%%A'=='' goto end   
        REM Correctly parses info for executing the loop and RM functions
        set dir="%%A"
        set dir=!dir:.=!
        set directory=%%A
        set directory=!directory::=!
        set directory=!directory:\=;!   
        REM Checks each directory
        for /f "tokens=* delims=;" %%P in ("!directory!") do call :loop %%P
    )
    REM After each directory is checked the batch will allow you to see folders deleted.
    :end
    pause
    endlocal
    exit
    REM This loop checks each folder inside the directory for the specified folder name. This allows you to check multiple nested directories.
    :loop
    if '%1'=='' goto endloop
    if '%1'=='%foldername%' (
        rd /S /Q !dir!
        echo !dir! was deleted.
    )
    SHIFT
    goto :loop
    :endloop
    

    You can take the /p out from in front of the initial variables and just enter their values after the = if you don't want to be prompted:

    set foldername=
    set root=
    

    You can also remove the echo in the loop portion and the pause in the end portion for the batch to run silently.

    It might be a little more complicated, but the code can be applied to a lot of other uses.

    I tested it looking for multiple instances of the same foldername qwerty in C:\Test:

    C:\Test\qwerty
    C:\Test\qwerty\subfolder
    C:\Test\test\qwerty
    C:\Test\test\test\qwerty
    

    and all that was left was:

    C:\Test\
    C:\Test\test\
    C:\Test\test\test\
    
    0 讨论(0)
  • 2021-02-15 06:37

    A problem common to this type of topics is that if there are instances of the target folder at several levels, most methods cause an error because when an high level folder is deleted, all folders below it disappear. For example:

    C:\X\Y\subfolder
    C:\X\Y\subfolder\one\Y
    C:\X\Y\subfolder\two\Y
    C:\X\Y\subfolder\three\Y
    C:\X\test
    C:\X\test\test
    

    Previous example generate a list of 4 folders named Y that will be deleted, but after the first one is deleted the three remaining names no longer exist, causing an error message when they are tried to delete. I understand this is a possibility in your case.

    To solve this problem the folders must be deleted in bottom-up order, that is, the innermost folder must be deleted first and the top level folder must be deleted last. The way to achieve this is via a recursive subroutine:

    @echo off
    rem Enter into top level folder, process it and go back to original folder
    pushd x
    call :processFolder
    popd
    goto :EOF
    
    :processFolder
    rem For each folder in this level
    for /D %%a in (*) do (
       rem Enter into it, process it and go back to original
       cd %%a
       call :processFolder
       cd ..
       rem If is the target folder, delete it
       if /I "%%a" == "y" (
          rd /S /Q "%%a"
       )
    )
    exit /B
    

    Although in this particular case the problems caused by other methods are just multiple error messages, there are other cases when this processing order is fundamental.

    0 讨论(0)
  • 2021-02-15 06:40

    Make .bat with following:

    del /q "C:\Users\XXX\AppData\Local\Temp\*"
    
    FOR /D %%p IN ("C:\Users\XXX\AppData\Local\Temp\*.*") DO rmdir "%%p" /s /q
    
    0 讨论(0)
提交回复
热议问题