簡単な答えはノーです。
発生している問題は、アスタリスク * が SET 検索および置換メソッドで使用される特殊文字であるという事実に起因します。限定的ではありますが、有用な方法で複数の文字に一致します。それについてはここで学ぶことができます。
難しい答えはイエスです!
2つのソリューションを提供します。1 つは不完全だがエレガントなソリューションであり、もう 1 つは完全でありながら洗練されていないソリューションです。
どちらの方法でも * が検索され、x に置き換えられます。
どちらのメソッドも、次の文字列を検索して変更します。
*love*
頭に浮かぶ最初の方法は、「FOR /L」ステートメントを使用することであり、環境変数の長さが何文字かを知っている必要があります。
::主な編集::
私は環境変数のさまざまな最大サイズの文字列を知っていると思っていましたが、dbenham が私を学校に連れて行ってくれて、長さの関数を教えてくれました。提示します。
環境変数の最大サイズが 256 文字という Windows 95/98/ME の制限を除きます。CMD.EXE を使用する Windows のすべてのバージョンには、8,192 文字の制限があり、ドキュメントが示唆するものよりもはるかに低いようです。
どちらのバージョンも環境変数の展開を遅らせる必要がありますが、理由は 2 つあります。1 つは、FOR ステートメント内で操作しているためです。もう 1 つは、コマンド プロセッサが 2 番目に検出した % を最初に検出した % と一致させるため、% ペアを別の % ペア内に配置することはできませんが、別の変数式内で変数を使用する必要があるためです。(わかるでしょ。)
このソリューションでは、ここにある DosTips.com の strLen 関数 (3 行目) を使用します。それを strLen.bat というファイルに叩き込むだけで、その速度に驚くことでしょう!
解決策 1: (FOR /L 解決策) :: 推奨される解決策 ::
setlocal ENABLEDELAYEDEXPANSION
set nam=*love*
rem calling strLen
call :strLen nam len
for /l %%x in (0,1,%len%) do if not "!nam:~%%x,1!"=="" if "!nam:~%%x,1!"=="*" (
set /a plusone=%%x+1
for /l %%y in (!plusone!, 1, !plusone!) do (
set nam=!nam:~0,%%x!x!nam:~%%y!
)
)
echo %nam%
ENDLOCAL
これは迅速かつエレガントな解決策だと思います。 strLen.bat の内容をルーチンに追加することで高速化できますが、作成者に混乱を与えたくありませんでした。
なんらかの理由で strLen を使用したくない場合は、次に速い方法でおそらく GOTO ループを使用します。
解決策 2: (解決策に移動)
setlocal ENABLEDELAYEDEXPANSION
set nam=*love*
set num=0
:loop
set /a plusone=%num%+1
if "!nam:~%num%,1!"=="*" set nam=!nam:~0,%num%!x!nam:~%plusone%!
set /a num=%num%+1
if not "!nam:~%num%,1!"=="" goto :loop
echo %nam%
EndLocal
strLen 関数を指摘してくれた dbenham に感謝します。これは、どのバッチ ベースの関数よりも高速に動作します。