Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Batch Count.txt文件和基于计数的函数后的回显文件名_Variables_Batch File_Count - Fatal编程技术网

Variables Batch Count.txt文件和基于计数的函数后的回显文件名

Variables Batch Count.txt文件和基于计数的函数后的回显文件名,variables,batch-file,count,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

我有一个工作批处理脚本,它统计目录树(包括子目录)中的.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,则转到通知用户(这是简单的echo命令)

我不明白的是如何将3个或更多的find.txt文件名回显给用户。我知道这将是一个变量,但我似乎无法理解它以及如何将其放入上述命令中

还有。。在回显中,有时文件名中的“.”可能多于扩展名

IE:filename.txt.gpg

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

如果您只想回显提供您回显总数的姓名,您可以使用以下方法:

@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) ) )

您可能不想多次扫描.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
@echo关闭
setlocal
设置“root=C:\folder\folder\root”
设置“out=%temp%\myTextFileList.txt”
目录/b/s/a-d“%root%\*.txt”>“%out%”

对于中的/f%%N('find/c/v”“),中可能提供了最简单的解决方案。但是,我想给出一个答案,而不使用临时文件,而是使用(a)变量来存储文本文件列表


下面的脚本基于您的
for/R
方法,并建立了一个以逗号分隔的找到的
*.txt
文件列表(每个文件都包含在
)并将其存储在变量
ITEMS
中。如果数量超过预定义的限制,则使用标准
for
循环来显示列表项。如下所示:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem在此定义常量:
设置“位置=…”
设置“PATTERN=*.txt”
设置/A限制=2
设置/A计数=0
设置“项目=”
推送“%LOCATION%”和(
在(“%PATTERN%”中为/R“%%F”执行(
设置/A计数+=1
设置“项=%%~F”
setlocal EnableDelayedExpansion
对于/F“delims=“%%S in(“!ITEMS!”!ITEM!”,”)do(
端部
设置“项=%%S”
)
)
邻苯二胺
)
如果%COUNT%GTR%限制%(
echo无法继续脚本,遇到太多“%PATTERN%”文件^(%COUNT%^):
对于%%F in(%ITEMS%)执行以下操作(
回声(%)~F
)
退出/B
)
rem在这里继续脚本。。。
端部
退出/B
由于环境变量的大小和命令行的长度是有限的(我认为在Windows 7 x64上,两者都是8191字节),对于找到的大量
*.txt
文件,此方法可能会失败


此脚本稍有不同,它使用类似数组的变量
项[1]
项[2]
项[3]
等来存储遇到的
*.txt
文件(每个文件一个)

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem在此定义常量:
设置“位置=…”
设置“PATTERN=*.txt”
设置/A限制=2
设置/A计数=0
推送“%LOCATION%”和(
在(“%PATTERN%”中为/R“%%F”执行(
设置/A计数+=1
设置“项=%%~F”
setlocal EnableDelayedExpansion
对于/F“tokens=1,*delims=|”%%S in(“!COUNT!|!ITEM!”)do(
端部
设置“项目[%%S]=%%T”
)
)
邻苯二胺
)
如果%COUNT%GTR%限制%(
echo无法继续脚本,遇到太多“%PATTERN%”文件^(%COUNT%^):
对于(1,1,%COUNT%)中的/L%%F,请执行以下操作(
setlocal EnableDelayedExpansion
回显(!项[%F]!
端部
)
退出/B
)
rem在这里继续脚本。。。
端部
退出/B

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

这似乎很简单,但有没有办法在GOTO notifyuser之后回显文件?您是否可以将%%n1->像%%t之类的变量…然后在脚本中回显%%t?在这种情况下,使用@aschipfl解决方案,他基本上也在做同样的事情但将所有名称存储在数组变量中(如项[1]…项[2]等),然后在notifyuser部分使用其解决方案的最后一部分,因为变量已设置,将输出每个项[n]直到他达到总数。出于某种原因,即使在最后有一个暂停,使用它也会使批快速打开和关闭。不确定现在是什么,但通常是因为某个地方的键入错误。@user2150312-看看逻辑-暂停需要在IF块内。编辑。而不是枚举所有文件(
*
),您可以让
for/R
循环已经对
*.txt
文件进行过滤;因此不需要使用
if/I
语句。而不是
pushd[…]和(&/R[…])
我将使用
pushd[…]和((for/R[…])&popd)
。。。
@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