バッチファイルに変数の外部ファイルを含める


回答:


131

注意:ほとんどの人は大きな違いがあることに気づかず、黒い背景のDOSで灰色のテキストですべてを盲目的に呼び出すだけなので、Windowsバッチファイルを想定しています。それでも、最初のバリアントは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/...
ナギーブIhab

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/...
ナギーブIhab

別のスクリプトで設定ファイルを並行して使用している場合(callbtw同期ので呼び出す)、「ファイルが使用されているため、プロセスはファイルにアクセスできません」と表示され、呼び出すことができません。
domih

2

Batchは、入力パイプと出力パイプとして、小なり記号と大なり記号を使用しています。

>file.ext

上記のように出力ブラケットを1つだけ使用すると、そのファイル内のすべての情報が上書きされます。

>>file.ext

二重の右括弧を使用すると、ファイルに次の行が追加されます。

(
echo
echo
)<file.ext

これにより、ファイルの行に基づいてパラメーターが実行されます。この例では、「echo」を使用して入力する2つの行を使用しています。左括弧が右括弧括弧に接していることは、そのファイルからの情報がそれらの行にパイプされることを意味します。

例のみの読み取り/書き込みファイルをコンパイルしました。以下は、各部分の機能を説明するセクションに分割されたファイルです。

@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を使用しています。任意の拡張子を使用できます。次のセクションでは、コードを最初からテストします。ファイルの先頭で実行されたset変数を使用したくありません。実際には、先ほど書いたばかりのsettings.cdbからそれらをロードする必要があります。

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

そのため、ファイルの先頭に書き込んだ最初の2行の情報(パイプラインが機能しているかどうかを確認するための設定をスキップするオプションがあります)をパイプ処理して、inputとinput2の変数を設定しました。

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

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

これは、settings.cdbが括弧にパイプされている間に設定された情報を表示します。追加の良い仕事の動機として、Enterキーを押して、前に設定したデフォルト値を「1」に設定すると、良い仕事のメッセージが返されます。ブラケットパイプを使用することは両方の方法で可能であり、 "FOR"を設定するよりもはるかに簡単です。:)


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ファイルを開始するとき、コマンドファイル名の後に最大9つのパラメーターを追加できます。

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」がスクリプトの上部にある場合は機能しますが、スクリプトのさらに先にある場合は機能しません。

機能しません。つまり、変数は呼び出し元のスクリプトで設定されていません。

非常に奇妙です!!!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.