Il file batch include un file esterno per le variabili


Risposte:


133

Nota: presumo i file batch di Windows poiché la maggior parte delle persone sembra non essere consapevole delle differenze significative e chiama ciecamente tutto con testo grigio su sfondo nero DOS. Tuttavia, la prima variante dovrebbe funzionare anche in DOS.

Configurazione eseguibile

Il modo più semplice per farlo è inserire le variabili stesse in un file batch, ciascuna con la propria setistruzione:

set var1=value1
set var2=value2
...

e nel tuo batch principale:

call config.cmd

Ovviamente, ciò consente anche di creare variabili in modo condizionale o in base ad aspetti del sistema, quindi è piuttosto versatile. Tuttavia, il codice arbitrario può essere eseguito lì e se si verifica un errore di sintassi, anche il batch principale verrà chiuso. Nel mondo UNIX questo sembra essere abbastanza comune, specialmente per le shell. E se ci pensi, autoexec.batnon è altro.

Coppie chiave / valore

Un altro modo potrebbe essere un qualche tipo di var=valuecoppia nel file di configurazione:

var1=value1
var2=value2
...

È quindi possibile utilizzare il seguente frammento per caricarli:

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

Questo utilizza un trucco simile a prima, vale a dire solo usando setsu ogni riga. Le citazioni sono lì per sfuggire le cose come <, >, &, |. Tuttavia, si interromperanno a loro volta quando le virgolette vengono utilizzate nell'input. Inoltre, è sempre necessario fare attenzione durante l'ulteriore elaborazione dei dati in variabili memorizzate con tali caratteri.

In generale, sfuggire automaticamente a input arbitrari per non causare mal di testa o problemi nei file batch mi sembra piuttosto impossibile. Almeno non ho ancora trovato un modo per farlo. Ovviamente, con la prima soluzione stai spingendo quella responsabilità a chi scrive il file di configurazione.


Non ha funzionato per me, puoi controllare: stackoverflow.com/questions/46147450/…
Naguib Ihab,

35

Se il file di configurazione esterno è anche un file batch valido, puoi semplicemente usare:

call externalconfig.bat

all'interno del tuo copione. Prova a creare il seguente a.bat:

@echo off
call b.bat
echo %MYVAR%

e b. pipistrello:

set MYVAR=test

L'esecuzione di a.bat dovrebbe generare l'output:

test

Non ha funzionato per me, puoi controllare: stackoverflow.com/questions/46147450/…
Naguib Ihab

Se si utilizza il file di configurazione in un altro script in parallelo (chiamandolo con call, che è sincrono), si dice "il processo non può accedere al file perché è in uso" e non può essere invocato.
domih

2

Batch utilizza parentesi minore e maggiore come pipe di input e output.

>file.ext

L'uso di una sola parentesi di output come sopra sovrascriverà tutte le informazioni in quel file.

>>file.ext

L'utilizzo della doppia parentesi quadra destra aggiungerà la riga successiva al file.

(
echo
echo
)<file.ext

Questo eseguirà i parametri in base alle righe del file. In questo caso, stiamo usando due righe che verranno digitate usando "echo". La parentesi sinistra che tocca la parentesi destra significa che le informazioni da quel file verranno convogliate in quelle righe.

Ho compilato un file di lettura / scrittura di solo esempio. Di seguito è riportato il file suddiviso in sezioni per spiegare cosa fa ciascuna parte.

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

SRU può essere qualsiasi cosa in questo esempio. In realtà lo stiamo impostando per evitare un arresto anomalo se premi Invio troppo velocemente.

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: 

Ora, dobbiamo scrivere le variabili su un file.

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

Uso .cdb come forma abbreviata per "Database dei comandi". Puoi usare qualsiasi estensione. La sezione successiva consiste nel testare il codice da zero. Non vogliamo utilizzare le variabili di set che sono state eseguite all'inizio del file, in realtà vogliamo che vengano caricate DAL file settings.cdb che abbiamo appena scritto.

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

Quindi, abbiamo semplicemente trasferito le prime due righe di informazioni che hai scritto all'inizio del file (che hai la possibilità di saltare impostando le righe per verificare che funzioni) per impostare le variabili di input e input2.

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

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

Questo mostra le informazioni che erano state impostate mentre settings.cdb veniva reindirizzato tra parentesi. Come ulteriore motivazione per un buon lavoro, premendo Invio e impostando i valori predefiniti che abbiamo impostato in precedenza come "1", verrà restituito un buon messaggio di lavoro. L'uso dei tubi della staffa va in entrambe le direzioni ed è molto più facile che impostare le cose "FOR". :)


1

Quindi devi solo farlo bene ?:

@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

Produzione:

$ RunCount = 1

$ RunCount = 2

$ RunCount = 3

La tecnica descritta sopra può essere utilizzata anche per condividere variabili tra più file batch.

Fonte: http://www.incodesystems.com/products/batchfi1.htm


0

Un argomento un po 'vecchio ma ho avuto la stessa domanda qualche giorno fa e mi è venuta un'altra idea (forse qualcuno la troverà ancora utile)

Ad esempio, puoi creare un config.bat con soggetti diversi (famiglia, taglia, colore, animali) e applicarli individualmente in qualsiasi ordine ovunque tu voglia nei tuoi script batch:

@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

Dopodiché, puoi usarlo ovunque chiamando completamente con 'call config.bat all' o chiamando solo parti di esso (vedi l'esempio sotto) L'idea qui è che a volte è più utile quando hai la possibilità di non chiamare tutto a una volta. Alcune variabili potrebbero non essere ancora chiamate in modo da poterle richiamare in seguito.

Esempio 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

Spero che aiuti il ​​modo in cui gli altri mi aiutano qui con le loro risposte.

Una versione breve di quanto sopra:

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

Buona giornata.


-2

Non dimentichiamo i buoni vecchi parametri. Quando si avvia il file * .bat o * .cmd è possibile aggiungere fino a nove parametri dopo il nome del file di comando:

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

Script di esempio

Il myscript.bat potrebbe essere qualcosa del genere:

@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

Output di esempio

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

Durante il tentativo di utilizzare il metodo con la configurazione eseguibile, ho notato che potrebbe funzionare o NON funzionare a seconda di dove si trova la chiamata nello script:

chiama config.cmd

So che non ha alcun senso, ma per me è un dato di fatto. Quando "call config.cmd" si trova all'inizio dello script, funziona, ma se più avanti nello script non funziona.

Con non funziona, intendo che le variabili non sono impostate nello script chiamante.

Molto molto strano !!!!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.