我正在为我的IT部门编写一个小的库存脚本,而且我试图节省一些时间,遇到了一些绊脚石。
我的目标是将当前位置存储在一个临时的本地文件中(该batch file将在闪存驱动器上运行),以便当我从一台计算机移动到下一台计算机时,如果位置不准确,则只需更改位置。 基本上,如果我从A号楼1号单元的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! )
一切正常,除了当我试图让它保持默认。 我想只要input正确的值就可以(例如“什么房间?(默认为403)”,进入后保持403)
问题是,当我这样做,即使代码检查新的环境variables(input),看看它是否是空的,它仍然分配旧variables的新值(空string)。
更令人困惑的是,如果我使用默认值(如1,A,4)创build一个现有的location.tmp,然后按回车确认每一个,则批处理语句echo !unit!,!building!,!room!>location.tmp
执行,但location.tmp不变。
任何想法发生了什么?
set /p %1=What %1? (default is !%1!)
如果您只是回复Enter来set /p
那么变量保持不变。
所以 – 不需要new%1
– 即使这样, new
已经足够了,因为没有明显的需要新的ROOM等等。你不得不明智地new
清除,以避免保留陈旧的数据。
行echo !unit!,!building!,!room!>location.tmp
中的变量的延迟执行导致它们被扩展得太晚,因此语句无论什么原因都无法正确执行。 用正常的%变量%替换它们可以解决这两个问题。 原来这个比较是正确的,只是没有及时扩大。
编辑:不知道为什么,但以上是不正确的。 下面的脚本完美地工作…
@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!)