104

バッチファイルがあり、いくつかの変数(構成変数など)を含む外部ファイルを含めたいと思います。出来ますか?

4

8 に答える 8

143

注: 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これは、前と同様のトリック、つまり各行で使用するだけです。<引用符は、、、、などをエスケープするために>あり&ます|。ただし、入力で引用符が使用されると、それら自体が壊れます。また、そのような文字で保存された変数のデータをさらに処理するときは、常に注意する必要があります。

一般に、任意の入力を自動的にエスケープして、バッチ ファイルで頭痛や問題が発生しないようにすることは、私にはかなり不可能に思えます。少なくとも私はまだそうする方法を見つけていません。もちろん、最初の解決策では、その責任を構成ファイルの作成者に押し付けています。

于 2010-05-04T08:47:23.117 に答える
35

外部構成ファイルも有効なバッチ ファイルである場合は、次を使用できます。

call externalconfig.bat

スクリプト内。次の a.bat を作成してみてください:

@echo off
call b.bat
echo %MYVAR%

およびb.bat:

set MYVAR=test

a.bat を実行すると、次の出力が生成されます。

test
于 2010-05-04T08:48:48.903 に答える
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" を設定するよりもはるかに簡単です。:)

于 2013-07-23T20:29:51.603 に答える
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
于 2013-09-27T16:04:43.017 に答える
1
:: 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

于 2014-11-25T05:26:45.157 に答える
0

私によると、最良のオプションは、他のスクリプト言語から読み取ることができるように、キーと値のペアをファイルすることです。

もう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%
于 2020-11-09T23:29:05.417 に答える