回答:
注意:ほとんどの人は大きな違いがあることに気づかず、黒い背景の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
します。つまり、各行でのみ使用します。引用符のようなものを逃れるためにあります<
、>
、&
、|
。ただし、入力で引用符が使用されている場合は、それら自体が壊れます。また、そのような文字が格納されている変数のデータをさらに処理するときは、常に注意が必要です。
一般に、バッチファイルで頭痛や問題を引き起こさないように任意の入力を自動的にエスケープすることは、私にはかなり不可能に思われます。少なくとも私はその方法をまだ見つけていませんでした。もちろん、最初のソリューションでは、構成ファイルを書き込むソリューションにその責任を押し付けています。
外部構成ファイルも有効なバッチファイルである場合は、次のように使用できます。
call externalconfig.bat
スクリプト内。次のa.batを作成してみてください。
@echo off
call b.bat
echo %MYVAR%
およびb.bat:
set MYVAR=test
a.batを実行すると、出力が生成されます。
test
call
btw同期ので呼び出す)、「ファイルが使用されているため、プロセスはファイルにアクセスできません」と表示され、呼び出すことができません。
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
上記の手法は、複数のバッチファイル間で変数を共有するためにも使用できます。
ちょっと古い主題ですが、数日前に同じ質問があり、別のアイデアを思いつきました(多分誰かがまだそれを便利だと思うでしょう)
たとえば、異なるサブジェクト(家族、サイズ、色、動物)を含む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
良い一日。
古き良きパラメータを忘れないようにしましょう。* .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:\>