【问题标题】:Problem with Save-Load system in batch-files批处理文件中的保存加载系统问题
【发布时间】:2020-10-19 19:03:04
【问题描述】:

我一直在尝试制作这个巨大的批处理文件程序,并且在制作它的其中一个会话期间,我意识到在某些时候该程序需要执行两个单独的任务。所以我又做了一个小程序来帮助我的大程序,一切都很顺利,直到我开始需要将信息从大程序传输到小程序。

我虽然没有问题,但我只是制作了一个 .sav 文件,其中保存了那里较小程序的所有必要信息!在此之后,我为小程序编写了代码,它会从 .sav 文件中加载所有信息。我虽然一切都很好而且很清楚,但是每当我加载程序时,都没有加载任何必要的数据

它没有加载诸如var=2 之类的数据,而是加载了var= 之类的数据,这意味着我的代码经常给我“ECHO IS OFF”错误,有时甚至崩溃

我已经尝试在整个互联网上寻找解决方案,但我找不到其他有同样问题的人 我希望你们能帮助我,这是关于我的代码在没有实际 var/位置名称的情况下的外观

大程序:

(
echo %var1%
echo %var2%
echo %var3%
) > "Location\name.sav"  

小程序:

< "Location\name.sav" (
set /p var1=
set /p var2=
set /p var3=
)

我没有错别字或错误,我检查了大约一百万次 如果哪位大神知道怎么解决,请帮忙~

【问题讨论】:

  • 如果您在文本编辑器中打开 name.sav,它是否包含正确的信息?
  • 从大程序中去掉重定向部分&gt; "…"后控制台窗口显示什么?

标签: batch-file


【解决方案1】:

您发布的代码 sn-ps 似乎没问题。 缺少的是您将值分配给变量的位置。 如果您在同一个 () 代码块中分配这些值,那么您不能像在代码中那样回显这些值。 您将不得不使用延迟扩展变量来使用带有最新值的 echo。 见 setlocal /?有关使用延迟扩展的详细信息。 启用延迟扩展后,您可以将 echo %var1% 更改为 echo !var1! 以获取要显示的值。

【讨论】:

    【解决方案2】:

    有一种更简单的方法,只需在每个变量名称的开头使用一个或多个字符的预定字符串。

    以下示例在每个变量名的开头使用字符串var,希望能向您展示它是如何工作的,只需复制并尝试一下:

    @Echo Off
    SetLocal EnableExtensions
    
    Rem Make sure there are no existing variables in the environment named beginning with var.
    For /F "Delims==" %%G In ('"(Set var) 2> NUL"') Do Set "%%G="
    
    Rem Code which defines your variables each beginning with the string var.
    Set "var1=some value"
    Set "var2=another value"
    Set "var3=different value"
    
    Rem See the now defined var variables
    Set var & Pause
    
    Rem send each of your variables and their values out to a sav file.
    Set var 1> "myfile.sav" 2> NUL
    
    Rem Undefine your variables again.
    For /F "Delims==" %%G In ('"(Set var) 2> NUL"') Do Set "%%G="
    
    Rem check that the variables no longer exist.
    Set var & Pause
    
    Rem Get your variables back from the sav file.
    For /F UseBackQ^ Delims^=^ EOL^= %%G In ("myfile.sav") Do Set "%%G"
    
    Rem See the variables now defined again.
    Set var & Pause
    

    【讨论】:

      【解决方案3】:

      与 Compo 的回答相同,但是如果您使用一些宏在定义变量时自动保存变量,则保存到您可以调用的批处理文件仍然更容易。

      @Echo off
      ::: To safely define macros.
       SETLOCAL EnableExtensions DISABLEdelayedExpansion
      rem ::: %Save% macro is built into the definition of each def/vartype macro to autosave variables when defined
      rem ::: - def Vartypes: [[/S] standard string.] [[/P] Set /P input prompt] [[/I] Set /A Integer variable]
       Set User="%TEMP%\%~n0_!#Sv.name!_sav.bat"
       Set Save=(For /F "Tokens=1 Delims==" %%i in ('Set #Sv.') Do (If not "!%%i!"=="" Echo/Set "%%i=!%%~i!"))^>%User%
       Set "Loc=(Set "#Sv.Loc=@"&Title !#Sv.Loc!)&%Save%"
      rem :::  usage: %def/S:VAR=Varname%VariableValue
       Set "def/S=For %%n in (1 2)Do If %%n==2 (Set "#Sv.VAR=!str!"&%Save%)Else Set str="
      rem :::  usage: %def/P:VAR=Varname%Output prompt string
       Set "def/P=For %%n in (1 2)Do If %%n==2 ((For /L %%v in (1 1 10)Do if "!#Sv.VAR!" == "" (Set /P "#Sv.VAR=!promptstr!: "))&%Save%)Else Set promptstr="
      rem :::  usage: %def/I:VAR=Varname%=Equation | %/A:V=Varname%+=IntegerVal | %/A:V=Varname%+=!IntegerVaR!
       Set "def/I=For %%n in (1 2)Do If %%n==2 (Set /A "#Sv.VAR!sum!"&%Save%)Else Set sum="
      rem ::: Required to execute macros.
       SETLOCAL ENABLEdelayedExpansion
      :Welcome
      rem ::: first variable should be name as save macro uses the name to reference user save.
       If Exist "%TEMP%\%~n0_*_sav.bat" (Echo/Existing Users:&Echo/&(For /F "Delims=" %%G in ('Dir "%TEMP%\%~n0_*_sav.bat" /B')Do For /F "Tokens=2 Delims=_" %%o in ("%%~nG") Do  < Nul Set /P "=[%%o] ")&Echo/)
       Set /P "#Sv.Name=Enter your name: "
       If Exist %User% (Echo/[C]ontinue / [D]elete?&For /F "Delims=" %%O in ('Choice /N /C:cd')Do If /I "%%O"=="C" (Goto :Load)Else (Del /P %User% & Goto :welcome))
      :Load
       CALL %User% 2> Nul 
       If Not "!#Sv.Loc!" == "" (Goto :!#Sv.Loc!)
      Pause
      :Start
       %Loc:@=Start%
       %def/I:VAR=dollars%+=!random! %%1000 + 500
       Echo/You have $!#Sv.dollars!.
      :end
      %Loc:@=end%
      Echo/User demo Save contents.
       TYPE %User%
      Endlocal & Endlocal
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-08
        • 2019-05-19
        • 1970-01-01
        • 2021-03-25
        • 2018-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多