2013-04-29 19 views
9

Ich schreibe eine Datei, um Leerzeichen aus Dateinamen in einem Ordner zu entfernen, und lege dann das Ergebnis in eine .txt Datei. Ich bekomme nur ein Ergebnis von "Echo ist an". über und über.Entfernen von Leerzeichen aus einer Variablen im Stapel

Dies ist, was ich bisher:

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

Kann mir jemand sagen, was falsch?

+0

Nennen Sie die Batch-Datei echo.bat/cmd? – foxidrive

Antwort

7

Der Grund txt, warum Sie ECHO is on. bekommen ist, weil verzögerte Expansion nicht war verwendet, wodurch der Wert %var% und %MyVar% eingefügt wurde, bevor der Befehl for ausgeführt wurde, und da sie nicht am Anfang definiert waren, wurden leere Variablen eingefügt. Wenn echo %MyVar%>>text.txt ausgeführt wurde, wurde er als echo >>text.txt interpretiert. Wenn das Echo ohne Argumente ausgeführt wird, gibt es aus, ob Echo ein- oder ausgeschaltet ist. Dies erhalten Sie in text.txt.

das Problem zu beheben, haben Sie zwei Dinge zu tun:

Erstens gibt es etwas falsch mit Ihrer zweiten Zeile. In setlocal gibt es keinen Platz zwischen Set und Local. Die zweite Zeile sollte SETLOCAL EnableDelayedExpansion sein.

Zweitens verzögerte Expansion zu verwenden, müssen Sie mit !, wie !var! statt %var% alle % s in jede Variable ersetzen.

Endergebnis:

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

Sie brauchen eigentlich keine temporäre Variable in diesem Fall verwenden, können Sie einfach SET MyVar=%%~n# tun und zu set MyVar=!MyVar: =! überspringen.

+0

Vielen Dank, funktioniert einwandfrei – user2313522

+0

@ user2313522 Weitere Erklärungen hinzugefügt .. – user2033427

0

Führen Sie die folgende Stapelverarbeitungs in dem Ordner die Dateien halten

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

umbenannt werden müssen Sie nur den Druck hinzuzufügen

+2

, die nur alle Dateinamen entfernt und die Erweiterungen – user2313522

1

Das Falsche daran ist, dass Sie die Variablenerweiterung aktiviert haben (Sie haben sie falsch geschrieben ...) und Sie verwenden sie auch nicht. Wenn Sie enabledlayedexpansion verwenden, müssen Sie die Variablennamen wie folgt schreiben:! Variable! statt dies sonst:% Variable%

Aber Sie müssen nicht mit diesem Code verwenden:

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

Call Set "MyVar = %% var: = %%" funktioniert nicht in einer Schleife. – foxidrive

+0

@foxidrive, Es funktioniert, tut mir leid, aber ... Sie haben es vor dem Kommentar getestet ?. – ElektroStudios

+0

Mein Fehler. Es funktioniert gut. – foxidrive

24

alle Räume (nicht nur Vorder- und Hinter) ohne setlocal enabledelayedexpansion mit geschehe Entfernen mit der folgende Zeile:

set var=%var: =% 

Dies funktioniert durch Ersetzen aller Leerzeichen in der Zeichenfolge durch die leere Zeichenfolge.

Quelle: DOS - String Manipulation

+0

Arbeitete perfekt, wenn ich den Abstand zwischen einem Buchstaben und einer Variablen entfernen wollte (z. B. "_p 011820181033" musste "_p011820181033" sein). Vielen Dank! –

+0

Dieser Trick kann auch andere Zeichen ersetzen: einfach das gewünschte Zeichen anstelle von Leerzeichen einfügen. Zum Beispiel wird 'set var =% var:. =%' Alle Punkte in der Variablen entfernen, was nützlich sein kann, wenn Sie eine Variable haben, die eine Versionsnummer mit Punkten enthält und Sie nur die Zahlen brauchen. – Wayfarer

Verwandte Themen