2015-12-15 11 views
6

Ho saltato del codice che dovrebbe eliminare file che non hanno nomi che iniziano con il valore di keep. Sto raggiungendo questo mettendo il nome del file in tmpL1 e tmpL2 sostituendo il valore di keep con niente. Se tmpL1 e tmpL2 sono diversi, sto mantenendo il file, altrimenti viene eliminato.Sostituzione stringa batch di Windows non funziona quando una stringa di ricerca viene fornita da una variabile

setlocal enabledelayedexpansion 
set keep=[File I want to keep] 
for /F %%L IN ('dir /b *') do (
    set tmpL1=%%L 
    set tmpL2=!tmpL1:%keep%=! 
    if !tmpL1!==!tmpL2! (
     echo.[REMOVE] 
    ) else (
     echo.[KEEP] 
    ) 
) 

Questo funziona correttamente. Tuttavia, quando inserisco questo codice in uno script più grande, l'impostazione di tmpL2 smette improvvisamente di funzionare. Invece di (una parte) il nome file tmpL2 ora contiene letteralmente tmpL1:=.

Ecco lo script in cui voglio utilizzarlo. Gli ulteriori for -loops sono solo per passare attraverso un albero di directory. La funzione principale dello script è sempre la stessa.

setlocal enabledelayedexpansion 
for /F %%G in ('dir /b *-snapshots') do (
    set tmpG1=%%G 
    for /F %%H in ('dir /b !tmpG1!\*') do (
     set tmpH1=%%H 
     for /F %%I in ('dir /b !tmpG1!\!tmpH1!\*') do (
      set tmpI1=%%I 
      for /F %%J in ('dir /b !tmpG1!\!tmpH1!\!tmpI1!\*-SNAPSHOT') do (
       set tmpJ1=%%J 
       set tmpJ2=!tmpJ1:~0,8! 
       for /F %%K in ('dir /b !tmpG1!\!tmpH1!\!tmpI1!\!tmpJ1!\*!tmpJ2!*.pom /O:N') do (
        set tmp1=%%K 
       ) 
       set keep=!tmp1:.pom=! 
       for /F %%L in ('dir /b !tmpG1!\!tmpH1!\!tmpI1!\!tmpJ1!\*!tmpJ2!*') do (
        set tmpL1=%%L 
        set tmpL2=!tmpL1:%keep%=! 
        pause 
        if !tmpL1!==!tmpL2! (
         echo.[REMOVE] 
        ) else (
         echo.[KEEP] 
        ) 
       ) 
      ) 
     ) 
    ) 
) 

Ho anche provato "artificiale" espansione ritardata sostituendo set tmpL2=!tmpL1:%keep%=! con call set tmpL2=%%tmpL1:%keep%=%%. Questo funziona anche nel piccolo script, ma quando lo applico al grande viene visualizzato un errore come "=%" can't be syntactically processed in this location (che è una traduzione gratuita poiché la mia console è in tedesco).

Qualcuno ha un'idea di cosa sta causando questo?

risposta

3

Si potrebbe provare a cambiare questa linea
set tmpL2=!tmpL1:%keep%=!

con

FOR /F "delims=" %%R in (""!keep!"") do set "tmpL2=!tmpL1:%%~R=!" 
+0

incollato correttamente e funziona come un incantesimo. Grazie! – user3249829

2
   set tmpL2=!tmpL1:%keep%=! 

Quando il ciclo for viene analizzato, dal momento che keep è in quel momento non definito, questo sarà ridotto a

   set tmpL2=!tmpL1:=! 
+0

Buona chiamata! Hai idea di come aggirare questo problema? – user3249829

+1

la chiamata è la parola chiave. Chiama una subroutine. sostituire lì (come 'tmpL1' e' keep' saranno definiti ciascuno) e assegnare a un'ulteriore variabile, quindi usare quell'ulteriore variabile come '! var!' – Magoo

+0

Non riesco a farlo funzionare. Ho creato una subroutine con questo comando: 'call set% ~ 3 = %%% ~ 1:% ~ 2 = %%'. Il terzo parametro ha quindi il valore del primo parametro, ma nulla viene sostituito. – user3249829

1

Invece di:

set tmpL2=!tmpL1:%keep%=! 

scrittura:

call :SUB tmpL2 !tmpL1! !keep! 

quindi nella parte inferiore dello script, collocare questo:

goto :EOF 

:SUB return string search [replace] 
set "tmpSub=%2" 
set "%1=!tmpSub:%3=%4!" 
goto :EOF 
+0

Funziona anche, grazie! – user3249829