루트 및 하위 주문의 특정 폴더 삭제

루트 및 하위 주문의 특정 폴더 삭제

루트 및 하위 주문의 특정 폴더를 삭제하고 싶습니다. 문제는 내 코드가 디렉터리 루트의 폴더만 삭제한다는 것입니다.

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

폴더 구조는 다음과 같습니다.

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

스크립트를 실행한 후 다음과 같이 변경되었습니다.

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

답변1

문제는 아래에 주석으로 표시되어 있습니다. 주요 문제는 디렉토리에 대한 오해였습니다. 즉, 루트 아래의 1개 노드 아래에 있는 디렉토리 내부를 보고 있지 않았습니다. 당신은 올바른 생각을 가지고있었습니다. 당신이 말했듯이 당신은 "새로운" 것이므로 차이점을 분석해 볼 가치가 있습니다.

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

답변2

당신은 무엇을 오해 for /d하고 있습니다.

/d %%i의 경우(디렉토리 1 파일 1 디렉토리 2 파일 2 디렉토리 3 파일 3) 하다성명

하다

  • SET %%i=dir1
  • statement
  • SET %%i=dir2
  • statement
  • SET %%i=dir3
  • statement

문제는 당신이 단지 , 어디에 있는지 말하고 있다는 것입니다 . 재귀적 디렉터리 검색을 수행하는 을(를) 사용하려고 합니다 . 루프는 다음과 같아야 합니다.for /d %%i in (dir1) do statementdir1
%directory%\%dirname%for /r

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

관련 정보