我目前正在使用此批处理文件扫描Windows文件系统并保存该系统中所有文件扩展名的.txt文档:
Cmd Line Command:
NameOfBatchFile.bat >List.txt
BatchFile代码:
@echo off
set target=%1
if "%target%"=="" set target=%cd%
setlocal EnableDelayedExpansion
set LF=^
rem Previous two lines deliberately left blank for LF to work.
for /f "tokens=*" %%i in ('dir /b /s /a:-d "\\PathOfMyWindowsDirectory"') do (
set ext=%%~xi
if "!ext!"=="" set ext=FileWithNoExtension
echo !extlist! | find "!ext!" > nul
if not !ERRORLEVEL! == 0 set extlist=!extlist!!ext!:
)
echo %extlist::=!LF!%
endlocal
代码在小文件夹上运行良好但如果我提供的文件夹包含太多子文件夹,命令行将处理,然后提供以下错误:
The command line is too long.
The command line is too long.
The command line is too long.
The command line is too long.
The command line is too long.
The command line is too long.
The command line is too long.
The input line is too long.
我无法编辑文件系统以减少子文件夹,有没有人知道另一种方法让它工作?
答案 0 :(得分:3)
代码中的问题是变量内部元素的串联,它可以生成一长串扩展,这些扩展将导致生成一个过长的命令行。
@echo off
setlocal enableextensions disabledelayedexpansion
set "target=%~1"
if "%target%"=="" set "target=%cd%"
for /r "%target%" %%a in (*) do if not defined "\%%~xa\" (
if "%%~xa"=="" (echo(FileWithNoExtension) else (echo(%%~xa)
set ""\%%~xa\"=1"
)
endlocal
这使用环境通过为每个扩展设置变量来存储所看到的扩展的信息。如果未设置变量,则这是第一次找到扩展并回显到控制台。
答案 1 :(得分:1)
我认为这是获得此问题的最快方法。
@echo off
setlocal
set target=%1
if "%target%"=="" set target=%cd%
for /R "%target%" %%a in (*.*) do set ext[%%~Xa]=1
for /F "tokens=2 delims=[]" %%a in ('set ext[') do (
if "%%a" equ "=1" (
echo FileWithNoExtension
) else (
echo %%a
)
)
可以轻松修改以前的方法,以获得具有每个扩展名的数量的文件;只需按set ext[%%~Xa]=1
修改set /A ext[%%~Xa]+=1
,然后相应地修改for /F
中的令牌。
答案 2 :(得分:0)
这可以非常快速地为您提供所有扩展的排序列表。
@echo off
set "target=%~1"
if "%target%"=="" set target=%cd%
dir "%target%" /b /s /a-d |repl ".*(\..*)" "$1" |repl ".*\\.*" "FileWithNoExtension"|sort|uniq >file.txt
这使用名为repl.bat
的助手批处理文件(由dbenham提供) - 从以下网址下载:https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
这使用名为uniq.bat
的助手批处理文件(由aacini提供) - 从以下网址下载:https://www.dropbox.com/s/71o38a4ljnqgqjh/uniq.bat
将repl.bat
和uniq.bat
放在与批处理文件相同的文件夹中,或放在路径上的文件夹中。