我很难创建批处理文件或单个Windows命令行来删除除父级和第一个子级以外的所有文件和文件夹。
例如,我有一个文件夹Test
,其中还有另外4个文件夹:
我想要删除Folder_1
到Folder_4
中的所有内容,但保留文件夹本身。 (Test/Folder_1
-> Test/Folder_4
)
我知道如何删除父对象中的所有内容,但是我无法弄清楚如何在我要保留的每个文件夹中运行命令更深一层:
del /q "C:\Temp\Test\*"
FOR /D %%p IN ("C:\Temp\Test\*.*") DO rmdir "%%p" /s /q
答案 0 :(得分:1)
此批处理文件可用于删除C:\Temp\Test
中的所有文件以及C:\Temp\Test
文件夹中的所有文件和子文件夹。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "BaseFolder=C:\Temp\Test"
if not exist "%BaseFolder%\" goto :EOF
del /A /F /Q "%BaseFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%BaseFolder%" /AD /B 2^>nul') do pushd "%BaseFolder%\%%I" 2>nul && ( rd /Q /S "%BaseFolder%\%%I" 2>nul & popd )
endlocal
此批处理文件还删除具有隐藏和只读属性的文件,并且还适用于C:\Temp\Test
中的隐藏文件夹。
请阅读How to delete files/subfolders in a specific directory at command prompt in Windows上的答案,以详细了解两个命令行删除文件和文件夹的工作方式。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
del /?
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
popd /?
pushd /?
rd /?
set /?
setlocal /?
答案 1 :(得分:0)
如果您想使用PowerShell执行此操作,则以后可能更容易让人理解。是的,.bat for循环有效。这似乎向我直接传达了正在做的事情。
[cmdletbinding()]
Param()
Get-ChildItem -Path './test' -Recurse -Directory |
ForEach-Object {
Write-Verbose "working on $_"
Remove-Item -Path $_.FullName -Recurse
mkdir $_.FullName | Out-Null
}
如果要从cmd.exe提示符运行此文件,请将上面的代码放入文件中,例如delsubs.ps1,然后使用以下代码运行它。
powershell -NoProfile -File delsubs.ps1