我写了一个用于文件管理的批处理文件。批处理文件解析.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
我希望有一个更优雅的解决方案,该解决方案不需要单独的批处理文件,并允许我将变量数据存储在主批处理文件本身中。有什么想法吗?
答案 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的文件。重要:
任何涉及写入批处理文件的想法都可能导致 在文件损坏,所以一定会建议备份 批处理文件。