2 に答える
問題を引き起こしているバッチの複雑さがいくつかあります。
1)括弧で囲まれたブロックは1回のパスで解析されます。IFテストを実行する前に、IFブロック全体を有効な構文に解析する必要があります。
2)変数が未定義の場合、部分文字列展開は奇妙なことをします。パーサーは%var:
何にも展開されず、部分文字列式の残りが残り、行の解析は完全に同期しなくなります。
IF %var:~-2,1%==\ SET var=%var:~0,-2%"
最初%var:
は何も展開せず、IF ~-2,1%==\ SET var=%var:~0,-2%"
次%==\ SET var=%
は何も展開せず、IF ~-2,1var:~0,-2%"
最後に、孤独%
はペアになっていないので、削除されます。
展開後の最後の行IF ~-2,1var:~0,-2"
はになりました。これは無効な構文です。
拡張がどのように機能するかの詳細な説明については、https://stackoverflow.com/a/7970912/1012053を参照してください。%
コードは、2つの非常に直感的でない変更によって「修正」される可能性があります。1)比較の順序を逆にし、2)SETステートメントの前後にエスケープされた引用符を追加し、3)テキストを追加します。
if "\"=="%var:~-2,1%" SET ^"var=%var:~0,-2%"^" ignore
varが未定義の場合、上記は次のように展開されます。
if "\" == "~-2,1var:~0,-2"" ignore
重要なことは、解析された構文が有効であることです。ignore
IFステートメントは、パーサーがそれを有効と見なすために、条件の後にコマンドを必要とするため、これが必要です。ignore
は有効なコマンドではないため、実行するとエラーが発生します。ただし、条件がFALSEであるため(外部IF条件もfalseであるため)、実行されることはありません。
varが定義されている場合、たとえば値がの"test\"
場合、行は次のように展開されます。
if "\" == "\" SET "var=test" ignore
SET割り当ての引用方法により、上記は完全に実行されます。最終見積もり以降は無視されます。
上記はコードを「修正」すると言いますが、コードを完全に再構築するためのより良い方法があると思います。
更新:リストラの提案
変数を引用符で囲まれたパラメーターの値に設定したいだけのように見えます。値の最後の文字(引用符を含まない)が\
である場合は、その文字を削除します。コードが機能しなかった理由を診断するために、いくつかのテストコードも挿入されているようです。テストコードを捨てて、私は次のことをお勧めします:
set var=%6
set "test=%var:~-2,1%"
if "%test%"=="\" set var=%var:~0,-2%"
スペースを保持するためにファイル名とパスを引用する方法を理解しています。ただし、変数値に引用符を含めるのは好きではありません。パラメータから囲んでいる引用符を取り除き、必要な場合にのみ追加し直すのが好きです。したがって、私のコードは次のようになります。
set "var=%~6"
set "test=%var:~-1,1%"
if "%test%"=="\" set "var=%var:~0,-1%"
遅延拡張が有効になっている場合、単純なソリューションではテスト変数は不要になります。
set var=%6
setlocal enableDelayedExpansion
if "!var:~-2,1!"=="\" set "var=!var:~0,-2!""
または、囲んでいる引用符を削除する場合:
set "var=%~6"
setlocal enableDelayedExpansion
if "!var:~-1,1!"=="\" set "var=!var:~0,-1!"
拡張機能defined
とdbenhamが言ったすべてを使用することをお勧めします。
@ECHO off
SET "var=%6"
IF NOT DEFINED var (
ECHO "ijklkmn"
EXIT
)
IF "%var:~-2,1%"=="\" SET "var=%var:~0,-2%""