Windows 文件名不区分大小写,因此简化了一些事情。但是cmd.exe
(batch) 没有非常复杂的目录列表功能。使用 PowerShell 之类的东西可能会更好,但我不太了解这种脚本语言。
或者更好的是,根据 Endoro 在评论中的建议,使用免费的gnu find for Windows实用程序。
但是,如果您想将自己限制为本地cmd.exe
(批处理)命令,那么以下是一些选项:
以下命令将在命令行上运行。它会给出绝对路径,但它不适用于大小超过 ~2 GB 的文件,因为cmd.exe
数字仅限于有符号的 32 位整数。大于最大值的数字将使用字符串语义而不是数字进行比较,从而给出错误的结果。文件大小总是以字节为单位,所以我相应地调整了大小:
(for /r %F in (*.z3d) do @if %~zF geq 512000 echo %F) >list_Z3D.txt
百分比必须加倍才能在批处理文件中使用
@echo off
(for /r %%F in (*.z3d) do if %%~zF geq 512000 echo %%F) >list_Z3D.txt
相对路径可以用 FORFILES 得到,但是比较慢。此命令将在命令行和批处理文件中工作。它也不适用于超过 ~2 GB 的文件。
forfiles /s /m *.z3d /c "cmd /c if @fsize geq 512000 echo @relpath" >list_Z3D.txt
WMIC 可以准确地按文件大小筛选,无论大小。但是在使用目录树时它很慢。这提供了绝对路径。
@echo off
setlocal disableDelayedExpansion
set "ext=z3d"
set "sz=512000"
for %%F in ("%cd%") do (
set "drv=%%~dF"
set "pth=%%~pnxF\%%"
)
wmic datafile where "drive='%drv%' and path like '%pth:\=\\%' and filesize>%sz% and extension='%ext%'" get name |more +1 >list_Z3D.txt
前两个解决方案中的任何一个都可以通过额外的编程来处理大文件。以下支持文件大小高达 ~999 TB。这些解决方案将比 WMIC 解决方案更快。
要使用批处理文件准确获取 >= 512000 的文件的绝对路径:
@echo off
setlocal disableDelayedExpansion
>list_Z3D.txt (
for /r %%F in (*.z3d) do (
set "sz=000000000000000%%~zF"
set "file=%%F"
setlocal enableDelayedExpansion
if !sz:~-15! geq 000000000512000 echo !file!
endlocal
)
)
要在命令行或批处理文件中准确获取 >= 512000 的文件的相对路径:
forfiles /s /m *.z3d /c "cmd /v:on /c set sz=000000000000000@fsize&if !sz:~-15! geq 000000000512000 echo @relpath" >list_Z3D.txt