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


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

7 77

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

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

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

давайте не будем забывать старые добрые параметры. При запуске *.летучая мышь или.* 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 вызов скрипт.

очень-очень странно !!!!