2013-04-29 19 views
9

Piszę plik, aby usunąć spacje z nazw plików w folderze, a następnie umieścić wynik w pliku .txt. Właśnie otrzymuję wynik "Echo jest włączony". raz po raz.Usuwanie spacji ze zmiennej wsadowej

To, co mam tak daleko:

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

Czy ktoś może mi powiedzieć co jest nie tak?

+0

Zadzwoniłaś plik wsadowy echo.bat/cmd? – foxidrive

Odpowiedz

7

powód, dla którego są coraz ECHO is on. dlatego opóźniony rozbudowa nie było użyte, co spowodowało wstawienie wartości %var% i %MyVar% przed uruchomieniem komendy for, a ponieważ nie zostały zdefiniowane na początku, wstawiono puste zmienne. Po uruchomieniu echo %MyVar%>>text.txt została ona zinterpretowana jako echo >>text.txt. Gdy echo jest uruchamiane bez żadnych argumentów, wyprowadza ono informację, czy echo jest włączone, czy nie, co otrzymujesz w text.txt.

Aby rozwiązać ten problem, trzeba zrobić dwie rzeczy:

Po pierwsze, nie jest coś nie tak z drugiej linii. Nie ma spacji między zestawem a lokalnym w setlocal. Druga linia powinna być SETLOCAL EnableDelayedExpansion.

drugie, aby korzystać z opóźnieniem ekspansję, trzeba wymienić wszystkie % sw każdej zmiennej z !, jak !var! zamiast %var%.

Wynik końcowy:

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

rzeczywiście nie trzeba użyć zmiennej tymczasowej w tym przypadku można po prostu zrobić SET MyVar=%%~n# i przejdź do set MyVar=!MyVar: =!.

+0

Dziękuję, działa idealnie – user2313522

+0

@ user2313522 Dodano więcej wyjaśnień .. – user2033427

0

uruchom następujące partia w folderze gospodarstwa pliki do przemianowany

@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" 
    ) 

wystarczy dodać wydruk do txt

+2

, który właśnie usunął wszystkie nazwy plików i opuścił rozszerzenia – user2313522

1

Niewłaściwe jest to, że włączyłeś zmienne rozszerzenie (źle je uszkodziłeś ...), a także, że go nie używasz, podczas korzystania z enabledelayedexpansion musisz zapisać nazwy zmiennych w następujący sposób:! Variable! zamiast tego jeszcze:% zmienna%

Ale nie trzeba go używać z tym kodem:

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

Zestaw połączeń "MyVar = %% var: = %%" nie działa w pętli. – foxidrive

+0

@foxidrive, działa, przepraszam ale ... testowałeś to przed komentarzem ?. – ElektroStudios

+0

Mój błąd. To działa dobrze. – foxidrive

24

Usuwanie wszystkich spacji (nie tylko początkowe i końcowe) można zrobić bez korzystania z setlocal enabledelayedexpansion linia:

set var=%var: =% 

Działa to, zastępując wszystkie spacje w łańcuchu pustym ciągiem znaków.

Źródło: DOS - String Manipulation

+0

Działa doskonale, gdy chcę usunąć spację między literą a zmienną (np. "_p 011820181033" musi być "_p011820181033"). Dzięki! –

+0

Ta sztuczka jest odpowiednia do zastąpienia także innych postaci: po prostu wybierz żądany znak, a nie spację. Na przykład 'set var =% var:. =%' Usunie wszystkie kropki w zmiennej, co może być przydatne, jeśli masz zmienną zawierającą numer wersji z kropkami i potrzebujesz tylko liczb. – Wayfarer

Powiązane problemy