以下は私のバッチファイルからのコードです:
@echo off & setlocal
set ver1="doc pic\ABC\"
set ver2="C:\Users\elmo\Desktop\error4.png"
E:
cd %ver1%
copy %ver2%
問題は、プログラムからこれらの変数を更新する方法がないことです。私がそうすることができるトリックはありますか?
以下は私のバッチファイルからのコードです:
@echo off & setlocal
set ver1="doc pic\ABC\"
set ver2="C:\Users\elmo\Desktop\error4.png"
E:
cd %ver1%
copy %ver2%
問題は、プログラムからこれらの変数を更新する方法がないことです。私がそうすることができるトリックはありますか?
このオプションを使用するset /P
と、プロンプトの結果になるように変数を設定できます。
set /P ver1=Enter path:
これにより、ユーザーは変数を入力できるようになります。具体的には、ユーザーにプロンプトが表示されます
Enter path:
その後、入力した内容はすべてver1に配置されます。
この例では、ユーザーはスペースを入れて何かを入力することに注意してください。%ver1
スピーチマークを付ける方が安全なので、そうでした"%ver1"
。
外部ファイルからロードするには、を試してくださいset /P ver1= <file.txt
。ファイルがで存在するかどうかを確認することをお勧めしますif exist file.txt (set /P ver1= <file.txt)
ユーザーが編集する前にファイルを変更できるようにする場合は、事前に呼び出して、pause
必要なテキストファイルを変更するようにユーザーに促します。
たとえば、ユーザーが最初にパスを変更できるように、どのパスが設定されているかをユーザーに確認してもらいたい場合は、次のことを試してください...
@echo off
echo "Destination path (ver1.txt): " <ver1.txt
echo "Source path (ver2.txt): " <ver2.txt
echo "Please change the values in the text files as required."
pause
set /P ver1= <ver1.txt
set /P ver2= <ver2.txt
実際にこういうことをしてから久しぶりなので、チェックする必要があるかもしれませんが、うまくいくと思います。
プロセスの環境変数は、親プロセスからのプロセス開始時に入力されます。その後、実行中のプロセスで変数を変更または追加することはできません。
したがって、バッチファイルがあり、そこから別のプログラムを実行してから、そのプログラムからバッチファイルの環境変数を変更しようとすると、それは不可能です。
逆の方法、つまり別のプログラムからバッチファイルを開始する場合は、プログラムで最初にバッチファイルを設定することにより、バッチファイルの環境変数に影響を与えることができます。
編集:あなたが言ったように、あなたはあなたが必要とする情報を含むテキストファイルを持っています。最も簡単な方法は、そのテキストファイルが別のバッチファイルのように見える場合です。例:
set ver1=foo
set ver2=bar
その場合、あなたはそれを単に「含める」ことができます
call foobar.cmd
代わりに次のようになっている場合:
ver1=foo
ver2=bar
で解析し、各行に対してコマンドをfor /f
実行するだけで、同様に機能させることができます。set
for /f "delims=" %%L in (foobar.txt) do set "%%L"
このように見える場合:
foo
bar
次に、もう少し作業が必要です(最初の行がver1
2番目の行であることを暗黙的に知っているためver2
):
for /f "delims=" %%L in (foobar.txt) do (
if not defined ver1 (
set "ver1=%%L"
) else if not defined ver2 (
set "ver2=%%L"
)
)
現在、これは、そのテキストファイルを解析する前に定義されていない場合ver1
に機能します。ver2
単に値を更新する必要がある場合は、混乱します。
for /f "delims=" %%L in (foobar.txt) do (
if not defined ver1updated (
set "ver1=%%L"
set ver1updated=1
) else if not defined ver2updated (
set "ver2=%%L"
set ver2updated=1
)
)
set ver1updated=
set ver2updated=
特定のケースでは、ファイルを変数に読み込む方法が2つあり、複数行の処理方法が異なることを利用できます。
set /p ver1=<foobar.txt
for /f "delims=" %%L in (foobar.txt) do set ver2=%%L
最初の方法ではファイルの最初の行だけが保存され、2番目の方法ではファイル内のすべての行の変数が更新され、最後のver2
行の値が残ります。最初は2行しかないので、それを区切るオプションもあります。しかし、バッチファイルを作成するとき、私は通常、イディオムを混ぜたり、少なくとも説明するコメントを提供したりしないようにしています。
ご覧のとおり、少し複雑になる可能性があります。一般に、このような質問の場合は、生成できる形式(制限がある場合)または入力形式と出力形式(質問を編集することもできます:-))を正確に指定すると役立ちます。