Пакетный файл включает внешний файл для переменных
У меня есть пакетный файл, и я хочу включить внешний файл, содержащий некоторые переменные (скажем, переменные конфигурации). Возможно ли это?
7 ответов:
Примечание: я предполагаю, что пакетные файлы Windows, как большинство людей, кажется, не знают, что есть значительные различия и просто слепо называют все с серым текстом на черном фоне DOS. Тем не менее, первый вариант должен работать и в DOS.
исполняемый файл конфигурации
самый простой способ сделать это, чтобы просто поставить переменные в пакетный файл сами, каждый со своим собственным
set
о себе:set var1=value1 set var2=value2 ...
и в ваша основная партия:
call config.cmd
конечно, это также позволяет создавать переменные условно или в зависимости от аспектов системы, поэтому она довольно универсальна. Однако там может выполняться произвольный код, и если есть синтаксическая ошибка, то ваш основной пакет тоже выйдет. В мире UNIX это, кажется, довольно распространено, особенно для оболочек. И если вы думаете об этом!--5--> ничего другого.
пар ключ/значение
другой способ был бы какой-то
var=value
пары в конфигурационном файле:var1=value1 var2=value2 ...
затем вы можете использовать следующий фрагмент кода, чтобы загрузить их:
for /f "delims=" %%x in (config.txt) do (set "%%x")
это использует аналогичный трюк, как и раньше, а именно просто с помощью
set
на каждой строке. Кавычки есть, чтобы избежать таких вещей, как<
,>
,&
,|
. Однако они сами будут ломаться, когда кавычки используются во входных данных. Также вы всегда должны быть осторожны при дальнейшей обработке данных в переменные с такими письмена.как правило, автоматический выход из произвольного ввода, чтобы не вызывать головных болей или проблем в пакетных файлах, кажется мне довольно невозможным. По крайней мере я не нашел способ сделать это. Конечно, с первым решением вы подталкиваете эту ответственность к тому, кто пишет файл конфигурации.
если внешний файл конфигурации также является допустимым пакетным файлом, вы можете просто использовать:
call externalconfig.bat
внутри вашего скрипта. Попробуйте создать следующий файл. bat:
@echo off call b.bat echo %MYVAR%
и b. bat:
set MYVAR=test
запуск. bat должен генерировать вывод:
test
пакет использует меньше и больше, чем скобки в качестве входных и выходных труб.
>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
я использую .ЦКБ как короткие форма для "базы данных команд". Вы можете использовать любое расширение. Следующий раздел посвящен тестированию кода с нуля. Мы не хотим использовать переменные set, которые были запущены в начале файла, мы действительно хотим, чтобы они загружались из настроек.гду мы только что написали.
: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", вернет хорошее сообщение о работе. Использование кронштейна трубы идет в обе стороны, и это гораздо проще, чем установка "для" вещи. :)
Так что вы просто должны сделать это правильно?:
@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
:: 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
метод, описанный выше, также может быть использован для совместного использования переменных между несколькими пакетными файлами.
давайте не будем забывать старые добрые параметры. При запуске *.летучая мышь или.* cmd-файл после имени командного файла можно добавить до девяти параметров:
call myscript.bat \path\to\my\file.ext type call myscript.bat \path\to\my\file.ext "Del /F"
пример скрипта
myscript.летучая мышь может быть что-то вроде этого:
@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:\>
при попытке использовать метод с изменяемой конфигурацией Я заметил, что это может работать или не работать в зависимости от того, где в скрипте находится вызов:
вызов настройки.cmd
Я знаю, что это не имеет смысла, но для меня это факт. Когда " вызов конфигурации.cmd " находится в верхней части скрипт, он работает, но если дальше в скрипте его нет.
By не работает, я имею в виду, что переменная не установлена un вызов скрипт.
очень-очень странно !!!!