2011-12-27 20 views
21

mam ten for pętlę, aby uzyskać listę nazw katalogów:Uzyskiwanie podciągu tokena w pętli for?

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

wyjściowa:

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 

chcę uzyskać nazwy folderów zaczynające się od „polityki”, ale echo %%g:~29 nie działa. Próbowałem również set x=%%g, a następnie echo %x:~29% i nadal nie działa.

Jak zatem uzyskać podciąg z tokena w pętli for?

Odpowiedz

33

Oczywiście że set x=%%g i ekstrakcja podciąg x powinny działać, ale należy pamiętać, że jeśli zostanie podjęta podciąg wewnątrz pętli FOR, to musi być zrobione z! zamiast% (Opóźnione Expansion):

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

przydatnych wskazówek tutaj, dzięki. Pomógł mi napisać scenariusz, który wydawał mi się niemożliwy. – Angst

+0

@Aacini Czy możliwe jest wyodrębnienie podciągu bezpośrednio z parametru '%% g', bez używania pomocniczej zmiennej' x' i bez włączenia DelayedExpansion? –

+1

@AlfredoCapobianchi: Krótka odpowiedź: Nie. Długa odpowiedź: jeśli uważnie czytasz pytanie, powinieneś zapamiętać to zdanie: _ "echo %% g: ~ 29' nie działa" _. – Aacini

1

Prosty

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

powinno załatwić sprawę. Jeśli chcesz się pętla nad nim:

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

Neat! Posłużę się twoją sugestią, ale zaznaczę odpowiedź Aaciniego, ponieważ to rozwiązanie pozwoliło mi dowiedzieć się więcej. –

+0

Czy możesz rozwinąć, jak to działa? Chcę zrobić to samo, ale chcę mieć wszystkie nazwy plików (nie tylko "polisy"). Próbowałem '*' i '\ *. *' Ale zepsuło się na spacje i dawało nieoczekiwane rezultaty. – laggingreflex

+0

@laggingreflex: Więc chcesz 'dir/B% windir% \ Assembly \ gac_msil \' - który powinien wypisać wszystkie pliki w tym katalogu? – ChrisWue

4

Z drugiej strony, jeśli chcesz wiedzieć, „Jak zdobyć ostatnią część (nazwa i rozszerzenie) z tokena w pętli”, odpowiedź brzmi: Redakcyjne Nazwa katalogu ~ a ~ modyfikatory rozszerzenia w %% g wymiennym parametru:

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

Dzięki. Jestem pewien, że kiedyś się przyda. –

+0

Czy możesz rozwinąć, jak to działa? Chcę zrobić to samo, ale chcę mieć wszystkie nazwy plików (nie tylko "polisy"). Próbowałem '*' i '\ *. *' Ale zepsuło się na spacje i dawało nieoczekiwane rezultaty. – laggingreflex

+0

@RayCheng Wow, wyszukiwane/eksperymentować przez dobrą godzinę lub tak dotyczące, jak podłańcuch iteracyjne zmienne w pętli for. A potem pojawiasz się i mówisz "oh i btw tutaj jest, jak to robisz, używając 2 magicznych liter". To było dokładnie to, czego szukałem, dzięki za uratowanie mojego dnia :) –

-2

wymaga użycia setlocal EnableDelayedExpansion i !variable! zamiast %variable%, więc:

setlocal EnableDelayedExpansion 

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

Wydaje się być kopią istniejącej odpowiedzi. –