# Batch For- Schleifen Problem wegen Leerzeichen in Variable



## Planich (8. Juni 2012)

Hallo,

hier mal mein Code: 
for %%f in ("D:\test\*.sync*") do DEL /S /Q %%f

Was ich machen will ist alle Dateien in einem bestimmten Verzeichnis mit der gewünschten Endung löschen. Nur leider übernimmt er die Leerzeichen in der Variable wohl nicht richtig.
Wenn also eine Datei so heißt "D:\test\ISO komm.sync" dann versucht er den DEL Befehl an einer "D:\test\ISO" die natürlich nicht funktioniert.

Weiß jemand Rat?

Danke im voraus


----------



## HonniCilest (8. Juni 2012)

Wieso so umständlich?


```
del /s /q "d:\test\*.sync*"
```

Müsste reichen.


----------



## Planich (11. Juni 2012)

weil das mit dem Löschen nur ein Test ist. Ich hätte genauso gut Echo nehmen können.
Geht das nun irgendwie mit den Leerzeichen oder nicht?

Edit:
mal eine Erklärung

Also da sind Dateien wie z.B. "~234.txt" aber auch die von Windows erstellten "~$234.txt"

und ich möchte eben die "~234.txt" packen und dann löschen, die anderen mit $ aber nicht. Wie stelle ich das denn an?


----------



## deepthroat (11. Juni 2012)

Hi.

Du mußt entsprechend quotieren:

```
for %%f in ("D:\test\*.sync*") do DEL /S /Q "%%f"
```
Gruß


----------



## Planich (12. Juni 2012)

Hallo, das funktioniert super. Was ich mich frage ist: warum verlangt er keine Bestätigung, obwohl ich das /Q weglasse?

Und zweitens, jetzt wo das passt, habe ich noch eine Frage, die wir hoffentlich lösen können, ich krieg es nämlich nicht ganz hin

Hier mal der unfertige und wahrscheinlich falsche Code:

```
for %%f in ("D:\test\~*") do DEL "%%f" if not "%%f"=="~$*"
```

Ich möchte also alle Files die mit "~" anfangen, jedoch nicht als zweiten Charakter das "$" Zeichen haben, löschen bzw. packen. Hier in diesem Beispiel ist es der Lösch Befehl.

Wäre super wenn mir da jemand helfen könnte. Ich weiß nicht ob es die Syntax ist die falsch ist, oder ob das so mit Batch überhaupt nich funktioniert.


----------



## deepthroat (12. Juni 2012)

Planich hat gesagt.:


> Hallo, das funktioniert super. Was ich mich frage ist: warum verlangt er keine Bestätigung, obwohl ich das /Q weglasse?


Das /Q hat nur eine Bedeutung wenn man einen "globalen Platzhalter" verwendet. Also z.B. "del *.*". Wenn du direkt Dateien zum Löschen angibst wird nicht nachgefragt.


Planich hat gesagt.:


> Hier mal der unfertige und wahrscheinlich falsche Code:
> 
> ```
> for %%f in ("D:\test\~*") do DEL "%%f" if not "%%f"=="~$*"
> ```


Batch ist kein Perl. Siehe "help if":

```
Performs conditional processing in batch programs.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
```
Insofern unterstützt Batch auch keine reg. Ausdrücke oder Muster in Vergleichen. Man kann aber die ersten beiden Zeichen aus dem String extrahieren:

```
setlocal enabledelayedexpansion

for ... do (
  set x=%%f
  set x=!x:~0,2!
  if not "!x!"=="~$" del "%%f"
)
endlocal
```
Gruß


----------



## Planich (12. Juni 2012)

Hallo,


```
setlocal enabledelayedexpansion
for %%f in ("D:\test\~*") do (
set x=%%f
set x=!x:~0,2!
if not "!x!"=="~$" del "%%f"
)
endlocal
```

dieser Code funktioniert leider nicht. Er löscht auch die Files, die als zweiten Character das "$" haben.

PS: Auf Perl habe ich mich nicht bezogen. Das kann ich nicht.

Ich dachte vielmehr

IF [NOT] string1==string2 command

wäre in etwa das was ich suchte, dachte mir aber schon das das wahrscheinlich nicht klappen wird.


----------



## deepthroat (12. Juni 2012)

s





Planich hat gesagt.:


> Hallo,
> 
> 
> ```
> ...


Ja, da der pfad D:\test\ noch davor steht. Dann so:

```
echo.%%f | findstr /e /r "\\~$[^\\]*" >nul
if errorlevel 1 del ...
```



Planich hat gesagt.:


> PS: Auf Perl habe ich mich nicht bezogen. Das kann ich nicht.
> 
> Ich dachte vielmehr
> 
> ...


War es auch, du aber hast 

command IF [NOT] string1==string2

geschrieben. Was z.B. bei Perl möglich ist; deshalb meine Vermutung.

Gruß


----------



## Planich (12. Juni 2012)

daraus werde ich jetzt nicht mehr schlau. Das sind für mich nur noch Zeichen die ich nicht verstehe.

echo.%%f  - was macht das?
| - das ist ein ODER ?
findstr /e /r - sucht den String
"\\~$[^\\]*" - was macht [^\\]*? 
>nul - leitet den String ins Nirvana?
if errorlevel 1 del... - errorlevel1 bekommt er bei den Strings die zwar mit "~" gefunden wurden, aber durch findstr "~$" nicht?


----------



## deepthroat (12. Juni 2012)

Planich hat gesagt.:


> echo.%%f  - was macht das?


Probier's doch aus!


Planich hat gesagt.:


> | - das ist ein ODER ?


Nein, das ist eine Pipe. Damit wird Standardausgabe von links mit der Standardeingabe von rechts verbunden.


Planich hat gesagt.:


> findstr /e /r - sucht den String


Jein, es sucht das Muster.


Planich hat gesagt.:


> "\\~$[^\\]*" - was macht [^\\]*?


Das ist ein reg. Ausdruck. Siehe "findstr /?". 


Planich hat gesagt.:


> >nul - leitet den String ins Nirvana?


Ja.


Planich hat gesagt.:


> if errorlevel 1 del... - errorlevel1 bekommt er bei den Strings die zwar mit "~" gefunden wurden, aber durch findstr "~$" nicht?


versteh ich jetzt nicht. ist das eine Frage?

Gruß


----------



## Planich (27. Juni 2012)

wie kommt es zu dem errorlevel 1?


----------



## deepthroat (27. Juni 2012)

Planich hat gesagt.:


> wie kommt es zu dem errorlevel 1?


Falls findstr das Muster findet, gibt es 0 zurück. Falls nicht, gibt findstr irgendeinen Errorcode zurück und der Batchprozessor setzt den errorlevel auf diesen Wert.

if errorlevel 1 prüft ob der errorlevel größer oder gleich 1 war.


----------

