批处理文件中的for循环和分隔符

14

有人能帮我理解命令文件语法吗?

IF "%INPUT_PATH%"=="" (
    echo Searching for latest test results in: %TEST_RESULTS%
    FOR /F "delims=" %%i in ('dir /O-D /B "%TEST_RESULTS%\*.trx"') DO (
        SET INPUT_PATH=%TEST_RESULTS%\%%~ni
        GOTO :DoneInputPath
) )

我理解它首先检查INPUT_PATH变量是否为空,如果为空,则进入内部for循环,否则就迷失了

具体来说:

  1. FOR /F "delims=" %%i in ('dir /O-D /B "%TEST_RESULTS%\*.trx"')
  2. SET INPUT_PATH=%TEST_RESULTS%\%%~ni

请适当格式化您的代码,以便其他人能够阅读它。 - njzk2
2个回答

22

大部分你需要的信息都可以在内置帮助中找到,不过如果你是新手批处理编程,这可能会令人望而生畏。例如,在命令提示符下键入HELP FORFOR /?来获取有关FOR命令的帮助。

FOR /F "delims=" %%i in ('dir /O-D /B "%TEST_RESULTS%\*.trx"') ...

DIR命令列出%TEST_RESULTS%路径中所有的*.TRX文件。选项/B提供简要格式(仅文件名)。选项/O-D按最后修改日期降序排序文件(最新的文件先显示)。

FOR /F命令有三种模式,取决于IN()子句的格式。IN()子句用单引号括起来意味着FOR / F将内容视为命令,并逐行处理命令输出。选项"delims ="表示不解析成标记(保留每一行完整)。因此,每行都被迭代加载到%%i变量中。变量%%i仅存在于FOR命令的上下文中。

SET INPUT_PATH=%TEST_RESULTS%\%%~ni

我认为你知道这个命令的大部分作用。唯一“不寻常”的方面是%%~ni语法。该语法仅将%%i的值扩展为基本文件名,而不带任何扩展名。

GOTO :DoneInputPath

GOTO语句会导致FOR循环在第一次迭代后中止。这意味着INPUT_PATH将被设置为最近修改的*.trx文件的名称,因为它已经排序到了顶部。

如果没有GOTO语句,则最终结果将是最老的*.trx文件。


0

试试这个,注释里有解释:

IF NOT DEFINED INPUT_PATH (
    echo Searching for latest test results in: %TEST_RESULTS%
    REM dir /OD means older files first and the youngest last, the last remains in INPUT_PATH; use "%%~nxi" for file name + file extension
    FOR /F "delims=" %%i in ('dir /OD /B "%TEST_RESULTS%\*.trx"') DO SET "INPUT_PATH=%TEST_RESULTS%\%%~ni"
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接