6

環境変数の文字列からアスタリスクを削除しようとしていますが、できないようです。

検索文字列に基づいて m3u ファイルを作成しているので、たとえば、love という単語が含まれるすべての曲を含む m3u ファイルを作成する場合は、次のように入力します。

m3u *Love*

m3u.bat は次のファイルを作成します。

xLovex.m3u

ただし、文字を置き換える通常の方法は、アスタリスクでは機能しません。(ただし、疑問符には問題はありません。)

set nam=%nam:*=x%.m3u

代わりにファイル名を作成します

x.m3u
4

5 に答える 5

11

簡単な答えはノーです。

発生している問題は、アスタリスク * が 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 に感謝します。これは、どのバッチ ベースの関数よりも高速に動作します。

于 2012-07-27T09:49:52.433 に答える