Batch For- Schleifen Problem wegen Leerzeichen in Variable

Planich

Grünschnabel
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
 

Planich

Grünschnabel
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?
 
Zuletzt bearbeitet:

Planich

Grünschnabel
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:
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

Erfahrenes Mitglied
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.
Hier mal der unfertige und wahrscheinlich falsche Code:
Code:
for %%f in ("D:\test\~*") do DEL "%%f" if not "%%f"=="~$*"
Batch ist kein Perl. Siehe "help if":
Code:
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:
Code:
setlocal enabledelayedexpansion

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

Planich

Grünschnabel
Hallo,

Code:
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

Erfahrenes Mitglied
s
Hallo,

Code:
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.
Ja, da der pfad D:\test\ noch davor steht. Dann so:
Code:
echo.%%f | findstr /e /r "\\~$[^\\]*" >nul
if errorlevel 1 del ...
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
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

Grünschnabel
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

Erfahrenes Mitglied
echo.%%f - was macht das?
Probier's doch aus!
| - das ist ein ODER ?
Nein, das ist eine Pipe. Damit wird Standardausgabe von links mit der Standardeingabe von rechts verbunden.
findstr /e /r - sucht den String
Jein, es sucht das Muster.
"\\~$[^\\]*" - was macht [^\\]*?
Das ist ein reg. Ausdruck. Siehe "findstr /?".
>nul - leitet den String ins Nirvana?
Ja.
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ß