Есть ли способ создать постоянную переменную в пакетном файле, записав самому себе? - PullRequest
1 голос
/ 07 марта 2019

Я написал командный файл, который я использую для управления файлами. Пакетный файл анализирует базу данных .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 голосов
/ 07 марта 2019
@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 - пакетный файл с ADS с именем settings .
  • dir /r отображает файлы и файлы с ADS.

Важно

Любая идея, связанная с записью в пакетный файл, может привести к в повреждении файла, так что, безусловно, посоветуете резервную копию пакетный файл.

0 голосов
/ 07 марта 2019

Существует один способ сохранения переменных в файле bat, но вам необходимо заменить : END на : EOF

: EOF хорошо объяснил в этой ссылке .: |:. см. Куда GOTO: EOF возвращается?

Кроме того, эта работа в файловой системе fat32 / ntfs !

Вы можете записывать переменные в свой файл bat и читать при необходимости:

Obs.: Извините, мой ограниченный Английский

@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 |:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...