バッチファイルがあり、いくつかの変数(構成変数など)を含む外部ファイルを含めたいと思います。出来ますか?
8 に答える
注: 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
これは、前と同様のトリック、つまり各行で使用するだけです。<
引用符は、、、、などをエスケープするために>
あり&
ます|
。ただし、入力で引用符が使用されると、それら自体が壊れます。また、そのような文字で保存された変数のデータをさらに処理するときは、常に注意する必要があります。
一般に、任意の入力を自動的にエスケープして、バッチ ファイルで頭痛や問題が発生しないようにすることは、私にはかなり不可能に思えます。少なくとも私はまだそうする方法を見つけていません。もちろん、最初の解決策では、その責任を構成ファイルの作成者に押し付けています。
外部構成ファイルも有効なバッチ ファイルである場合は、次を使用できます。
call externalconfig.bat
スクリプト内。次の a.bat を作成してみてください:
@echo off
call b.bat
echo %MYVAR%
およびb.bat:
set MYVAR=test
a.bat を実行すると、次の出力が生成されます。
test
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" を設定するよりもはるかに簡単です。:)
だから、あなたはこれを正しくしなければなりませんか?:
@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
上記の手法は、複数のバッチ ファイル間で変数を共有するためにも使用できます。
私によると、最良のオプションは、他のスクリプト言語から読み取ることができるように、キーと値のペアをファイルすることです。
もう1つは、値ファイルにコメントのオプションを付けたいということです。これは、コマンドのeol
オプションで簡単に実現できますfor /f
。
これが例です
値ファイル:
;;;;;; file with example values ;;;;;;;;
;; Will be processed by a .bat file
;; ';' can be used for commenting a line
First_Value=value001
;;Do not let spaces arround the equal sign
;; As this makes the processing much easier
;; and reliable
Second_Value=%First_Value%_test
;;as call set will be used in reading script
;; refering another variables will be possible.
Third_Value=Something
;;; end
スクリプトの読み取り:
@echo off
:::::::::::::::::::::::::::::
set "VALUES_FILE=E:\scripts\example.values"
:::::::::::::::::::::::::::::
FOR /F "usebackq eol=; tokens=* delims=" %%# in (
"%VALUES_FILE%"
) do (
call set "%%#"
)
echo %First_Value% -- %Second_Value% -- %Third_Value%