2014-05-08 10 views
13

Sto cercando di convertire tutti i backslash() per inoltrare barre (/) in una variabile che contiene un nome di file e la posizione. Ho letto di questo e visto:Change backslash di trasmettere la barra nel file di finestre batch di

%variable:str1=str2% 

e

set "var=%var:\=/%" 

che ho tentato, ma non sto ovviamente sempre nel modo giusto.

Qui è la sezione dedicata del mio script bat:

FOR %%f IN ("E:\myfiles\app1\data\*.csv") DO (
    echo %%f 
    set "f=%%f:\=/%" 
    echo %%f 
    echo.     
) 

Lo spettacolo uscita ogni nome di file elencato due volte.

vale a dire questa linea:

set "f=f:\=/%" 

non sta facendo quello che voglio. Qualcuno può vedere cosa sto facendo di sbagliato?

+0

Questa domanda ha la stessa soluzione [Come si specifica il nome utente in upload ftp da un file batch] (http://stackoverflow.com/questions/23535640/how-do-you-specify-the-username-in-ftp-upload-by-a-batch-file) – jeb

+0

Sei sicuro che la soluzione sia nella domanda a cui ti sei collegato ? Non vedo la risposta, e mi sembrano domande diverse. – user3253319

+0

Siamo spiacenti, hai ragione. Intendevo [BATCH - Sostituire gli spazi nel nomefile con% 20 per arricciare] (http://stackoverflow.com/questions/23538894/batch-replacing-spaces-in-filename-with-20-for-curl) – jeb

risposta

15

All'interno di un blocco di istruzioni (a parenthesised series of statements), il blocco intera viene analizzato e quindi giustiziati. Qualsiasi %var% all'interno del blocco sarà sostituito dal valore della variabile al momento del blocco viene analizzato - prima che venga eseguito il blocco - la stessa cosa vale per un FOR ... DO (block).

Quindi, IF (something) else (somethingelse) verrà eseguita utilizzando i valori di %variables% al momento si incontra il IF.

Due modi comuni per superare questo sono: 1) utilizzare setlocal enabledelayedexpansion e utilizzare !var! in luogo di %var% per accedere al valore modificato della var o 2) per chiamare una subroutine per eseguire un'ulteriore elaborazione utilizzando i valori modificati.

Si noti quindi l'uso di CALL ECHO %%var%% che visualizza il valore modificato di var.

il codice contiene due variabili separate chiamate f.

Il primo è l'anello di controllo 'metavariable' chiamato f e fa riferimento %%f.

Il secondo è l'ambiente comune variabile f sia stabilita da dichiarazione set "f=...".Questa variabile può essere letta utilizzando %f%ma entro un block, apparirà di mantenere il valore che aveva quando il controllo for stato analizzato (in realtà, qualsiasi %var% è sostituito al parse-tempo dal valore varin quel tempo)

metavariables non possono essere utilizzati in istruzioni di manipolazione delle stringhe come sottostringhe o sostituti, solo variabili d'ambiente comuni possono essere utilizzati per queste operazioni, quindi è necessario assegnare il valore del metavariable f alla variabile di ambiente f e quindi eseguire l'attività di sostituzione delle stringhe di la variabile ambientale f.

La svolta, ovviamente, è che è necessario utilizzare delayedexpansion e la sintassi !var! per accedere al valore modificato di una variabile di ambiente all'interno di un blocco.

Quindi,

setlocal enabledelayedexpansion 
for...%%f...do (
    echo %%f 
    set "f=%%f" 
    set "f=!f:\=/!" 
    echo !f! 
) 
echo just for demonstration %f% !f! %%f 

Questo imposta il valore della f nella maniera richiesta (naturalmente, si può sempre cambiare il nome per evitare confusione ...)

L'ultima riga è semplicemente quello di mostrare che il valore finale acquisito da f è accessibile al di fuori del ciclo come %f% o !f! e che %%f è fuori contesto e visualizzato come %f.

Un altro modo per fare questo senza delayedexpansion è

for...%%f...do (
    echo %%f 
    set "f=%%f" 
    call set "f=%%f:\=/%%" 
    call echo %%f%% 
) 
echo just for demonstration %f% !f! %%f 

la differenza è l'uso di call e raddoppiando le % s, e la riga finale mostrerà !f! come proprio questo - un letterale, poiché al di fuori di delayedexpansion modo, ! è solo un altro carattere senza significato speciale per cmd.

+1

wow, una spiegazione molto completa, grazie mille! ho dovuto leggerlo un paio di volte, ma penso che lo sto facendo .. !! script batch di Windows sembra ancora strano per me, non sono sicuro che riuscirò mai a "capirlo" – user3253319

+0

In realtà ho dovuto fare il contrario: sostituire la barra in avanti con la barra rovesciata, ma la tua spiegazione è stata perfetta. –

4

Questo sembra funzionare per me:

echo off 

setlocal enabledelayedexpansion 

FOR %%f IN ("C:\tools\workspace\*") DO (
    set old=%%f 
    echo !old! 
    set new=!old:\=/! 
    echo !new! 
    echo.     
) 

Utilizzando una variabile separata piuttosto che l'indice del ciclo fa la differenza, insieme all'abilitazione espansione ritardato come Syntex substittion variabile utilizzando l'indice del ciclo %% f dosn' t sembra funzionare.

+0

geniale, sì funziona, grazie! – user3253319

32

Questo cambierà il back-slash per inoltrare-slash in una variabile:

set "variable=E:\myfiles\app1\data\*.csv" 
set "variable=%variable:\=/%" 
echo "%variable%" 
+0

Grazie. Molto breve e carino .. – user8162

+0

Questa risposta funziona perfettamente senza la necessità di un ciclo. L'ho appena provato (non avevo bisogno delle virgolette, però). – ThePersonWithoutC

+2

Grazie a @ThePersonWithoutC - le virgolette proteggono alcuni caratteri velenosi come '&' e lo rendono più robusto per le situazioni dispari. – foxidrive