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

时间:2018-08-20 23:59:49

标签: windows batch-file

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

  1. C:\ src \ tensorflow \ models \ research
  2. C:\ src \ tensorflow \ models \ research \ object_detection
  3. .. \ utils
  4. .. \ mail

当用户为User42时,%pythonpath%始终设置为:

; C:\ src \ tensorflow \ models \ research \ object_detection; .. \ utils; .. \ mail

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

@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%

2 个答案:

答案 0 :(得分:1)

在括号之间使用两次的

%pythonpath%将在执行开始之前进行读取评估。 这就是%pythonpath%在第二个set处具有相同值的原因。

您可以使用call set来对%加倍的变量进行求值。 这与在enabledelayedexpansion中看到的setlocal /?具有相似的效果 和if /?

@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%

答案 1 :(得分:1)

在下一个要执行的命令行的解析阶段,Windows命令处理器在以%VariableName%开头并以匹配(结尾的命令块中,用语法)替换所有环境变量引用。命令块开始。在这种情况下,这意味着 IF 条件的两个分支中的全部 %pythonpath%已由<完全执行了strong> IF 条件。通过在命令提示符窗口中运行不带pythonpath的批处理文件,可以看到此行为,因为在这种情况下,Windows命令处理器在执行之前经过解析后会输出命令行。

该解决方案使用delayed expansion,在 IF 上的命令提示符窗口@echo off中运行时,命令 SET 输出的帮助也说明了这一点和 FOR 示例,或者避免定义或修改环境变量,并在同一命令块中再次引用它。

这是一种无需延迟扩展即可使用的解决方案:

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% 的值中没有;;。并确保如果在第一个 IF 条件之前根本不存在此环境变量,则pythonpath开头不会用pythonpath定义。

此外,由于在将;pythonpath附加到..\utils之前确定了绝对路径,因此没有向..\mails添加相对路径。

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

  • pythonpath
  • echo /?
  • if /?
  • rem /?

BTW:不应在命令块中使用无效的标签set /?作为注释。这可能导致执行时出现不确定的行为。使用命令 REM 进行注释更安全。