현재 경로의 하위 폴더에서 루팅된 모든 폴더를 삭제하려면 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
}