2

我正在尝试编写一个脚本,其中我必须使用以下逻辑列出文件夹内的所有文件夹:

假设文件夹 A、B、C 在文件夹 F 和 A、B 和 C 内包含子文件夹和文件。

我必须编写一个脚本,将文件夹 A、B、C 显示为标题,然后列出其中指定大小以上的文件(包括子文件夹)......如果可能的话,还有它们的修改日期。

我准备了一个骨架。

@echo off & setLocal EnableDelayedExpansion pushd C:\F

for /f "tokens=* delims=" %%a in ('dir/b/a:d') 做 (

echo %%a >>C:\F\list.txt
echo "-----------------------------------------------">>C:\F\list.txt
pushd %%a 
for /f "tokens=* delims= " %%i in ('dir/b/s') do (
    echo %%i >>C:\F\list.txt
    if %%~Za gtr 10000 echo %%i is %%~Za >>C:\F\list.txt
    ))

所需的输出是:

目录 A

文件 1 大小 1 日期 1

文件 2 大小 2 日期 2

目录 B

文件 3 大小 3 日期 3

文件 4 大小 4 日期 4

目录 C

文件 5 大小 5 日期 5

文件 6 大小 6 日期 6

--- 日期字段不是强制性的,但如果包含则更好。

感谢和问候

4

2 回答 2

1

这是代码的总体思路。它基本上搜索每个目录和子目录,并找到指定类型的所有文件。然后程序找到每个唯一的文件目录并搜索大于指定大小的文件以您请求的格式输出。注意:代码中包含许多“额外”内容,用于故障排除。随意删除不必要的文本文件。=]

@echo off & setLocal EnableDelayedExpansion pushd C:\F

::sets size limit
SET sizelimit=10000

::searches for all files in directories and subdirectories and outputs to files.txt
dir /b/s >> files.txt

::finds all .zip files in files.txt
type files.txt | findstr /E .zip > myfile1.txt

::finds all .zip file locations and unique file locations
FOR /F "tokens=* delims=\" %%a in (myfile1.txt) do @echo %%~dpa >>filelocations.txt
FOR /F "delims==" %%L in (filelocations.txt) do find "%%L" unique.txt>nul || echo %%L>>unique.txt

::Loops through each unique location, finds all the .zip files and checks if they are larger
:: than the specified file size, then outputs the results to output.txt
FOR /F "tokens=* delims= " %%a in (unique.txt) do (
echo %%a >>output.txt
findstr "%%a" myfile1.txt >temp.txt
FOR /F "tokens=* delims=" %%a in (temp.txt) do (
if %%~za gtr %sizelimit% echo %%~nxa %%~za %%~ta >>output.txt
)
)

end local

::Cleans up extra files (which are generated for troubleshooting purposes)
del files.txt myfile1.txt filelocations.txt unique.txt temp.txt
于 2012-09-25T18:02:42.933 回答
0

在这里回答你的问题

好吧,您可以将输出通过管道传输到sort,但这至少存在三个问题。

第一个问题是,当您将其添加到末尾时,它一次只能排序一行。这意味着它根本没有排序。要解决这个问题,您可以将整个for命令放在一个块()中,然后将块的输出通过管道传输到sort,这会导致其他问题,尽管我相信可以解决这些问题。

第二个问题是它按字母顺序排列日期,从月份开始。这意味着所有的 1 月1/dd/yyyy都会先出现,然后10/dd/yyyy是所有的 10 月,这意味着您将所有年份混合在一起,并且它是按 1 月、10 月、11 月、12 月、2 月、3 月等排序的。

sort您可以使用'命令按大小排序/+col,但您将比较size[tab]filename含义2[tab]helloAFTER 1000[tab]hello。(键入sort /?ENTER以了解有关排序的更多信息。)

我建议使用 usedir的排序功能,如下所示:

:: Sort by name
FOR /F "tokens=* delims= " %%a in ('dir /b /o:n ') do @if %%~za gtr %sizelimit% echo %%~ta%tab%%%~za%tab%%%~nxa

:: Sort by size
FOR /F "tokens=* delims= " %%a in ('dir /b /o:s ') do @if %%~za gtr %sizelimit% echo %%~ta%tab%%%~za%tab%%%~nxa

:: Sort by date
FOR /F "tokens=* delims= " %%a in ('dir /b /o:d ') do @if %%~za gtr %sizelimit% echo %%~ta%tab%%%~za%tab%%%~nxa

/o:order 命令还有其他选项。dir /?ENTER在命令提示符下键入以获取有关其工作原理的更多信息dir

于 2012-10-01T18:53:30.083 回答