有没有办法通过写入自身在批处理文件中创建持久变量?

时间:2019-03-06 22:25:16

标签: batch-file

我写了一个用于文件管理的批处理文件。批处理文件解析.XML数据库以获取基本文件名列表,然后允许用户将这些特定文件移动/复制到新目录中。该程序提示用户输入源目录和.XML文件的名称。我希望程序将变量默认为最后使用的条目,即使先前的CMD会话已关闭。我的解决方案是在程序开始时向用户询问每个变量,然后将这些变量写到一个单独的名为param.bat的批处理文件中,如下所示:

@echo off
set SOURCEDIR=NOT SET
set XMLFILE=NOT SET
if exist param.bat call param.bat
set /p SOURCEDIR=The current source directory is %SOURCEDIR%.  Please input new directory or press [Enter] for no change.
set /p XMLFILE=The current XML database is %XMLFILE%.  Please input new database or press [Enter] for no change.

REM {Rest of program goes here}

echo @echo off>param.bat
echo set SOURCEDIR=%SOURCEDIR%>>param.bat
echo set XMLFILE=%XMLFILE%>>param.bat
:END

我希望有一个更优雅的解决方案,该解决方案不需要单独的批处理文件,并允许我将变量数据存储在主批处理文件本身中。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

有一种方法可以将变量本身保存在bat文件中,但是您需要将:END 替换为:EOF

  

:EOF have a good explained in this link .: |:。参见Where does GOTO :EOF return to?

此外,它可以在 fat32 / ntfs 文件系统中工作!

您可以在bat文件中写入变量,并在需要时读取:

糟糕::对不起,我的英语

@echo off & setlocal enabledelayedexpansion

set "bat_file="%temp%\new_bat_with_new_var.tmp"" & type nul >!bat_file! & set "nop=ot Se"
for /f %%a in ('forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo 0x40"') do set "delim=%%a"

type "%~f0"| findstr "!delim!"| find /v /i "echo" >nul || for %%s in (SOURCEDIR XMLFILE) do set "%%s=N!nop!t"
if defined SOURCEDIR echo/!SOURCEDIR!%delim%!XMLFILE!%delim%>>"%~f0" 

for /f "delims=%delim% tokens=1,2" %%a in ('type "%~f0"^| findstr /l "!delim!"^| find /v /i "echo"') do (

     set /p "SOURCEDIR=The current source directory is %%~a. Please input new directory or press [Enter] for no change: "
     set /p "XMLFILE=The current XML database is %%~b. Please input new database or press [Enter] for no change: "

     if /i "!old_string!" neq "!SOURCEDIR!!delim!!XMLFILE!!delim!" (

         type "%~f0"| findstr /vic:"%%~a!delim!%%~b!delim!">>!bat_file!"
         copy /y !bat_file! "%~f0" >nul

         echo/!SOURCEDIR!!delim!!XMLFILE!!delim!>>%~f0"
         goto :_continue_:

    ))

:_continue_:
rem :| Rest of program goes here | replace/change last command [goto :END] to [goto :EOF]

goto :EOF
rem :| Left 2 line blank above, because your variable will be save/read in next line above here |:

答案 1 :(得分:0)

@echo off
setlocal

dir /r "%~f0" | findstr /c:" %~nx0:settings" 2>nul >nul && (
    for /f "usebackq delims=" %%A in ("%~f0:settings") do set %%A
)

if defined SOURCEDIR echo The current source directory is %SOURCEDIR%.
set /p "SOURCEDIR= Please input new directory or press [Enter] for no change. "

if defined XMLFILE echo The current XML database is %XMLFILE%.
set /p "XMLFILE=Please input new database or press [Enter] for no change. "

(
    echo SOURCEDIR=%SOURCEDIR%
    echo XMLFILE=%XMLFILE%
) > "%~f0:settings"

这使用批处理文件的备用数据流(ADS)来 保存设置。 NTFS文件系统是必需的。如果ADS流丢失, 将批处理文件复制到NTFS以外的文件系统。

通过管道dir findstr来确定 流确实存在,然后尝试从中读取。 这有助于避免for发出错误消息 如果ADS不存在,则循环。

for循环设置从ADS读取的变量名称和值。

最后,变量将保存到ADS。

注意

  • %~f0是批处理文件的完整路径。 有关所有可用的修饰符,请参见for /?
  • %~f0:settings是具有名为 settings 的ADS的批处理文件。
  • dir /r显示文件和带有ADS的文件。

重要

任何涉及写入批处理文件的想法都可能导致 在文件损坏,所以一定会建议备份 批处理文件。