Dos 脚本在一台机器上运行良好,但在其他机器上运行不正确,为什么?

Dos 脚本在一台机器上运行良好,但在其他机器上运行不正确,为什么?

虽然不太擅长 dos 脚本,但用起来很顺手,因此我在这里找到了很多解决我遇到的问题的简单方法。所以最近我在这里复制了一个脚本来计算子目录中的文件数量。我稍微修改了一下,以适应我的目的。它现在如下所示,在我编写它的桌面上运行良好:

FOR /D %%D IN ("*") DO (
  FOR /F %%K IN ('DIR /A-D "%%D" 2^>NUL ^| FIND "File(s)" ^|^| ECHO 0') DO (
    ECHO %%D: %%K
  )
)

现在奇怪的是:在我的计算机上(编写脚本的那台电脑),输出符合预期,而在其他电脑上,计数器不计数,结果为零(这绝对是错误的)。

所有机器都运行 Windows 7(其中一台运行专业版,另外两台运行高级版和专业版)。

这里发生了什么?我该如何纠正?

谢谢!

答案1

采用同样的方法

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /d %%a in (*) do for /f "tokens=1,5" %%b in ('
        dir /a-d "%%~fa\*" 2^> nul ^| findstr /b /c:"  " ^|^| echo 0
    ') do if "%%c"=="" echo %%~fa : %%b

这会

  • 对于每个文件夹(for /d)获取一个引用并将其存储在%%a可替换参数中
  • dir使用文件夹的完整路径运行命令%%~fa
  • 使用管道 ( |) 过滤列表以仅检索以两个空格开头的行(页脚行)
  • 如果没有找到任何行(即dir命令失败)则输出 0
  • 生成的行由dir | findstr命令处理for /f。我们将读取第一个标记(行中的文件数)和第五个标记(仅出现在包含目录信息的页脚行中)
  • 如果第五个元素为空,则此行包含有关文件而非文件夹的信息,因此请回显文件夹路径及其内部的文件

这种方法的问题在于,dir | findstr对每个子文件夹都执行。为了更快的解决方案

robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs

这将简单地调用robocopy,但不会复制任何内容,我们将要求不复制任何内容,仅返回应处理的内容列表 ( /nocopy /l)。我们要求从当前文件夹复制到当前文件夹,包括处理中的相同文件 ( /is),处理空子文件夹(/e,以包含 0 个文件的文件夹),但仅处理两个级别(/lev:2当前文件夹和下面的文件夹),不生成文件列表 ( /nfl),没有作业标题 ( /njh) 也没有作业摘要 ( /njs)

结果将是相同的列表,但文件夹名称和文件数在更改的列中

保持原始输出格式

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /f "tokens=1,*" %%a in ('
        robocopy . . /l /nocopy /is /e /nfl /lev:2 /njh /njs
    ') do echo %%~fb : %%a

这将使用 来for /f处理前一个robocopy命令,将该行拆分为两个标记,第一个标记将包含文件数并将存储在 中%%a,第二个标记包含该行的其余部分并将存储在 中%%b。对于内部命令输出中的每一行robocopy,将执行子句中的代码do:只需以相反的顺序回显到控制台上的两个标记即可。

答案2

安装或更改Windows 显示语言。您的脚本依赖于语言。例如,dir命令在捷克 Windows 上显示统计数据,Soubor(ů)而不是。File(s)

dir |find "Files(s)"然后设置%ERRORLEVEL%1

FIND将设置%ERRORLEVEL%如下:

  • 0至少在其中一个文件中找到字符串;
  • 1未找到字符串;
  • 2如果列表中的任何文件不存在或没有文件与通配符掩码匹配,则给出无效开关。

请注意,“文件”是一个有效的文件夹名称;因此,您的脚本可以显示

==>md "File(s)"

==>D:\bat\SU\935171.bat
a b: 3
File(s): Directory
FooBar: 0
FooFoo: 4

相关内容