对于批处理文件中的循环和delim

时间:2013-08-19 14:38:55

标签: windows batch-file cmd

有人可以帮我理解命令文件语法

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

2 个答案:

答案 0 :(得分:7)

您需要的大部分信息都可以在内置帮助中找到,但如果您不熟悉批量编程,则可能会令人生畏。例如,从命令提示符处键入HELP FORFOR /?以获取有关FOR命令的帮助。

<强>解释

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

DIR命令列出*.TRX路径中的所有%TEST_RESULTS%个文件。 /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文件。

答案 1 :(得分: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"
)