Пакетный файл включает внешний файл для переменных - PullRequest
85 голосов
/ 04 мая 2010

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

Ответы [ 8 ]

112 голосов
/ 04 мая 2010

Примечание: Я предполагаю, что пакетные файлы 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 в каждой строке. Кавычки существуют, чтобы избежать таких вещей, как <, >, &, |. Однако они сами сломаются, когда во входных данных используются кавычки. Также вам всегда нужно соблюдать осторожность при дальнейшей обработке данных в переменных, хранящихся с такими символами.

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

29 голосов
/ 04 мая 2010

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

call externalconfig.bat

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

@echo off
call b.bat
echo %MYVAR%

и b.bat:

set MYVAR=test

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

test
2 голосов
/ 24 июля 2013

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

>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 в качестве краткой формы для «База данных команд». Вы можете использовать любое расширение. Следующий раздел - тестирование кода с нуля. Мы не хотим использовать переменные набора, которые были запущены в начале файла, мы на самом деле хотим, чтобы они загружали из файла settings.cdb, который мы только что написали.

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

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

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

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

Отображает информацию, которая была установлена, когда settings.cdb был передан в скобки. Как дополнительный мотиватор хорошей работы, нажатие клавиши ввода и установка значений по умолчанию, которые мы установили ранее как «1», вернет хорошее сообщение о работе. Использование труб с кронштейнами происходит в обе стороны, и это намного проще, чем настройка «ЗА». :)

1 голос
/ 27 сентября 2013

Так ты просто должен сделать это правильно?:

@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
0 голосов
/ 16 февраля 2019

Какая-то старая тема, но у меня был тот же вопрос несколько дней назад, и у меня появилась другая идея (возможно, кто-то все равно найдет ее полезной)

Например, вы можете создать config.bat с различными предметами (семья, размер, цвет, животные) и применять их индивидуально в любом порядке в любом месте в ваших пакетных скриптах:

@echo off
rem Empty the variable to be ready for label config_all
set config_all_selected=

rem Go to the label with the parameter you selected
goto :config_%1

REM This next line is just to go to end of file 
REM in case that the parameter %1 is not set
goto :end

REM next label is to jump here and get all variables to be set
:config_all
set config_all_selected=1


:config_family
set mother=Mary
set father=John
set sister=Anna
rem This next line is to skip going to end if config_all label was selected as parameter
if not "%config_all_selected%"=="1" goto :end

:config_test
set "test_parameter_all=2nd set: The 'all' parameter WAS used before this echo"
if not "%config_all_selected%"=="1" goto :end

:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end


:config_color
set first_color=blue
set second_color=green
if not "%config_all_selected%"=="1" goto :end


:config_animals
set dog=Max
set cat=Miau
if not "%config_all_selected%"=="1" goto :end


:end

После этого вы можете использовать его где угодно, полностью вызывая 'call config.bat all' или вызывая только его части (см. Пример ниже) Идея здесь в том, что иногда удобнее, когда у вас есть возможность не вызывать все сразу. Некоторые переменные, возможно, вы еще не хотите вызывать, поэтому вы можете вызвать их позже.

Пример test.bat

@echo off

rem This is added just to test the all parameter
set "test_parameter_all=1st set: The 'all' parameter was NOT used before this echo"

call config.bat size

echo My birthday present had a width of %width% and a height of %height%

call config.bat family
call config.bat animals

echo Yesterday %father% and %mother% surprised %sister% with a cat named %cat%
echo Her brother wanted the dog %dog%

rem This shows you if the 'all' parameter was or not used (just for testing)
echo %test_parameter_all%

call config.bat color

echo His lucky color is %first_color% even if %second_color% is also nice.

echo.
pause

Надеюсь, это поможет другим людям помочь мне с их ответами.

Краткая версия выше:

config.bat

@echo off
set config_all_selected=
goto :config_%1
goto :end

:config_all
set config_all_selected=1

:config_family
set mother=Mary
set father=John
set daughter=Anna
if not "%config_all_selected%"=="1" goto :end

:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end

:end

test.bat

@echo off

call config.bat size
echo My birthday present had a width of %width% and a height of %height%

call config.bat family
echo %father% and %mother% have a daughter named %daughter%

echo.
pause

Добрый день.

0 голосов
/ 26 мая 2018

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

вызов config.cmd

Я знаю, что это не имеет никакого смысла, но для меня это факт. Когда «вызов config.cmd» находится в верхней части сценарий, он работает, но если дальше в сценарии это не так.

Под не работает, я имею в виду, что переменная не установлена ​​в вызывающем скрипте.

Очень, очень странно !!!!

0 голосов
/ 25 ноября 2014
:: 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

0 голосов
/ 27 апреля 2012

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

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

Пример сценария

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