收集文件扩展名列表 - "命令行太长"解决方法

时间:2014-07-21 16:10:50

标签: windows batch-file cmd

我目前正在使用此批处理文件扫描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.

我无法编辑文件系统以减少子文件夹,有没有人知道另一种方法让它工作?

3 个答案:

答案 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.batuniq.bat放在与批处理文件相同的文件夹中,或放在路径上的文件夹中。