Пакетний файл включає зовнішній файл для змінних


Відповіді:


133

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

Як правило, автоматичне уникнення довільного введення, щоб не викликати головних болів або проблем у пакетних файлах, мені здається досить неможливим. Принаймні, я ще не знайшов способу це зробити. Звичайно, з першим рішенням ви покладаєте цю відповідальність на того, хто пише конфігураційний файл.


Це у мене не спрацювало, будь ласка, перевірте: stackoverflow.com/questions/46147450/…
Нагіб Іхаб

35

Якщо зовнішній файл конфігурації також є дійсним пакетним файлом, ви можете просто використовувати:

call externalconfig.bat

всередині вашого сценарію. Спробуйте створити наступний a.bat:

@echo off
call b.bat
echo %MYVAR%

і b.bat:

set MYVAR=test

Запуск a.bat повинен генерувати вихід:

test

Це не спрацювало для мене, будь ласка, перевірте: stackoverflow.com/questions/46147450/…
Naguib Ihab

Якщо паралельно використовувати конфігураційний файл в іншому скрипті (викликаючи його call, який є синхронним btw), він говорить, що "процес не може отримати доступ до файлу, який він використовує", і його не можна викликати.
domih

2

Пакет використовує менше і більше дужок як вхідні та вихідні труби.

>file.ext

Використання лише однієї вихідної дужки, як показано вище, перезапише всю інформацію у цьому файлі.

>>file.ext

Використання подвійної правої дужки додасть наступний рядок до файлу.

(
echo
echo
)<file.ext

Це виконає параметри на основі рядків файлу. У цьому випадку ми використовуємо два рядки, які будуть набрані за допомогою "ехо". Ліва дужка, що торкається правої дужки дужки, означає, що інформація з цього файлу буде передана в ці рядки.

Я склав файл для читання / запису лише для прикладу. Нижче файл, розбитий на розділи, щоб пояснити, що робить кожна частина.

@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 як коротку форму для "База даних команд". Ви можете використовувати будь-яке розширення. Наступний розділ - тестування коду з нуля. Ми не хочемо використовувати набір змінних, які були запущені на початку файлу, ми насправді хочемо, щоб вони завантажувались із настройки.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", поверне гарне повідомлення про роботу. Використовувати кронштейн труби йде обома способами, і це набагато простіше, ніж встановити матеріал "ЗА" :)


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

0
:: 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

Якийсь старий предмет, але у мене було те саме питання кілька днів тому, і я придумав іншу ідею (можливо, хтось таки знайде це корисною)

Наприклад, ви можете зробити 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

Хороший день.


-2

Не будемо забувати старі добрі параметри. Під час запуску файлу * .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:\>

-3

Під час спроби використання методу з виправданою конфігурацією я помітив, що він може працювати або НЕ працювати, залежно від того, де в сценарії знаходиться виклик:

виклик config.cmd

Я знаю, що це не має сенсу, але для мене це факт. Коли "call config.cmd" розташований у верхній частині сценарію, він працює, але якщо далі у сценарії, він не працює.

Під не працює, я маю на увазі змінну не встановити під викликом сценарію.

Дуже дуже дивно !!!!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.