У меня есть пакетный файл, и я хочу включить внешний файл, содержащий некоторые переменные (например, переменные конфигурации). Возможно ли это?
Пакетный файл включает внешний файл для переменных
Ответ 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