Windows 无法附加到批处理文件中的环境变量
我正在尝试将四个目录附加到%pythonpath%。 目录如下: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
;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命令处理器在执行前解析命令行后输出命令行
该解决方案的另一个解释是,在IF和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%
它还确保没有如果末尾已经有分号,则在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
,因此不需要延迟扩展。。。