web-dev-qa-db-ja.com

バッチ–文字列内の文字を削除します

たとえば、次のパスがあります。"C:\Windows\Example\001 Example\005 Example"この文字列から"005 Example"を抽出する必要があります。 "set path=%path:~0,11%"で試しましたが、パスは"C:\Windows\Example\001 Example\005 Example_2"にすることもできます。

最後の「\」の後に文字列をカットする必要があります

これどうやってするの?

2
NvyxMarx

まず、変数名としてpathを使用しないでください。 Windowsコマンドプロンプト(シェルを含むUnixのほとんどのコンポーネントとは異なり)は、変数名を大文字と小文字を区別しない方法で処理するため、pathは実行検索パスであるPATHと同じです。あなたがそれにランダムな何かを割り当てるならば、あなたは傷ついた世界にいるでしょう。

%variable:str1=str2%フォームを使用します。 (set /?がこれらのフォームを文書化していることをご存知だと思います。)これは代替です:

C:\> set play=food

C:\> echo %play:foo=bar%
bard

C:\> set animal=cat

C:\> echo %animal:at=ow%
cow

これは非常に制限されたパターンマッチング機能をサポートします。 %variable:*str1=str2%は、str1の最初の出現までのすべてを検索して削除し、str2に置き換えます。特に、%variable:*\=%は、最初の\までのすべてをnullに置き換えます。たとえば、%pathname%C:\Windows\Example\001 Example\005 Exampleの場合、%pathname:*\=%Windows\Example\001 Example\005 Exampleに評価されます(C:\なし)。パス名が常に4つのレベルを持つ場合は、次のことができます。

for %%I in (%pathname%) do set tempname=%%~I
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set basename=%tempname%
echo %basename%

forステートメントは、ちょっとしたごまかしです。これは、インデックス変数%%I%pathname%の値に設定された状態で1回だけ実行されることが保証されているループです。1。次に、%%~Itempnameに割り当てます。 %%~I%%Iの値(つまり、%pathname%の値)です。ただし、その文字列が引用符(")文字で開始および終了する場合は、削除されます。 %pathname%が引用符で開始および終了しないことが確実な場合(たとえば、これをすでに実行しているため、または同等のもの)、この手順をスキップして、set tempname=%pathname%と言うことから始めることができます。 。

パス名のレベル数が不確定な場合は、

for %%I in (%pathname%) do set tempname1=%%~I
:loop
set tempname2=%tempname1:*\=%
if not %tempname1% == %tempname2% ( set tempname1=%tempname2% & goto loop )
set basename=%tempname1%
echo %basename%

\sがなくなるまでループします。
______________
1 実際、%pathname%がnull(空)の場合、または?*のようなワイルドカード(パターンマッチング)文字が含まれている場合、その動作はより複雑になる可能性があります。私が見つけていない他の特異なケースがあるかもしれません。 (見積もりを処理するためのよりクリーンな方法があるかどうかをお知らせください。)


警告:%variable:str1=str2%がnullの場合、%variable%が奇妙に動作することを確認しました。

1
Scott