我正在开发的系统如下所示:
D:\TargetFolder\Subfolder1
D:\TargetFolder\Subfolder2\Subfolder3
每个文件夹中都可能存在一个名为 “Settings.txt” 的文件。我想要的是以下内容:
如果在目标文件夹及其所有子文件夹中多次找到该文件然后将其全部删除。
如果仅在目标文件夹及其所有子文件夹中找到该文件一次然后继续执行脚本。
如果文件不存在则继续执行脚本。
最终的脚本可能是这样的:
IF exist "D:\TargetFolder\*Settings.txt" (goto delete) else goto continue
:delete
del *Settings.txt /f /q
:continue
exit
我希望我正确解释了我的问题。 预先感谢。
@echo off
for /F "skip=1" %%a in ('dir /B /S D:\TargetFolder\Settings.txt 2^>NUL') do (
del /Q /S D:\TargetFolder\Settings.txt >NUL
goto break
)
:break
for /F
循环处理dir /S
命令中的文件名,但会跳过第一个(因为"skip=1"
开关),也就是说,如果有多个文件,则执行下一个命令。
for
中的第一个命令删除所有名为“Settings.txt”的文件,并且for
由于goto
命令而被破坏。
如果您可以在 Windows 系统上使用 PowerShell,那么这并不困难。如果找到的文件数大于零,则删除每个文件。否则,什么也不会发生。当您确信将删除正确的文件时,请从
-WhatIf
命令中删除 Remove-Item
。
@powershell.exe -NoLogo -NoProfile -Command ^
"$Files = Get-ChildItem -Recurse -File -Path 'C:\TargetFolder' -Filter 'Settings.txt';" ^
"if ($Files.Count -gt 1) {" ^
"foreach ($File in $Files) { Remove-Item $File.FullName -Whatif }" ^
"}"
如果可以作为 PowerShell .ps1 脚本文件运行,则可以消除一些噪音。
$Files = Get-ChildItem -Recurse -File -Path 'C:\TargetFolder' -Filter 'Settings.txt'
if ($Files.Count -gt 1) {
foreach ($File in $Files) { Remove-Item $File.FullName -Whatif }
}
此批处理文件可用于该任务:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SettingsFile="
for /F "delims=" %%I in ('dir "D:\TargetFolder\Settings.txt" /A-D-L /B /S 2^>nul') do if not defined SettingsFile (set "SettingsFile=1") else (del "D:\TargetFolder\Settings.txt" /A /F /Q /S >nul 2>nul & goto Continue)
:Continue
endlocal
上述的不太紧凑的变体:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SettingsFile="
for /F "delims=" %%I in ('dir "D:\TargetFolder\Settings.txt" /A-D-L /B /S 2^>nul') do (
if not defined SettingsFile (
set "SettingsFile=1"
) else (
del "D:\TargetFolder\Settings.txt" /A /F /Q /S >nul 2>nul
goto Continue
)
)
:Continue
endlocal
首先,确保环境变量
SettingsFile
不是偶然定义的。
接下来,命令 DIR 由在后台启动的单独命令进程执行,以在
D:\TargetFolder
中搜索名称为 Settings.txt
的文件,并以完整路径输出它们。 DIR 的输出由 FOR 捕获,并在 DIR 找到文件 Settings.txt
时逐行处理。
环境变量
SettingsFile
是用字符串值定义的,该字符串值在第一个文件 Settings.txt
上并不重要。如果没有更多文件,则 FOR 循环结束,无需执行任何其他操作 Settings.txt
。
但是在第二个文件
Settings.txt
上执行命令DEL以删除指定文件夹及其所有子文件夹中的文件Settings.txt
。循环使用命令 GOTO 来继续在标签 Continue
下面的行上进行批处理文件处理,因为 Settings.txt
的其他出现不再重要,当然在删除所有 Settings.txt
成功后不再存在.
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
del /?
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
set /?
setlocal /?
阅读有关 使用命令重定向运算符的 Microsoft 文档,了解
>nul
和 2>nul
的说明。重定向运算符 >
必须在 FOR命令行上使用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行命令 FOR(执行嵌入的 dir
命令行)之前处理此命令行时将其解释为文字字符使用在后台启动的单独命令进程,并使用 cmd.exe /c
和 '
中的命令行作为附加参数附加。
另请参阅 使用 Windows 批处理文件的单行多个命令,了解运算符的说明
&
。