Пакетный файл включает внешний файл для переменных

У меня есть пакетный файл, и я хочу включить внешний файл, содержащий некоторые переменные (например, переменные конфигурации). Возможно ли это?

Ответ 1

Примечание.. Я принимаю пакетные файлы Windows, поскольку большинство людей, похоже, не знают, что существуют значительные различия, и просто слепо называть все с серым текстом на черном фоне DOS. Тем не менее, первый вариант должен работать и в DOS.

Исполняемая конфигурация

Самый простой способ сделать это - просто поместить переменные в пакетный файл, каждый со своим собственным выражением set:

set var1=value1
set var2=value2
...

и в вашей основной партии:

call config.cmd

Конечно, это также позволяет создавать переменные условно или в зависимости от аспектов системы, поэтому она довольно разносторонняя. Однако произвольный код может работать там, и если есть синтаксическая ошибка, ваша основная партия также выйдет. В мире UNIX это кажется довольно распространенным явлением, особенно для оболочек. И если вы думаете об этом, autoexec.bat - это не что иное.

Пара ключей/значений

Другим способом может быть какая-то пара var=value в файле конфигурации:

var1=value1
var2=value2
...

Затем вы можете использовать следующий фрагмент:

for /f "delims=" %%x in (config.txt) do (set "%%x")

Это использует подобный трюк, как и раньше, а именно, используя set в каждой строке. Кавычки должны избегать таких вещей, как <, >, &, |. Тем не менее, они сами будут ломаться, когда на входе используются кавычки. Также вам всегда нужно быть осторожным при дальнейшей обработке данных в переменных, хранящихся с такими символами.

Как правило, автоматическое экранирование произвольного ввода, чтобы вызвать головные боли или проблемы в пакетных файлах, кажется мне совершенно невозможным. По крайней мере, я пока не нашел способ сделать это. Конечно, с первым решением вы подталкиваете эту ответственность к записи файла конфигурации.

Ответ 2

Если внешний файл конфигурации также является допустимым командным файлом, вы можете просто использовать:

call externalconfig.bat

внутри script. Попробуйте создать следующий файл a.bat:

@echo off
call b.bat
echo %MYVAR%

и b.bat:

set MYVAR=test

Запуск a.bat должен генерировать вывод:

test

Ответ 3

Пакет использует меньше и больше, чем скобки в качестве входных и выходных каналов.

>file.ext

Использование только одного выходного скобки, такого как выше, перезапишет всю информацию в этом файле.

>>file.ext

Использование двойной правой скобки добавит следующую строку в файл.

(
echo
echo
)<file.ext

Это будет выполнять параметры, основанные на строках файла. В этом случае мы используем две строки, которые будут набираться с использованием "echo". Левая скобка, касающаяся правой скобки скобок, означает, что информация из этого файла будет передана в эти строки.

Я собрал только файл для чтения/записи только для примера. Ниже приведен файл, разбитый на разделы, чтобы объяснить, что делает каждая часть.

@echo off
echo TEST R/W
set SRU=0

SRU может быть в этом примере. Мы фактически устанавливаем его для предотвращения сбоя, если вы нажимаете Enter слишком быстро.

set /p SRU=Skip Save? (y): 
if %SRU%==y goto read
set input=1
set input2=2
set /p input=INPUT: 
set /p input2=INPUT2: 

Теперь нам нужно записать переменные в файл.

(echo %input%)> settings.cdb
(echo %input2%)>> settings.cdb
pause

Я использую .cdb как короткую форму для "Command Database". Вы можете использовать любое расширение. Следующий раздел - проверить код с нуля. Мы не хотим использовать заданные переменные, которые были запущены в начале файла, мы действительно хотим, чтобы они загрузились из settings.cdb, который мы только что написали.

:read
(
set /p input=
set /p input2=
)<settings.cdb

Итак, мы просто передали первые две строки информации, которые вы написали в начале файла (у которого есть возможность пропустить установку строк для проверки, чтобы убедиться, что она работает) для установки переменных ввода и ввода2.

echo %input%
echo %input2%
pause
if %input%==1 goto newecho
pause
exit

:newecho
echo If you can see this, good job!
pause
exit

Отображает информацию, которая была установлена ​​при настройке параметров .cdb в скобки. В качестве дополнительного мотиватора хорошей работы, нажав enter и установив значения по умолчанию, которые мы установили ранее как "1", вы получите хорошее сообщение о работе. Использование кронштейнов идет в обоих направлениях, и это намного проще, чем установка материала "FOR".:)

Ответ 4

Значит, вам просто нужно сделать это правильно?

@echo off
echo text shizzle
echo.
echo pause^>nul (press enter)
pause>nul

REM writing to file
(
echo XD
echo LOL
)>settings.cdb
cls

REM setting the variables out of the file
(
set /p input=
set /p input2=
)<settings.cdb
cls

REM echo'ing the variables
echo variables:
echo %input%
echo %input2%
pause>nul

if %input%==XD goto newecho
DEL settings.cdb
exit

:newecho
cls
echo If you can see this, good job!
DEL settings.cdb
pause>nul
exit

Ответ 5

Пусть не забывают старые добрые параметры. При запуске файла *.bat или *.cmd вы можете добавить до девяти параметров после имени файла команды:

call myscript.bat \\path\to\my\file.ext type
call myscript.bat \\path\to\my\file.ext "Del /F"

Пример script

myscript.bat может быть примерно таким:

@Echo Off
Echo The path of this scriptfile %~0
Echo The name of this scriptfile %~n0
Echo The extension of this scriptfile %~x0
Echo.
If "%~2"=="" (
   Echo Parameter missing, quitting.
   GoTo :EOF
)
If Not Exist "%~1" (
   Echo File does not exist, quitting.
   GoTo :EOF
)
Echo Going to %~2 this file: %~1
%~2 "%~1"
If %errorlevel%  NEQ 0 (
   Echo Failed to %~2 the %~1.
)
@Echo On

Пример вывода

c:\>c:\bats\myscript.bat \\server\path\x.txt type
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat

Going to type this file: \\server\path\x.txt
This is the content of the file:
Some alphabets: ABCDEFG abcdefg
Some numbers: 1234567890

c:\>c:\bats\myscript.bat \\server\path\x.txt "del /f "
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat

Going to del /f  this file: \\server\path\x.txt

c:\>

Ответ 6

:: savevars.bat
:: Use $ to prefix any important variable to save it for future runs.

@ECHO OFF
SETLOCAL

REM Load variables
IF EXIST config.txt FOR /F "delims=" %%A IN (config.txt) DO SET "%%A"

REM Change variables
IF NOT DEFINED $RunCount (
    SET $RunCount=1
) ELSE SET /A $RunCount+=1

REM Display variables
SET $

REM Save variables
SET $>config.txt

ENDLOCAL
PAUSE
EXIT /B

Вывод:

$RunCount = 1

$RunCount = 2

$RunCount = 3

Описанный выше метод также может использоваться для обмена переменными между несколькими командами.

Источник: http://www.incodesystems.com/products/batchfi1.htm