Windows 批处理文件在第二次运行之前未获取目录名
我有一个批处理脚本,用于为Django实例设置开发环境。其中一部分是设置环境变量Windows 批处理文件在第二次运行之前未获取目录名,windows,batch-file,cmd,Windows,Batch File,Cmd,我有一个批处理脚本,用于为Django实例设置开发环境。其中一部分是设置环境变量DJANGO\u SETTINGS\u模块。如果未提供任何参数,脚本将运行以下代码块: (.)do set DIR中%%*的* 设置DJANGO\u设置\u模块=%DIR%.dev\u设置 首次调用脚本时,它将DJANGO\u设置\u模块设置为仅.dev\u设置。当我在同一终端中再次运行脚本时,它会根据目录名正确设置脚本 我不知道为什么会这样 下面是完整的脚本,以防您需要完整的上下文 @echo关闭 如果“%1”=
DJANGO\u SETTINGS\u模块。如果未提供任何参数,脚本将运行以下代码块:
(.)do set DIR中%%*的*
设置DJANGO\u设置\u模块=%DIR%.dev\u设置
首次调用脚本时,它将DJANGO\u设置\u模块
设置为仅.dev\u设置
。当我在同一终端中再次运行脚本时,它会根据目录名正确设置脚本
我不知道为什么会这样
下面是完整的脚本,以防您需要完整的上下文
@echo关闭
如果“%1”=“-r”(
设置“DJANGO\u设置\u模块=”
)否则,如果“%1”=“”(
启动cmd/cprp-sql
对于(.)中的%%*执行设置目录=%%~n*
设置DJANGO\u设置\u模块=%DIR%.dev\u设置
)否则,如果“%2”=“”(
启动cmd/cprp-sql
设置DJANGO\u设置\u模块=%1.dev\u设置
)否则(
启动cmd/cprp-sql
设置DJANGO\u设置\u模块=%1。%2
)
当您在括号内设置变量()
块时,您需要调用它以查看结果,或者在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"
)
)
@(
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"
)
)
或者,如果以后不需要重新使用DIR,您可以直接在循环中设置Django settings变量:
for %%_ in (.) do (
set "DJANGO_SETTINGS_MODULE=%%~n_.dev_settings"
)
以下是经修订的守则的版本
@(
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"
)
)
@(
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
无论是在之前还是之后,在确定该部分应该运行(is not-r)之后,或者在if结构之前或之后,只放入该部分一次,以设置Django变量
我将脚本更改为仅停止aftwr命中-r,因为后面的另一个将正常执行。当您在括号内设置变量()
块时,您需要调用它以查看结果,或者在setlocal
命令上使用了启用延迟扩展
,并使用了
而不是%
来展开thw变量。我将把修改后的代码作为answerClassic发布。但您不一定需要延迟扩展。只需在(.)中为%%*执行设置“DJANGO\u设置\模块=%%~n*.dev\u设置”
谢谢您的帮助;if-else结构正是我沮丧之后的结局。批处理文件让我觉得自己又像个新手了哈哈。