web-dev-qa-db-ja.com

forループでトークンの部分文字列を取得していますか?

ディレクトリ名のリストを取得するために、このforループがあります。

for /d %%g in (%windir%\Assembly\gac_msil\*policy*A.D*) do (
echo %%g
)

出力:

C:\WINDOWS\Assembly\gac_msil\policy.5.0.A.D
C:\WINDOWS\Assembly\gac_msil\policy.5.0.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.20.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.25.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.35.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.55.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.60.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.5.70.A.D.O
C:\WINDOWS\Assembly\gac_msil\policy.6.0.A.D.O

「policy」で始まるフォルダ名を取得したいのですが、echo %%g:~29は機能しません。私もset x=%%g その後 echo %x:~29%、それでも動作しません。

では、forループでトークンから部分文字列を取得するにはどうすればよいですか?

28
Ray Cheng

もちろんset x=%%gとxの部分文字列抽出は機能するはずですが、部分文字列を取得する場合は注意してくださいFORループ内の場合、これは! %の代わりに(遅延展開):

setlocal EnableDelayedExpansion
for /d %%g in (%windir%\Assembly\gac_msil\*policy*A.D*) do (
set x=%%g
echo !x:~29!
)
40
Aacini

一方、「forループでトークンの最後の部分(名前と拡張子)を取得する方法」を知りたい場合の答えは、%% g交換可能パラメーターで〜Nameおよび〜eXtension修飾子を使用します。

for /d %%g in (%windir%\Assembly\gac_msil\*policy*A.D*) do (
echo %%~NXg
)
5
Aacini

シンプルな

dir /B %windir%\Assembly\gac_msil\*policy*A.D*

トリックを行う必要があります。ループしたい場合:

for /f %%g in ('dir /B %windir%\Assembly\gac_msil\*policy*A.D*') do (
    echo %%g
)
1
ChrisWue