用批处理读取最高的foldername

时间:2018-01-16 08:00:50

标签: batch-file cmd

我拼命地尝试阅读最高的foldername来创建10个具有连续名称的新文件夹。 这些文件夹的编号为例如1234,1235,1236。

SET datei=0
FOR /D %%a IN (*) DO (
    ECHO %datei%
    IF %%a GTR %datei% SET datei=%%a
)
ECHO %datei%

输出

0
0
0
1234

不是我的预期,有人可以帮忙吗? 数字与字符串有问题吗?

问候 斯蒂芬

1 个答案:

答案 0 :(得分:0)

您的批处理代码不起作用,因为 IF 命令行中的%datei%已被0扩展(替换),已经预处理整个命令块(并且在执行 FOR 命令之前以匹配)结束。打开命令提示符窗口并在 IF FOR 示例上运行set /?解释延迟环境变量扩展,然后阅读此示例关于delayed expansion的文章。从批处理文件顶部删除cmd.exe并在命令提示符窗口中运行它而不是双击批处理文件(=调试批处理文件)时,也可以看到@echo off执行批处理文件的此行为)。

此批处理代码应该可以避免使用延迟扩展的要求:

@echo off
for /F "eol=| delims=" %%I in ('dir * /AD /B /O-N 2^>nul') do set "FolderName=%%I" & goto FoundFolder
set "FolderName=0001"

:FoundFolder
rem Print the name of the folder with highest number.
set FolderName

命令 DIR 输出

  • /AD(属性目录)
  • 而只是文件夹名称
  • 匹配当前目录中的通配符模式*
  • 由于/B,因为只有文件夹名称而没有路径,所以
  • 采用裸格式
  • 由于/O-N而以相反顺序按名称按字母顺序排序。

因此, DIR 输出的第一行是具有最高编号的文件夹名称,只要所有文件夹名称具有相同的位数,根据相关的示例情况就是这种情况。此文件夹名称将分配给环境变量,并在处理 DIR 输出的其他文件夹名称之前退出循环,并跳转到标签FoundFolder

也可以使用此代码使用延迟扩展来处理具有不同位数的文件夹名称:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "FolderName=0"

for /D %%I in (*) do (
    echo !FolderName!
    if %%I GTR !FolderName! set "FolderName=%%I"
)

echo !FolderName!
rem Other commands in batch file.
endlocal

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

另请阅读有关Using Command Redirection Operators的Microsoft文章,了解2>nul的说明。重定向运算符>必须使用 FOR 命令行上的插入符^进行转义,以便在执行命令之前Windows命令解释程序处理此命令行时将其解释为文字字符FOR ,它在后台启动的单独命令进程中执行嵌入式dir命令行。