2013-04-29 15 views
9

Sto scrivendo un file per rimuovere spazi dai nomi file in una cartella e quindi inserire il risultato in un file .txt. Ho appena ricevuto un risultato di "Echo is on." ancora ed ancora.Rimozione di spazi da una variabile in batch

Questo è quello che ho finora:

@echo ON 
SET LOCAL EnableDelayedExpansion 
For %%# in (*.*) do (
    SET var=%%~n# 
    Set MyVar=%var% 
    set MyVar=%MyVar: =% 
    echo %MyVar%>>text.txt 
) 

qualcuno può dirmi che cosa è sbagliato?

+0

hai chiamato il file batch echo.bat/cmd? – foxidrive

risposta

7

Il motivo per cui si stanno ottenendo ECHO is on. è perché l'espansione in ritardo non era utilizzato, che ha causato l'inserimento del valore di %var% e %MyVar% prima dell'esecuzione del comando for e poiché non erano definiti all'avvio, le variabili vuote sono state inserite in. Quando è stato eseguito il echo %MyVar%>>text.txt, è stato interpretato come echo >>text.txt. Quando echo viene eseguito senza argomenti, emette se l'eco è attivato o disattivato, che è ciò che ottieni in text.txt.

Per risolvere il problema, è necessario fare due cose:

In primo luogo, v'è qualcosa di sbagliato con la seconda linea. Non c'è spazio tra set e locale in setlocal. La seconda riga deve essere SETLOCAL EnableDelayedExpansion.

In secondo luogo, per usare l'espansione ritardata, è necessario sostituire tutte % s in ogni variabile con !, come !var! invece di %var%.

Risultato finale:

@echo ON 
SETLOCAL EnableDelayedExpansion 
For %%# in (*.*) do (
    SET var=%%~n# 
    Set MyVar=!var! 
    set MyVar=!MyVar: =! 
    echo !MyVar!>>text.txt 
) 

In realtà non è necessario utilizzare una variabile temporanea in questo caso, si può solo fare SET MyVar=%%~n# e saltare al set MyVar=!MyVar: =!.

+0

Grazie, funziona perfettamente – user2313522

+0

@ user2313522 Aggiunti ulteriori spiegazioni .. – user2033427

0

eseguire il seguente batch nella cartella contenente i file da rinominare

@echo off 
    setlocal enabledelayedexpansion 
    for %%j in (*.*) do (
    set filename=%%~nj 
    set filename=!filename=.=_! 
    set filename=!filename= =_! 
    if not "!filename!"=="%%~nj" ren "%%j" "!filename!%%~xj" 
    ) 

si solo bisogno di aggiungere lo stampa a txt

+2

che ha appena rimosso tutti i nomi di file e ha lasciato le estensioni – user2313522

1

La cosa sbagliata è che hai abilitato l'espansione della variabile (lo hai scritto male ...) e anche tu non lo stai usando, quando si usa enabledelayedexpansion è necessario scrivere i nomi delle variabili come segue:! Variabile! invece di questo altro:% Variabile%

Ma non c'è bisogno di usarlo con questo codice:

@echo ON 
For %%# in (*) do (
    SET "var=%%~n#" 
    Call Set "MyVar=%%var: =%%" 
    Call echo %%MyVar%%>>text.txt 
) 
+0

Call Set "MyVar = %% var: = %%" non funziona in un ciclo. – foxidrive

+0

@foxidrive, funziona, mi dispiace ma ... l'hai provato prima di commentare ?. – ElektroStudios

+0

Il mio errore. Funziona bene. – foxidrive

24

Rimozione di tutti gli spazi (non solo iniziali e finali) può essere fatto senza utilizzare setlocal enabledelayedexpansion con il riga seguente:

set var=%var: =% 

Questo funziona sostituendo tutti gli spazi nella stringa con la stringa vuota.

Fonte: DOS - String Manipulation

+0

Ha funzionato perfettamente quando volevo rimuovere lo spazio tra una lettera e una variabile (ad es. "_p 011820181033" doveva essere "_p011820181033"). Grazie! –

+0

Questo trucco è valido anche per sostituire altri personaggi: basta mettere il carattere desiderato per rimuovere invece di spazio. Ad esempio, 'set var =% var:. =%' Rimuoverà tutti i punti nella variabile, il che potrebbe essere utile se hai una variabile contenente un numero di versione con punti e hai bisogno solo dei numeri. – Wayfarer