ダブルコーテーションとブランクの両方を含む文字列を条件に使うときは遅延変数で使う


ダブルコーテーションとブランクの両方を含む文字列を条件に使うときは遅延変数で使う

結論はこのとおりです。

一応環境載せておきます。

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

変数を用意しておきます。
挙動を確認するため echo on にします。
遅延変数の宣言もします。

@echo on
setlocal enabledelayedexpansion

REM ダブルコーテーションとブランクを含む文字列
set str1="C:\Program Files\hoge\foo.exe" "%%1"
REM 同じもの(別になんでもいいです)
set str2="C:\Program Files\hoge\foo.exe" "%%1"

echo 1: %str1%
echo 2: %str2%
出力
>setlocal enabledelayedexpansion

>REM ダブルコーテーションとブランクを含む文字列

>set str1="C:\Program Files\hoge\foo.exe" "%1"

>REM 同じもの(別になんでもいいです)

>set str2="C:\Program Files\hoge\foo.exe" "%1"

>echo 1: "C:\Program Files\hoge\foo.exe" "%1"
1: "C:\Program Files\hoge\foo.exe" "%1"

>echo 2: "C:\Program Files\hoge\foo.exe" "%1"
2: "C:\Program Files\hoge\foo.exe" "%1"

これに追記していきます。

駄目なパターン1: %変数のまま使う

if %str1% == %str2% (
    echo OK
) else (
    echo NG
)
出力
"%1" の使い方が誤っています。
>if "C:\Program Files\hoge\foo.exe" "%1" == "C:\Program Files\hoge\foo.exe" "%1" (

誤っているそうです。
これはよく「ブランクを含む文字列を使うときの注意」とかで解説されているやつですね。

駄目なパターン2: %変数を " でくくって使う

if "%str1%" == "%str2%" (
    echo OK
) else (
    echo NG
)
出力
Files\hoge\foo.exe" "%1"" の使い方が誤っています。
>if ""C:\Program Files\hoge\foo.exe" "%1"" == ""C:\Program Files\hoge\foo.exe" "%1"" (

%変数 を " でくくるというのはよくある解決策として挙げられていますが、これではダメです。

""C:\ProgramFiles 以降で分かれちゃったようです。
Files 以降 は Files\hoge\foo.exe" "%1"" でひとかたまりなのかな?その間にブランクがあるけれども。
よくわかりません。

うまくいくパターン: 遅延変数を使う

if !str1! == !str2! (
    echo OK
) else (
    echo NG
)
出力
>if !str1! == !str2! (echo OK )  else (echo NG )
OK

構文エラーは出ませんでした。

遅延変数は、" でくくってもくくらなくてもちゃんと動きます。

" でくくった場合は、 「くくった"も含む文字列」の比較になります。

どんなときに使うねん

ftype コマンドでファイルとアプリケーションの関連付けを見ると、"(ブランク) が使われた文字列が出てきます。

e.g. .docファイル

>assoc .doc
.doc=Word.Document.8

>ftype Word.Document.8
Word.Document.8="C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE" /n "%1" /o "%u"

この辺いじってたら気づきました。

"C:\Program Files\~~" みたいなファイルパスにしおってからに・・・