批量计数.txt文件并在基于计数

时间:2016-03-18 17:04:09

标签: variables batch-file count

我有一个工作批处理脚本,它计算目录树(包括子目录)中的.txt文件,然后计数GTR比2基本上通知用户他们必须在再次运行此脚本之前做一些事情。

我希望脚本在通知用户时也告诉他们txt文件的文件名。

这就是我所拥有的。

以下检查.txt文件的根文件夹和所有子目录。 这会计算.txt文件的数量并设置它。

@echo off & Setlocal
:: Search for files in the Tree
Set "sFolder=C:\folder\folder\root"
Set "sFileType=txt"
set "i=0"

PushD "%sFolder%" &&(
  FOR /R "." %%i IN (*) DO ( If /i "%%~xi"==".%sFileType%" ( set /a i+=1 ) ) )

如果计数高于3 goto notify user(这是简单的echo命令)

If %i% GTR 2 goto NotifyUser

我没有得到的是如何将3个或更多找到的.txt文件名回显给用户。我知道这将是一个变量,但我似乎无法弄清楚如何把它放在上面的命令中。

另外..在回声中,有时文件名可能有一个" 。 "在名称中超过扩展名

IE:filename.txt.gpg

上面的count命令不会将示例文件名计为.txt文件... 但是根据命令回显名称可能会认为这是一个txt文件..我不希望上面的文件名示例作为计数的txt文件之一回显给用户(因为它不计算)。 (希望这很有意义)。

3 个答案:

答案 0 :(得分:2)

您可能不想多次扫描.txt文件,因此最简单的解决方案是将文件列表存储在临时文件中,并且当且仅当行数时才输出结果大于2.您可以使用FIND计算行数,使用FOR / F来计算计数结果。

@echo off
setlocal
set "root=C:\folder\folder\root"
set "out=%temp%\myTextFileList.txt"
dir /b /s /a-d "%root%\*.txt" >"%out%"
for /f %%N in ('find /c /v "" <"%out%"') do if %%N gtr 2 (
  echo You cannot proceed because you have more than 2 .TXT files:
  type "%out%"
  del "%out%"
  pause
  exit /b
)
del "%out%"
REM Rest of script goes here

答案 1 :(得分:0)

如果您想要做的就是回显给您回复的总数的名称,您可以使用:

@echo off & Setlocal
:: Search for files in the Tree
Set "sFolder=C:\temp"
Set "sFileType=txt"
set "i=0"

PushD "%sFolder%" &&(
      FOR /R "." %%i IN (*) DO ( If /i "%%~xi"==".%sFileType%" ( set /a i+=1 &echo %%~ni) ) )

答案 2 :(得分:0)

最简单的解决方案可能在@dbenham's answer中提供。但是,我想在不使用临时文件的情况下给出答案,但是(a)存储文本文件列表的变量。

以下脚本基于您的for /R方法,并建立以逗号分隔的已发现*.txt文件列表(每个文件都包含在""中)并将其存储在变量{ {1}}。标准ITEMS循环用于在金额超过预定义限制时显示列表项。这是:

for

由于环境变量的大小和命令行的长度是有限的(在Windows 7 x64上,我认为是8191字节),对于找到的大量@echo off setlocal EnableExtensions DisableDelayedExpansion rem Define constants here: set "LOCATION=.." set "PATTERN=*.txt" set /A LIMIT=2 set /A COUNT=0 set "ITEMS=" pushd "%LOCATION%" && ( for /R "." %%F in ("%PATTERN%") do ( set /A COUNT+=1 set "ITEM=%%~F" setlocal EnableDelayedExpansion for /F "delims=" %%S in ("!ITEMS!"!ITEM!",") do ( endlocal set "ITEMS=%%S" ) ) popd ) if %COUNT% GTR %LIMIT% ( echo Cannot continue script, too many "%PATTERN%" files ^(%COUNT%^) encountered: for %%F in (%ITEMS%) do ( echo(%%~F ) exit /B ) rem Continue script here... endlocal exit /B 文件,此方法可能会失败。

此脚本略有不同,使用类似于数组的变量*.txtITEM[1]ITEM[2]等来存储遇到的ITEM[3]文件(每个文件一个)。< / p>

*.txt

这里的环境大小(包含所有环境变量的空间)是限制;我不知道限制,但应该相当高。