Windows 批处理文件在第二次运行之前未获取目录名

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实例设置开发环境。其中一部分是设置环境变量
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结构正是我沮丧之后的结局。批处理文件让我觉得自己又像个新手了哈哈。