我在删除小于特定大小的文件时使用以下批处理脚本。
@echo off
setlocal
:: Size is in bytes
set "min.size=100000"
for /f "usebackq delims=;" %%A in (`dir /b /A:-D *.*`) do If %%~zA LSS %min.size% del "%%A"
如果我将批处理文件放入文件夹中,这会起作用,但它也会删除批处理文件。
但是,如何将批处理文件保存在不同的位置并明确指定目录路径?
最佳答案
最简单的解决方案是将要删除文件的目录(如 C:\Temp\Test
)暂时设为事件目录。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Size is in bytes
set "min.size=100000"
set "FullBatchFileName=%~f0"
pushd "C:\Temp\Test"
rem Do nothing if the command line above fails unexpected.
if errorlevel 1 goto EndBatch
for /F "eol=| delims=" %%I in ('dir * /A-D-H /B /OS 2^>nul') do if not "%FullBatchFileName%" == "%%~fI" if %%~zI LSS %min.size% ( del "%%I" ) else goto DeletionDone
:DeletionDone
popd
:EndBatch
endlocal
DIR 命令行由 FOR 在后台以 cmd.exe/C
和 启动的单独命令进程中执行FOR 捕获 DIR 输出的所有行以处理 STDOUT。 DIR 处理 STDERR 时在当前目录中找不到任何非隐藏文件时输出的错误消息被重定向到设备 2>nul
strong>NUL 来抑制它。
另请阅读有关 Using Command Redirection Operators 的 Microsoft 文章2>nul
的解释。重定向运算符 >
必须在 FOR 命令行上使用脱字符 ^
进行转义,以便在 Windows 命令解释器处理此命令行时将其解释为文字字符在执行命令 FOR 之前,该命令使用在后台启动的单独命令进程执行嵌入式 dir
命令行。
DIR 选项 /OS
导致获取 DIR 输出的非隐藏文件列表,按大小排序,从小到大最后。
FOR 会跳过以分号开头的行,这意味着它会跳过文件名以 ;
开头的文件,这通常是可能的。通过使用 eol=|
指定竖线作为行尾字符可以避免这种情况,文件名不能包含该字符。
FOR 会使用普通空格和水平制表符作为分隔符将行拆分为子字符串,并且只会将第一个子字符串分配给循环变量 I
。文件名可以包含一个或多个空格。因此 delims=
用于定义一个空的分隔符列表,它完全禁用行拆分行为并将整个文件名分配给循环变量 I
。
IF 条件 if not "%FullBatchFileName%"== "%%~fI"
比较区分大小写的批处理文件的完整限定名(驱动器 +路径 + 名称 + 扩展名)与当前文件的全限定名。如果当前文件不是当前正在运行的批处理文件,则此条件仅为真。
下一个 IF 条件 if %%~zI LSS %min.size%
比较当前文件转换为 32 位有符号整数的文件大小与指定的文件大小也转换为 32 位有符号整数。此文件大小比较在具有 2 GiB 的文件上失败或更多,因为这样一个大文件超过了最大正 32 位带符号整数值 2147483647。
FOR 循环以 goto DeletionDone
在文件大小等于或大于指定最小大小的第一行退出,因为所有进一步的文件都由 DIR 输出 文件大小肯定等于或大于指定的最小大小,因为输出是按大小从小到大排序的。
要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call/?
... 解释%~f0
... 参数 0 的完整限定文件名 - 当前执行的批处理文件。dir/?
echo/?
endlocal/?
for/?
goto/?
如果/?
popd/?
pushd/?
rem/?
设置/?
setlocal/?
关于windows - 通过指定目录删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52772154/