Windows 批处理变量在执行时未展开

Windows 批处理变量在执行时未展开,windows,batch-file,Windows,Batch File,我正在为我的IT部门编写一个小的清单脚本,为了节省时间,我遇到了一个小绊脚石 我的目标是将当前位置存储在一个临时本地文件中(此批处理文件将在闪存驱动器上运行),这样,当我从一台计算机移动到下一台计算机时,如果位置不准确,我只需更改位置。基本上,如果我从1号单元A楼3号房间开始,我只需要确认哪些是正确的,哪些是不正确的 也许位置确认码会让你更好地了解这里的情况 @echo off setlocal setlocal EnableDelayedExpansion if not exist locat

我正在为我的IT部门编写一个小的清单脚本,为了节省时间,我遇到了一个小绊脚石

我的目标是将当前位置存储在一个临时本地文件中(此批处理文件将在闪存驱动器上运行),这样,当我从一台计算机移动到下一台计算机时,如果位置不准确,我只需更改位置。基本上,如果我从1号单元A楼3号房间开始,我只需要确认哪些是正确的,哪些是不正确的

也许位置确认码会让你更好地了解这里的情况

@echo off
setlocal
setlocal EnableDelayedExpansion
if not exist location.tmp (
    echo  , , > location.tmp
)
for /f "tokens=1-3 delims=," %%i in (location.tmp) do (
    if not "%%i" == " " (
        set unit=%%i
    )
    if not "%%j" == " " (
        set building=%%j
    )
    if not "%%k" == " " (
        set room=%%k
    )
)
for %%i in (unit,building,room) do (
    call :SUB_GET %%i
)
echo !unit!,!building!,!room!> location.tmp
endlocal
exit /b 0

:SUB_GET
if not defined %1 (
    set /p %1=What %1? 
    goto :EOF
)
set /p new%1=What %1? (default is !%1!) 
if not "!new%1!" == "" (
    set %1=!new%1!
)
除了我试图允许它保持默认值外,其他一切都正常。如果值正确,我希望能够直接按enter键,(例如,“What room?(默认为403)”按enter键,然后保持403)

问题是,当我这样做时,即使代码检查新的环境变量(输入)以查看它是否为空,它仍然将新变量(空字符串)的值分配给旧变量

更令人困惑的是,如果我使用默认值(如1、A、4)创建一个现有的location.tmp,然后按enter键确认每个位置,则批处理语句
echo!单位!,!建筑!,!房间!>执行location.tmp
,但location.tmp不变


知道这是怎么回事吗?

echo中变量的延迟执行!单位!,!建筑!,!房间!>location.tmp
导致它们扩展得太晚,因此无论出于何种原因,该语句都无法正确执行。用普通的%variables%替换它们可以解决这两个问题。结果证明,这种比较是正确的,只是没有及时得到扩展

编辑:不知道为什么,但上面是不正确的。下面的脚本工作得非常好

@echo off
setlocal
setlocal EnableDelayedExpansion
if not exist location.tmp (
    echo  , , > location.tmp
)
for /f "tokens=1-3 delims=," %%i in (location.tmp) do (
    if not "%%i" == " " (
        set unit=%%i
    )
    if not "%%j" == " " (
        set building=%%j
    )
    if not "%%k" == " " (
        set room=%%k
    )
)
for %%i in (unit,building,room) do (
    call :SUB_GET %%i
)
echo !unit!,!building!,!room!> location.tmp
endlocal
exit /b 0

:SUB_GET
if not defined %1 (
    set /p %1=What %1? 
    goto :EOF
)
set /p %1=What %1? (default is !%1!) 
如果您只需回复Enter到
set/p
,则变量保持不变


所以-不需要
new%1
-即使这样
new
也足够了,因为不需要明显的newROOM等。您必须明智地清除
new
,以避免保留过时的数据。

哦,哇,这简化了事情。我永远也不会忘记批处理脚本编写是多么奇怪和不必要的复杂,但也许有一天我会知道足够多,不想一直对它大喊大叫。谢谢
set /p %1=What %1? (default is !%1!)