批处理文件直到第二次运行才获得目录名称

问题描述 投票:1回答:1

我有一个批处理脚本,目的是为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
)
windows batch-file cmd
1个回答
0
投票

[在圆括号()块中设置变量时,需要调用它才能查看结果,或者在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)

© www.soinside.com 2019 - 2024. All rights reserved.