我正在尝试将四个目录附加到%pythonpath%。 目录是:
当用户为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%
答案 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 进行注释更安全。