Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 无法附加到批处理文件中的环境变量_Windows_Batch File - Fatal编程技术网

Windows 无法附加到批处理文件中的环境变量

Windows 无法附加到批处理文件中的环境变量,windows,batch-file,Windows,Batch File,我正在尝试将四个目录附加到%pythonpath%。 目录如下: C:\src\tensorflow\models\research C:\src\tensorflow\models\research\object\u detection ..\utils ..\mail 当用户为User42时,%pythonpath%始终设置为: ;C:\src\tensorflow\models\research\object\u detection\utils\邮件 为什么第一条路径被忽略/覆盖 @ech

我正在尝试将四个目录附加到%pythonpath%。 目录如下:

  • C:\src\tensorflow\models\research
  • C:\src\tensorflow\models\research\object\u detection
  • ..\utils
  • ..\mail
  • 当用户为User42时,%pythonpath%始终设置为:

    ;C:\src\tensorflow\models\research\object\u detection\utils\邮件

    为什么第一条路径被忽略/覆盖

    @echo off
    if "%username%"=="User42" (
        set pythonpath=%pythonpath%;C:\src\tensorflow\models\research
        set pythonpath=%pythonpath%;C:\src\tensorflow\models\research\object_detection
    ) else (
        :: Other path
    )
    
    :: This is common to all users
    set pythonpath=%pythonpath%;..\utils;..\mail
    echo %pythonpath%
    

    %pythonpath%
    在括号之间使用两次将在执行开始之前在读取时进行计算。 这就是为什么
    %pythonpath%
    在第二个
    集合上具有相同的值的原因

    您可以使用
    调用集
    强制使用加倍的
    %
    s对变量求值。 这与
    setlocal/?
    如果/?

    @echo off
    if "%username%"=="User42" (
        set "pythonpath=%pythonpath%;C:\src\tensorflow\models\research"
        call set "pythonpath=%%pythonpath%%;C:\src\tensorflow\models\research\object_detection"
    ) else (
        :: Other path
    )
    
    :: This is common to all users
    set "pythonpath=%pythonpath%;..\utils;..\mail"
    echo %pythonpath%
    

    在命令块开始执行的下一个命令行的分析阶段,Windows命令处理器使用语法
    %VariableName%
    替换命令块中以
    开始,以匹配的
    结束的所有环境变量引用。在这种情况下,这意味着在执行IF条件之前,IF条件的两个分支中的all
    %pythonpath%
    已被环境变量
    pythonpath
    的当前值替换。通过在命令提示符窗口中运行批处理文件而不关闭
    @echo
    ,可以看到此行为,在这种情况下,Windows命令处理器在执行前解析命令行后输出命令行

    该解决方案的另一个解释是,在IFFOR示例上的命令提示符窗口中运行命令SET输出时使用,或者避免定义或修改环境变量,并在同一命令块中再次引用它

    以下是一个不使用延迟扩展的解决方案:

    @echo off
    set "Separator="
    if defined pythonpath if not "%pythonpath:~-1%" == ";" set "Separator=;"
    if /I "%username%" == "User42" (
        set "pythonpath=%pythonpath%%Separator%C:\src\tensorflow\models\research;C:\src\tensorflow\models\research\object_detection"
    ) else (
        rem Other path is added here to environment variable pythonpath.
    )
    
    rem This is common to all users. Variable pythonpath is defined definitely now.
    for %%I in ("%CD%") do set "ParentPath=%%~dpI"
    set "pythonpath=%pythonpath%;%ParentPath%utils;%ParentPath%mail"
    echo %pythonpath%
    
    它还确保没有
    pythonpath
    的值中添加code>。并确保
    pythonpath
    未使用
    定义if条件之前该环境变量根本不存在,则在开始时编码>

    此外,由于在将
    pythonpath
    附加到
    pythonpath之前确定了
    的绝对路径,因此没有将相对路径添加到
    pythonpath

    要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

    • echo/?
    • 如果/?
    • rem/?
    • 设置/?

    顺便说一句:命令块中不应使用无效标签
    作为注释。这可能导致执行时出现未定义的行为。使用命令REM进行评论更安全。

    使用delayedexpansion。重复,也可能是与此处不同的本体复制,可能只是一次性更新变量:
    set pythonpath=%pythonpath%;C:\src\tensorflow\models\research;C:\src\tensorflow\models\research\object\u detection
    ,因此不需要延迟扩展。。。