배치 파일을 사용하여 모든 하위 폴더를 삭제하시겠습니까?

배치 파일을 사용하여 모든 하위 폴더를 삭제하시겠습니까?

현재 경로의 하위 폴더에서 루팅된 모든 폴더를 삭제하려면 bin다음 스크립트가 있습니다. 이것이 제가 시도한 것입니다(배치 스크립트에 대한 지식이 있는 한).

setlocal enabledelayedexpansion
for /f %%i in ('dir /a:d /s /b *') 
do 
(
  set d=!i!\bin 
  if exist !d! rd !d!
)
endlocal

작동하지 않으며 구문 오류도 있는 것 같습니다. 하지만 그것이 무엇인지 알아내는 것은 고통스럽습니다. 에서 배치 파일을 실행하면 cmd다음과 같이 표시됩니다.

/s was unexpected at this time.

해당 배치 파일을 에서 실행하려면 을 로 cmd변경해야 합니다 . 그렇지 않으면 불평합니다.%%%

The syntax of the command is incorrect.

그렇다면 에서 배치 파일을 실행하려면 모든 것을 먼저 바꿔야 한다는 것이 우스꽝 스럽 cmd습니까 ? 정말 :D 배치 파일을 직접 실행하면(두 번 클릭하여) 무엇이 잘못되었는지 확인할 기회도 없이 콘솔 창이 즉시 닫힙니다. 일시 중지할 수 있도록 끝에 를 넣으려고 시도했지만 둘 다 작동하지 않습니다(일시 중지가 작동하지 않게 만들기 전에 일부 오류가 있다는 것을 알고 있습니다).%%%PAUSE

원래 문제로 돌아가세요. 여기서(에서 보고된 메시지를 통해) 무엇이 잘못되었는지 알 수 없기 때문에 cmd정말 이 문제에 봉착했습니다. 여러분이 내 스크립트에서 잘못된 점을 찾아 수정하도록 도와주셨으면 좋겠습니다.

답변1

당신은 시도 할 수 있습니다:
@echo off 

cd/d "%~dp0"

for /f delims^= %%i in (
  'dir /a:d/s/b ^| findstr /eil "\bin \obj"'
  )do echo; rd "%%~i"


  • 관찰: 1구문은 다른 언어를 제공하는 경향이 있지만 bat/cmd 스크립트는 제공하지 않습니다. 이 루프는 그런 방식으로 작동하지 않습니다...

    for /f %%i in ('loop command') 
    do 
    (
       // dynamic variable %%i can be expanded, that 
       // doesn't mean it will be treated/expanded 
       // like a regular variable %i% at runtime !i!
    )
    

    명령 구문이 올바르지 않습니다.


  • 관찰: 2코드는 화면에 목록을 표시하고, echo;출력이 올바르게 보이면 폴더를 실행/삭제합니다.

추가 리소스:

답변2

cmd보다 훨씬 강력하므로 PowerShell을 사용하세요.

설치해야합니다파워셸 7, 그러면 설치를 원할 수도 있습니다.윈도우 터미널, 설치하고 여는 방법을 모르신다면 저보다 과정을 더 잘 설명하는 수많은 온라인 튜토리얼이 있으므로 여기서는 반복하지 않겠습니다.

pwsh.exe관리자 권한으로 실행 :

Win+ R-> 입력 pwsh.exe-> Ctrl+ Shift+Enter

그런 다음 콘솔에서 "Path\to\folder" 내의 모든 항목을 가져오려면 다음을 수행합니다.

Get-ChildItem -Path "Path\to\folder" -Force -Recurse

하위 디렉터리만 나열:

Get-ChildItem -Path "Path\to\folder" -Force -Recurse -Directory

패턴에 따라 첫 번째 명령의 출력을 필터링합니다.

Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' }

체인의 이전 링크로 필터링된 모든 항목을 제거합니다.

Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' } | Remove-Item -Recurse -Force -Confirm:$false

위의 내용은 원하는 대로 수행됩니다. path\to\folder는 자리 표시자이므로 실제(절대) 경로로 변경합니다. 예를 들어 경로가 "D:\MyFolder"인 경우 "D:\MyFolder"로 변경합니다. 'bin|obj'는 정규식입니다. 다른 패턴이 필요한 경우 필요한 패턴으로 바꾸고, 패턴을 구성하려면 수직 파이프를 사용하여 옵션을 결합하기만 하면 됩니다. 경로와 패턴을 따옴표로 묶습니다.

경고: 위의 내용은 확인 메시지 없이 올바르게 지정된 모든 항목을 자동으로 삭제합니다. 준비되지 않은 경우 실행하지 마십시오.

이제 전체 내용을 줄여보겠습니다.

gci "Path\to\folder" -Fo -R | % {$_.Name -match 'bin|obj' } | ri -R -Fo -Con:$false

재사용성을 높이려면 코드를 함수로 묶으세요.

function remove-filtered ($path, $pattern) {
    Get-ChildItem -Path $path -Force -Recurse | Where-Object {$_.Name -match $pattern } | Remove-Item -Recurse -Force -Confirm:$false
}

관련 정보