我有一个批处理脚本,目的是为Django实例设置开发环境。其中一部分是设置DJANGO_SETTINGS_MODULE
环境变量。如果未提供任何参数,则脚本将运行以下代码块:
for %%* in (.) do set DIR=%%~n*
set DJANGO_SETTINGS_MODULE=%DIR%.dev_settings
第一次调用脚本时,将DJANGO_SETTINGS_MODULE
设置为仅.dev_settings
。当我在同一终端上第二次运行脚本时,它会从目录名正确设置它。
我不知道为什么会这样。
下面是完整的脚本,以防您需要完整的上下文。
@echo off
IF "%1"=="-r" (
set "DJANGO_SETTINGS_MODULE="
) ELSE IF "%1"=="" (
start cmd /c prp-sql
for %%* in (.) do set DIR=%%~n*
set DJANGO_SETTINGS_MODULE=%DIR%.dev_settings
) ELSE IF "%2"=="" (
start cmd /c prp-sql
set DJANGO_SETTINGS_MODULE=%1.dev_settings
) ELSE (
start cmd /c prp-sql
set DJANGO_SETTINGS_MODULE=%1.%2
)
[在圆括号()
块中设置变量时,需要调用它才能查看结果,或者在enabledelayedexpansion
命令中使用了setlocal
并使用!
而不是%
进行扩展thw变量。
下面是修改后的代码
@(
SETLOCAL ENABLEDELAYEDEXPANSION
echo off
)
IF /I "%1" EQU "-r" (
set "DJANGO_SETTINGS_MODULE="
Goto :EOF
)
start cmd /c prp-sql
IF /I "%2" NEQ "" (
set "DJANGO_SETTINGS_MODULE=%1.%2"
) ELSE (
IF /I "%1" NEQ "" (
set "DJANGO_SETTINGS_MODULE=%1.dev_settings"
) ELSE (
for %%_ in (.) do set "DIR=%%~n_"
set "DJANGO_SETTINGS_MODULE=!DIR!.dev_settings"
)
)
或者,如果以后不需要再使用DIR,则可以直接在循环中直接设置Django设置变量:
for %%_ in (.) do (
set "DJANGO_SETTINGS_MODULE=%%~n_.dev_settings"
)
下面是修改后的代码的版本
@(
SETLOCAL
echo off
)
IF /I "%1" EQU "-r" (
set "DJANGO_SETTINGS_MODULE="
Goto :EOF
)
start cmd /c prp-sql
IF /I "%2" NEQ "" (
set "DJANGO_SETTINGS_MODULE=%1.%2"
) ELSE (
IF /I "%1" NEQ "" (
set "DJANGO_SETTINGS_MODULE=%1.dev_settings"
) ELSE (
for %%_ in (.) do set "DJANGO_SETTINGS_MODULE=%%~n_.dev_settings"
)
)
最后一个问题,确定要在设置Django之前启动start cmd /c prp-sql
吗?
无论在此之前还是之后,在确定它应该运行之后都只放入一次(不是-r)