2011-12-27 9 views
21

Ho questo for ciclo per ottenere un elenco di nomi di directory:Ottenere la sottostringa di un token in per ciclo?

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

uscita:

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 

voglio ottenere i nomi delle cartelle che iniziano con "la politica", ma echo %%g:~29 non funziona. Ho anche provato a set x=%%g e poi echo %x:~29% e ancora non funziona.

Quindi, come si ottiene la sottostringa dal token nel ciclo for?

risposta

33

Ovviamente che set x=%%g e un'estrazione di sottostringa di x dovrebbero funzionare, ma si tenga presente che se la sottostringa viene acquisita all'interno di un ciclo FOR, deve essere eseguita con! invece di% (Espansione ritardata):

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

consigli utili qui, grazie. Mi ha aiutato a scrivere una sceneggiatura che non pensavo fosse possibile. – Angst

+0

@Aacini E 'possibile estrarre una sottostringa direttamente dal parametro '%% g', senza utilizzare una variabile ausiliaria' x' e senza abilitare DelayedExpansion? –

+1

@AlfredoCapobianchi: Risposta breve: No. Risposta lunga: se leggi attentamente la domanda, devi prendere nota di questa frase: _ "'echo %% g: ~ 29' non funziona" _. – Aacini

1

Un semplice

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

dovrebbe fare il trucco. Se si desidera ciclo su di esso:

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

Neat! Userò il tuo suggerimento ma contrassegnerò Aacini come risposta poiché quella soluzione mi ha fatto imparare di più. –

+0

Puoi approfondire come funziona? Voglio fare la stessa cosa ma voglio tutti i nomi di file (non solo quelli "politici"). Ho provato '*' e '\ *. *' Ma si rompe sugli spazi e dà risultati inaspettati. – laggingreflex

+0

@laggingreflex: Quindi vuoi 'dir/B% windir% \ Assembly \ gac_msil \' - che dovrebbe elencare tutti i file in quella directory? – ChrisWue

4

D'altra parte, se si vuole sapere "Come ottenere l'ultima parte (nome e l'estensione) di un gettone in ciclo for", la risposta è: l'uso il ~ ~ Nome e modificatori di estensione nella %% g parametro sostituibile:

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

Grazie. Sono sicuro che tornerà utile un giorno. –

+0

Puoi approfondire come funziona? Voglio fare la stessa cosa ma voglio tutti i nomi di file (non solo quelli "politici"). Ho provato '*' e '\ *. *' Ma si rompe sugli spazi e dà risultati inaspettati. – laggingreflex

+0

@RayCheng Wow, cercato/sperimentato per una buona ora circa riguardo alla sottostringa delle variabili iterate in un ciclo for. E poi ti presenti e vai tutto "oh e btw ecco come lo fai usando 2 lettere magiche". Questo era esattamente quello che stavo cercando, grazie per aver salvato la mia giornata :) –

-2

È necessario utilizzare setlocal EnableDelayedExpansion e !variable! invece di %variable%, quindi:

setlocal EnableDelayedExpansion 

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

Sembra essere una copia della risposta esistente. –

Problemi correlati