たとえば、次のパスがあります。"C:\Windows\Example\001 Example\005 Example"
この文字列から"005 Example"
を抽出する必要があります。 "set path=%path:~0,11%"
で試しましたが、パスは"C:\Windows\Example\001 Example\005 Example_2"
にすることもできます。
最後の「\」の後に文字列をカットする必要があります
これどうやってするの?
まず、変数名として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。次に、%%~I
をtempname
に割り当てます。 %%~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%
が奇妙に動作することを確認しました。