2

私は単純なバッチ ファイル ("javapath.bat") を作成して、必要なときに Java コンパイラをパスに追加して、常にパスに存在しないようにしようとしています。@call javapath.batまた、必要に応じてパスを自動的に追加できるように、他のビルド スクリプトと同様のことができるようにしたいと考えています。これらは edit-save-compile-run グラインド中に繰り返し実行されるため、javapath.bat は Java がすでにパス上にあるかどうかを確認する必要があり、そうである場合は readd しない必要があることを意味します。パス変数にばかげた重複がたくさんあるようにします。

したがって、追加する必要があるかどうかを検出するためsetlocalに、「コマンド拡張機能」を有効にして、環境変数の文字列置換を使用できるようにします。その醜さはうまく機能します。

次にendlocal、スクリプトの最後で変更を元に戻すことなく、実際に環境変数を設定できるようにします。それはうまくいきません。または、変数の変更が元に戻されるのを確実に停止しますが、それは正常ではありません。ローカルでは完全に表示されなくなりますが、その後も引き続き表示されます。

@echo off
setlocal enableextensions
if "%path:jdk1=%"=="%path%" (
    endlocal
    set ANT_HOME=C:\Program Files\Java\ant
    set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_07
    path %ANT_HOME%\bin;%path%
    path %JAVA_HOME%\bin;%path%
)

以上で、ANT_HOME と JAVA_HOME が正しく設定されました。しかし、PATH への変更は「\bin;」だけです。これは、スクリプト中に設定された変数が後で表示されるように見えるためです (したがって、ANT_HOME と JAVA_HOME は空白であり、PATH への最初の変更は忘れられます)。したがって、2 回実行するとJava がパスに追加されますが、Ant は追加されません。パスを 2 回ハードコードすることもできましたが、この動作は非常に奇妙でばかげており、1 時間もこのままでした。

編集:追加enabledelayedexpansionしても効果はありませんでした。

4

3 に答える 3

4
@echo OFF
ECHO starting   %PATH%
if "%path:jdk1=%"=="%path%" CALL :addjava
ECHO.
ECHO resulting  %PATH%
GOTO :eof

:addjava
set ANT_HOME=C:\Program Files\Java\ant
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_07
SET "path=%ANT_HOME%\bin;%JAVA_HOME%\bin;%path%"
GOTO :eof

これは私が使用するものです-他の方法は、最小解釈された閉じ括弧の問題に違反します。

この奇妙な行動を理解する鍵は歴史です。バッチは常に、%var% の解析時の値をコードに代入し、結果を検証して、有効な場合は実行しました。言語の開発に伴い、既存のバッチとの互換性を維持する必要があったため、新しいキーワードと機能を追加することしかできず、機能を削除または変更することはできませんでした。

そのため、内部サブルーチンを呼び出す機能が追加され、命令を括弧で囲んで複数行の命令を 1 行にカスケードする命令が'&'導入され、ファイルまたはファイル内でスペースやその他の区切り文字を使用する機能が導入されました。ディレクトリ名が必要だったため、バッチ言語にはいくつかの小さな癖があり始めました。iffor

!の副次句として呼び出される変数の実行時の値にアクセスするというのは、本当に奇妙な決定setlocalでしECHO on/offEXPANSION on/off。同様に、普遍的な形で日付を返すスイッチをDATE装備することもできたかもしれませんが/u、その機会を逃しました (そして、NT4 から 17 年後、5 世代後も逃し続けています...)

于 2013-05-23T04:50:35.420 に答える
3

他の人が指摘したように、かなり特別な状況を除いて、拡張機能は既に有効になっているはずです。必要なのは、SETLOCAL を削除し、IF を少し再構築して、PATH が既に設定されている場合にスクリプトを終了することだけです。

@echo off
if not "%path:jdk1=%"=="%path%" exit /b
set "ANT_HOME=C:\Program Files\Java\ant"
set "JAVA_HOME=C:\Program Files\Java\jdk1.7.0_07"
path %ANT_HOME%\bin;%path%
path %JAVA_HOME%\bin;%path%

本当に拡張機能を有効にする必要がある場合は、

@echo off
setlocal enableExtensions
if not "%path:jdk1=%"=="%path%" exit /b
endlocal
set "ANT_HOME=C:\Program Files\Java\ant"
set "JAVA_HOME=C:\Program Files\Java\jdk1.7.0_07"
path %ANT_HOME%\bin;%path%
path %JAVA_HOME%\bin;%path%

スクリプトに追加の作業がある場合は、

@echo off
setlocal enableExtensions
if not "%path:jdk1=%"=="%path%" goto :skip
endlocal
set "ANT_HOME=C:\Program Files\Java\ant"
set "JAVA_HOME=C:\Program Files\Java\jdk1.7.0_07"
path %ANT_HOME%\bin;%path%
path %JAVA_HOME%\bin;%path%

:skip
REM carry on with additional code as needed
于 2013-05-23T11:57:19.857 に答える