将批处理变量导出到文本文件

时间:2014-04-11 09:29:26

标签: variables batch-file save export

我最近获得了使用

将变量从批处理脚本导出到文本文件的建议
set $>savefile

并使用

在另一次启动时返回所述变量
for /f "delims=" %%a in (savefile) do set %%a

在实现中,这不是使用变量创建文件,导致脚本出错,从而关闭批处理。为了弥补结束,我创建了一个检查以显示错误消息,但仍然无法让脚本将变量导出到文件中。

变量

::Variables
set Location=Und
set Name=Und
set Gender=Und
set Age=Und
set Gold=0
set Hunger=Satisfied
set Illness=None
set Wounds=None
set CHP=10
set MHP=10
set CMP=0
set MMP=0
set DMG=(%STR%/5)+%RTWPDMG%
set DFN=0+%HeadAR%+%NeckAR%+%Shoulder%+%Chest%+%Glove%+%Leg%+%Feet%
set INT=1
set DEX=1
set STR=1
set Head=----
set Shoulder=----
set Neck=----
set Chest=Shirt
set Glove=----
set Leg=Pants
set Feet=Shoes
set LTWP=----
set RTWP=----
goto Start

保存脚本

::Save
:Save
cls
set $Location=%Location%
set $Name=%Name%
set $Gender=%Gender%
set $Age=%Age%
set $Gold=%Gold%
set $Hunger=%Hunger%
set $Illness=%Illness%
set $Wounds=%Wounds%
set $CHP=%CHP%
set $MHP=%MHP%
set $CMP=%CMP%
set $MMP=%MMP%
set $DMG=%DMG%
set $DFN=%DFN%
set $INT=%INT%
set $DEX=%DEX%
set $STR=%STR%
set $Head=%Head%
set $Shoulder=%Shoulder%
set $Neck=%Neck%
set $Chest=%Chest%
set $Glove=%Glove%
set $Leg=%Leg%
set $Feet=%Feet%
set $LTWP=%LTWP%
set $RTWP=%RTWP%
set $>%Name%_Savefile.txt
cls
echo SAVED
echo.
echo.
pause
Goto Start

加载脚本

::Select Character to Load
:LoadError
Echo INVALID NAME
echo.
echo.
echo.
echo.
goto LoadSelect1
:LoadSelect
cls
goto LoadSelect1
:LoadSelect1
set /p Name=Enter character to load:
goto Load
:Load
cls
if EXIST %Name%_Savefile.txt goto LoadSuccess
goto LoadError
:Load
for /f "delims=" %%a in %Name%_Savefile.txt do set %%a
goto Stats

我错过了什么吗?我希望所有以$开头的变量都被定位,而不需要列出每个变量。

奖金问题: 如果我对原始变量使用$ Variable,它们是否仍然使用%Variable%调用?如果是这样的话,它会减少相当多的混乱。

- 我意识到批处理是脚本的次优语言,但它是我唯一熟悉的语言。我目前正在研究lua和C ++,并计划稍后通过转换批处理文件来实践这两者。

编辑:文件已创建,但只包含第1行中的$而没有其他内容。我假设我误解了变量export命令的使用。

2 个答案:

答案 0 :(得分:0)

如果您将%test%作为变量,则很简单。 (但它可以是%%)你应该这样做:

echo %test%
echo %test% >nameofyourtextfile.txt

然后阅读你应该使用:

for /f "delims=" %%x in (nameofyourtextfile.txt) do set "test=%%x"
echo %test%
  

适用于文本文件的第一行和>>将变量发送到最后一行。所以你可以像这样使用这些:

echo %test1% > nameofyourtextfile.txt
echo %test2% >> nameofyourtextfile.txt
echo %test3% >> nameofyourtextfile.txt

要从不同的行加载,请使用:

for /F "tokens=1,2,3" %%i in (nameofyourtextfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set test1=%1
set test2=%2
set test3=%3

您可以像这样添加更多令牌:

for /F "tokens=1,2,3,4,5" %%i in (nameofyourtextfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set test1=%1
set test2=%2
set test3=%3
set test4=%4
set test5=%5

答案 1 :(得分:0)

如果你按照发布的方式进行,你拥有的是(只是摘录)

在您的主要代码set Wounds=None

中 保存代码set $Wounds=%Wounds% set $>filename

中的

在您的加载代码for %%a .... set %%a中被转换为set $Wounds=None

最后,您尚未为%Wounds%分配加载的值,因此需要一个aditional set Wounds=%$Wounds%

我认为使用$收到的建议是使用您要保存的所有变量的公共前缀的建议,因此,您可以发送它们并从中加载它们一个文件很费力。你可以使用$或者你想要的任何其他东西,只要它是一个有效的sintax并且你想要保存/加载到sintax的所有变量。

以示例

    call :initializeCharacter
    .... 

    call :save

    ....

    call :load 

:initializeCharacter
    set "ch.Name=Und"
    set "ch.Gender=Und"
    ....
    exit /b

:save 
    set ch.>"c:\savedGames\save.txt"
    exit /b

:load
    for /f "usebackq delims=" %%a in ("c:\savedGames\save.txt") do set "%%a"
    exit /b 

当调用load函数时,变量(名为ch.whatever并保存为ch.whatever)会在文件读取时被覆盖。这样,代码中的变量,保存的内容和加载的内容都具有相同的名称。保存时无需set $myVar=%myVar%或加载时set myVar=%$myVar%

并使用$ch.,....或所需的任何前缀需要在块中保存/加载的所有变量。您不想保存/加载的名称应该与set prefix>file中使用的前缀不匹配。更好的选择是为不同的域/级别/概念元素使用不同的前缀/ ...