0

環境変数が設定されているかどうかを基本的にチェックしてから設定しようとする、非常に単純なバッチファイルがあります。変数が正しく設定されていません。また、私は一般的にバッチファイルにかなり慣れていないため、作成中のスクリプトについていくつかの一般的な質問がありました。任意の洞察をいただければ幸いです。ここに私が持っている質問があります。

  1. 15 行目で、ディレクトリの完全な名前がわからない場合はどうすればよいですか? つまり、「ホイッスル」がその一部であることを知っていて、それが DIR に == であるかどうかを確認したい場合はどうなりますか?
  2. 16 行目と 19 行目で、'whistle-1.0.0' にいる場合、BELFRAMEWORK_HOME 変数をその 1 つ上のディレクトリに設定する必要があることを伝えようとしています。「%DIR%..\」でこれを実行しようとしましたが、効果がないようです。BELFRAMEWORK_HOME を 'whistle-1.0.0' の上の 1 つのディレクトリに設定するにはどうすればよいですか?
  3. 17 行目と 20 行目では、BELFRAMEWORK_HOME 変数が出力されていません。10 行目と 12 行目と同じ形式で、期待どおりに変数をエコーするため、その理由がわかりません。BELFRAMEWORK_HOME がエコーしないのはなぜですか?
  4. 最後に、この種のスクリプトについて詳しく学ぶための優れたオンライン リソースはありますか?

ありがとう!

1@echo off
2
3if not defined JAVA_OPTS (
4    set JAVA_OPTS=-Xmx1024m -Dderby.stream.error.field=org.openbel.framework.common.enums.DatabaseType.NULL_OUTPUT_STREAM
5) else (
6    set JAVA_OPTS=%JAVA_OPTS% -Dderby.stream.error.field=org.openbel.framework.common.enums.DatabaseType.NULL_OUTPUT_STREAM
7)
8
9set DIR=%CD%
10echo "DIR/CD : %DIR%"
11set DIR=%~dp0
12echo "DIR/~dp0 : %DIR%"
13
14if not defined BELFRAMEWORK_HOME (
15  if "%DIR%"=="whistle-1.0.0" (
16      set BELFRAMEWORK_HOME=%DIR%\..\
17      echo "DIR == whistle, BELFRAMEWORK_HOME is now: %BELFRAMEWORK_HOME%"
18  ) else (
19      set BELFRAMEWORK_HOME=%DIR%\..\
20      echo "DIR != whistle, BELFRAMEWORK_HOME is now: %BELFRAMEWORK_HOME%"
21    )
22)
23
24set WHISTLE_HOME=%~dp0
25java %JAVA_OPTS% -jar %WHISTLE_HOME%\whistle-1.0.0.jar %*
4

1 に答える 1

2

ああ、1つの価格で4つの質問:-)

1)のようなものが必要だと思いますがC:\folder\xxxxWHISTLExxxx\、 のようなものは必要ありませんC:\xxxxWHISTLExxxx\folder\。その場合、正規表現で FINDSTR を使用して、最後のディレクトリが WHISTLE と一致することを確認します。検索では大文字と小文字を区別しない必要があります。

FINDSTR 出力は必要ありません。文字列が見つかったかどうかを知りたいだけです。見つからない場合 (エラー) は 1 を返し、見つかった場合 (成功) は 0 を返します。

echo %DIR% | findstr /irc:"whistle[^\\]*[\\]*$" >nul && (
  rem Code for success (string found)
)
  rem Code for failure (string not found)
)

2)末尾のバックスラッシュが必要な場合は、次を使用できます

for %%A in ("%DIR%\.") do set "BELFRAMEWORK_HOME=%%~dpA"

末尾のバックスラッシュが必要ない場合は、次を使用します

for %%A in ("%DIR%\..") do set "BELFRAMEWORK_HOME=%%~fA"

3)新しいバッチ ユーザーにとって、典型的なつまずきを経験しています。行が解析されると %BELFRAMEWORK_HOME% が展開され、かっこで囲まれたコード ブロックを含む IF ステートメント全体が 1 つのステートメントとして解析されます。したがって、展開された値は、IF ステートメントが実行される前に存在していた値です。

この問題は、遅延展開を使用して解決できます。

@echo off
setlocal enableDelayedExpansion
set var=BEFORE
(
   set var=AFTER
   echo within block normal expansion = %var%
   echo within block delayed expansion = !var!
)
echo after block normal expansion = %var%

上記の結果は、

within block normal expansion = BEFORE
within block delayed expansion = AFTER
after block normal expansion = AFTER

4)私のお気に入りのバッチ スクリプト Web サイトは次のとおりです。

于 2012-08-15T17:28:47.040 に答える