无法使用%%表示法递归地设置文件路径并在批处理文件中读取文件名

时间:2015-02-12 11:18:14

标签: batch-file cmd

我需要使用python命令执行一组.txt文件(使用机器人框架编写的测试脚本)。每个测试脚本都放在一个文件夹中,所有这些子文件夹都放在名为TestFolder的主文件夹下。 每个子文件夹下的脚本文件看起来像这样 -

   Test_Data.txt

   Sign_In.txt

   Registration.txt

我正在使用批处理文件来触发此测试。我的代码如下: -

@echo off

D:
cd .\TestFolder
Echo Current dir: "%CD%"

echo.***        Running Test suite in Chrome       ***

For /r %%i in (*.txt) do ( 

  set SuitePath=%%i (--- I would like to get full file name)

  echo Suite path : !SuitePath!

  set SuiteName=%%~ni    (-- to get name of file without ext)

  echo Suite name : !SuiteName!

CALL pybot --variable Browser:Chrome -d D:\SmokeTestResults\TestResults_%date:~10,4%%date:~4,2%%date:~7,2%... 
)

当我从命令行执行此操作以进行初始测试时,我得到了以下错误:

----

Current dir: D:\TestFolder

***        Running Test suite in Chrome       ***

Suite path : !SuitePath!

Suite name : !SuiteName!

[ ERROR ] Parsing '!SuitePath!' failed: Data source does not exist.

Try --help for usage information.

Suite path : !SuitePath!

Suite name : !SuiteName!

[ ERROR ] Parsing '!SuitePath!' failed: Data source does not exist.

 .... ..... .......  ......

请注意,测试脚本文件夹在D盘中,批处理文件能够正确打印当前目录..但是它无法设置套件路径或套件名称

  • 如果我需要更改批处理命令,请帮助我。我需要将此套件设置为每日构建的持续集成。

谢谢。 Ishwar

1 个答案:

答案 0 :(得分:2)

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "folder=d:\TestFolder"

    pushd "%folder%" && (
        for /r %%i in (*.txt) do (
            set "SuitePath=%%~fi"
            set "SuiteName=%%~ni"

            setlocal enabledelayedexpansion
                echo Suite Path = "!SuitePath!"
                echo Suite Name = "!SuiteName!"

                CALL pybot --variable Browser:Chrome -d D:\SmokeTestResults\TestResults_%date:~10,4%%date:~4,2%%date:~7,2%... 
            endlocal 
        )
        popd
    )

要使用延迟扩展,您需要先启用它。

请注意,当延迟扩展处于活动状态时,文件名称或路径中存在感叹号会成为问题,因为批处理解析器将在set命令中删除或重新解释它们。如果您确定您的文件永远不会在其名称/路径中包含感叹号,则可以在脚本开头直接启用延迟扩展,并删除包含的内部setlocal enabledelayedexpansion / endlocal行以处理指示的问题。 / p>

无论如何,如果不需要变量,也就是说,你只需要它的值而不是存储在变量中的值,不要使用延迟扩展并直接使用你使用的for可替换参数变量引用。