Plik wsadowy zawiera zewnętrzny plik dla zmiennych

Odpowiedzi:

133

Uwaga: Zakładam pliki wsadowe systemu Windows, ponieważ większość ludzi wydaje się nie zdawać sobie sprawy, że istnieją znaczące różnice i po prostu ślepo wywołuje wszystko z szarym tekstem na czarnym tle DOS. Niemniej jednak pierwszy wariant powinien działać również w DOS.

Konfiguracja wykonywalna

Najłatwiejszym sposobem jest po prostu umieszczenie zmiennych w pliku wsadowym, z których każda ma własną setinstrukcję:

set var1=value1
set var2=value2
...

aw głównej partii:

call config.cmd

Oczywiście umożliwia to również tworzenie zmiennych warunkowo lub w zależności od aspektów systemu, więc jest dość wszechstronny. Jednak może tam działać dowolny kod i jeśli wystąpi błąd składni, główna partia również zostanie zakończona. W świecie UNIX wydaje się to być dość powszechne, szczególnie w przypadku powłok. A jeśli się nad tym zastanowić, autoexec.batto nic innego.

Pary klucz / wartość

Innym sposobem byłyby jakieś var=valuepary w pliku konfiguracyjnym:

var1=value1
var2=value2
...

Następnie możesz użyć następującego fragmentu kodu, aby je załadować:

for /f "delims=" %%x in (config.txt) do (set "%%x")

Wykorzystuje to podobną sztuczkę jak poprzednio, a mianowicie po prostu używając setw każdej linii. Cytaty są tam, aby uciec rzeczy jak <, >, &, |. Jednak same pękną, gdy w danych wejściowych zostaną użyte cudzysłowy. Zawsze też musisz zachować ostrożność podczas dalszego przetwarzania danych w zmiennych przechowywanych z takimi znakami.

Ogólnie rzecz biorąc, automatyczne unikanie dowolnych danych wejściowych, aby nie powodować bólu głowy lub problemów w plikach wsadowych, wydaje mi się prawie niemożliwe. Przynajmniej nie znalazłem jeszcze sposobu, aby to zrobić. Oczywiście przy pierwszym rozwiązaniu przenosisz tę odpowiedzialność na osobę piszącą plik konfiguracyjny.

Joey
źródło
To nie zadziałało dla mnie, czy możesz sprawdzić: stackoverflow.com/questions/46147450/…
Naguib Ihab
35

Jeśli zewnętrzny plik konfiguracyjny jest również prawidłowym plikiem wsadowym, możesz po prostu użyć:

call externalconfig.bat

wewnątrz skryptu. Spróbuj utworzyć następujący a.bat:

@echo off
call b.bat
echo %MYVAR%

i b.bat:

set MYVAR=test

Uruchomienie a.bat powinno wygenerować wynik:

test
chalup
źródło
To nie zadziałało dla mnie, czy możesz sprawdzić: stackoverflow.com/questions/46147450/…
Naguib Ihab
Jeśli równolegle używasz pliku konfiguracyjnego w innym skrypcie (wywołanie go z call, co jest btw synchroniczne), mówi "proces nie może uzyskać dostępu do pliku, ponieważ jest używany" i nie można go wywołać.
domih
2

Batch używa nawiasów mniejszych niż i większych jako rur wejściowych i wyjściowych.

>file.ext

Użycie tylko jednego nawiasu wyjściowego, jak powyżej, spowoduje nadpisanie wszystkich informacji w tym pliku.

>>file.ext

Użycie podwójnego prawego nawiasu spowoduje dodanie następnej linii do pliku.

(
echo
echo
)<file.ext

Spowoduje to wykonanie parametrów na podstawie wierszy pliku. W tym przypadku używamy dwóch wierszy, które będą wpisywane przy użyciu „echo”. Lewy nawias dotykający prawego nawiasu oznacza, że ​​informacje z tego pliku zostaną przesłane potokiem do tych wierszy.

Skompilowałem przykładowy plik do odczytu / zapisu. Poniżej znajduje się plik podzielony na sekcje, aby wyjaśnić, co robi każda część.

@echo off
echo TEST R/W
set SRU=0

W tym przykładzie SRU może być czymkolwiek. W rzeczywistości ustawiamy go, aby zapobiec awarii, jeśli naciśniesz Enter zbyt szybko.

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: 

Teraz musimy zapisać zmienne do pliku.

(echo %input%)> settings.cdb
(echo %input2%)>> settings.cdb
pause

Używam .cdb jako skróconej formy dla „Bazy poleceń”. Możesz użyć dowolnego rozszerzenia. Następna sekcja to przetestowanie kodu od zera. Nie chcemy używać ustawionych zmiennych, które zostały uruchomione na początku pliku, w rzeczywistości chcemy, aby ładowały się Z pliku settings.cdb, który właśnie napisaliśmy.

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

Więc po prostu wypisaliśmy pierwsze dwa wiersze informacji, które napisałeś na początku pliku (które możesz pominąć ustawiając wiersze, aby sprawdzić, czy działa), aby ustawić zmienne input i input2.

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

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

Spowoduje to wyświetlenie informacji, które zostały ustawione podczas przesyłania pliku settings.cdb do nawiasów. Jako dodatkowy czynnik motywujący do dobrej pracy, naciśnięcie klawisza Enter i ustawienie wartości domyślnych, które wcześniej ustawiliśmy jako „1”, zwróci komunikat dotyczący dobrej pracy. Używanie rur wspornikowych działa w obie strony i jest znacznie łatwiejsze niż ustawienie opcji „FOR”. :)

Sev3nClouds
źródło
1

Więc musisz to zrobić dobrze ?:

@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
Naprawiacz
źródło
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

Wynik:

$ RunCount = 1

$ RunCount = 2

$ RunCount = 3

Technika opisana powyżej może być również używana do udostępniania zmiennych w wielu plikach wsadowych.

Źródło: http://www.incodesystems.com/products/batchfi1.htm

Amr Ali
źródło
0

Niby stary temat, ale kilka dni temu miałem to samo pytanie i wpadłem na inny pomysł (może komuś się jeszcze przyda)

Na przykład możesz utworzyć plik config.bat z różnymi tematami (rodzina, rozmiar, kolor, zwierzęta) i zastosować je indywidualnie w dowolnej kolejności w swoich skryptach wsadowych:

@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

Następnie możesz go używać w dowolnym miejscu, wywołując w pełni za pomocą polecenia „call config.bat all” lub wywołując tylko jego części (patrz przykład poniżej). pewnego razu. Niektóre zmienne być może jeszcze nie chcesz, aby były wywoływane, więc możesz je później wywołać.

Przykład 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

Mam nadzieję, że pomoże to sposób, w jaki inni pomagają mi tutaj, udzielając odpowiedzi.

Krótka wersja powyższego:

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

Dobry dzień.

Sygmond
źródło
-2

Nie zapominajmy o starych dobrych parametrach. Podczas uruchamiania pliku * .bat lub * .cmd możesz dodać do dziewięciu parametrów po nazwie pliku poleceń:

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

Przykładowy skrypt

Plik myscript.bat mógłby wyglądać mniej więcej tak:

@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

Przykładowe dane wyjściowe

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:\>
Ciove
źródło
-3

Próbując użyć metody z możliwą do wykonania konfiguracją zauważyłem, że może ona działać lub NIE działać w zależności od tego, gdzie w skrypcie znajduje się wywołanie:

zadzwoń do config.cmd

Wiem, że to nie ma sensu, ale dla mnie to fakt. Kiedy „call config.cmd” znajduje się na górze skryptu, działa, ale jeśli dalej w skrypcie nie działa.

Mówiąc nie działa, mam na myśli zmienne nie są ustawione w skrypcie wywołującym.

Bardzo, bardzo dziwne !!!!

phil dziesięć
źródło