0

我的目标是有一个程序在每次更新(成功)时将 6 个变量(q、d、n、p、tc、td)保存在一个文本文件中,并且在重新打开时会根据文本文件自动设置变量。因此,如果 tc 在上次关闭时等于 13,如果我在一周后打开它,它仍然等于 13。(假设文本文件未触及)当我尝试运行这段代码时会出现问题:

:Load
set v=0
FOR /F "usebackq delims=" %%a in ("SavedData.txt") do (
set /a var+=1
set var!v!=%%a
)
set q=%var1%
set d=%var2%
set n=%var3%
set p=%var4%
set td=%var5%
set tc=%var6%
goto main

它给出了以下错误:

9 was unexpected at this time.

有任何想法吗?(顺便说一句,当显示错误时,没有一个值等于 9)

编辑:我让它工作了,但现在每个变量最后都有一个额外的空间,我想删除它以便它可以正常工作。

我通过打字set /a v+=1而不是set /a var+=1

4

3 回答 3

2

我不认为错误消息出现在您认为的位置,但我确实在您的代码中看到了一个错误。var当您打算增加时,您正在增加v。我看不出该错误如何给出您描述的错误消息,但它显然会导致问题,并可能导致代码中其他地方的错误。

您的 Load 例程可能要简单得多。

:Load
<"SavedData.txt" (for %%V in (q d n p td tc) do set /p "%%V=")
于 2013-02-27T02:29:30.527 回答
1

正如 dbenham 所说,您的加载程序可能要简单得多。这个答案不会讨论如何让它变得更简单,因为你可能应该只看一下(假设 debnham 的答案比我的得到更多的支持)。这个答案会告诉你为什么你的变量值中有额外的空格。

现在,我能想到为什么会发生这种情况的唯一原因是因为在您的代码(可能是:save序列)的某个地方,您的代码看起来像这样:

echo value_of_q >> "SavedData.txt"
::More stuff here...

问题是语句结束前的空格 ( echo value_of_q) 和重定向 ( >> "SavedData.txt")。这会将命令的输出(包括任何空格)附加到SavedData.txt.

现在,您可以通过两个选项之一(或两者)来避免这种情况。

选项 1。您修剪空格。用它echo value_of_q>> "SavedData.txt代替你所拥有的。

选项 2。假设变量的值在不同的行上,您可以delimsfor循环中删除该选项(您也可以删除该usebackq选项)。

所以,你的for循环看起来更像......

for /f "usebackq" %%i in ("SavedData.txt") do (
    ::Rest of your code here...
    ::Oh, and your code blocks should be indented as well.
)

如您所见,我将 更改%%a%%i,这对于您的循环不是必需的,但这是一种很好的做法,因为它可能会在将来避免错误。

希望有帮助。

于 2013-02-27T05:37:24.197 回答
1

一种更简单的方法是通过包含完整的命令而不是变量值来使保存文件成为.bat一个文件而不是文件;这样做的好处是加载代码不依赖于保存值的顺序(也不依赖于保存代码)。例如,这将是保存变量的代码:.txtset

:Save
(for %%v in (q d n p td tc) do echo set %%v=!%%v!) > "SavedData.bat"

这将是恢复保存值的代码:

:Load
call "SavedData.bat"

安东尼奥

于 2013-02-27T06:29:30.547 回答