if exist funktioniert nicht bei Verzeichnisnamen mit Leerzeichen
Ich versuche verzweifelt die Existenz eines Verzeichnis abzufragen. Bei Name ohne Leerzeilen ist alles OK, bei Namen mit Leerzeichen wird sowohl der IF Zweig als auch der ELSE-Zweig ausgeführt. Ich habe eine kleine "test.bat" Batch-Datei angelegt um euch das Problem zu zeigen:
Hier nun die Ausgabe:
Was mache ich falsch und wie wird es richtig gemacht?
Vielen Dank im voraus!
Bernd
@Echo off
set _=_gibt_es_
if exist %_%NUL (
echo Datei %_% existiert
) else (
echo Datei %_% existiert nicht
)
@Echo.
set _=gibt es auch
if exist %_%NUL (
echo Datei %_% existiert
) else (
echo Datei %_% existiert nicht
)
@Echo.
set _= gibt_es_nicht
if exist %_%NUL (
echo Datei %_% existiert
) else (
echo Datei %_% existiert nicht
)
@Echo.
set _= gibt es nicht
if exist %_%NUL (
echo Datei %_% existiert
) else (
echo Datei %_% existiert nicht
)
@Echo.
set _="gibt es auch"
if exist "%_%NUL" (
echo Datei %_% existiert
) else (
echo Datei %_% existiert nicht
)
C:asvnBuild>test
Datei _gibt_es_ existiert
Datei gibt es auch existiert
Datei gibt es auch existiert nicht
Datei gibt_es_nicht existiert nicht
Datei gibt es nicht existiert
Datei gibt es nicht existiert nicht
Datei "gibt es auch" existiert
Datei "gibt es auch" existiert nicht
C:asvnBuild>
C:asvnBuild>dir *.
Volume in Laufwerk C: hat keine Bezeichnung.
Volumeseriennummer: 96B9-7E82
Verzeichnis von C:asvnBuild
19.04.2007 20:39 <DIR> .
19.04.2007 20:39 <DIR> ..
19.04.2007 20:34 <DIR> gibt es auch
19.04.2007 20:33 <DIR> _gibt_es_
0 Datei(en) 0 Bytes
4 Verzeichnis(se), 6.880.346.112 Bytes frei
C:asvnBuild>ver
Microsoft Windows XP [Version 5.1.2600]
Was mache ich falsch und wie wird es richtig gemacht?
Vielen Dank im voraus!
Bernd
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 57115
Url: https://administrator.de/contentid/57115
Ausgedruckt am: 25.11.2024 um 12:11 Uhr
7 Kommentare
Neuester Kommentar
Hi Bernd
Nimm bei der letzten Anweisung
die "" bei der set-Anweisung weg:
gretz drop
Nimm bei der letzten Anweisung
@Echo.
set _="gibt es auch"
if exist "%_%NUL" (
echo Datei %_% existiert
) else (
echo Datei %_% existiert nicht
)
@Echo.
<b>set _=gibt es auch</b>
if exist "%_%NUL" (
echo Datei %_% existiert
) else (
echo Datei %_% existiert nicht
)
gretz drop
Moin BerndD,
willkommen im Forum.
Es ist in der Tat so, dass Du den Pfad bzw. "das Argument" für die "if exist"-Prüfung i Hochkommas einschliessen, falls da Leerzeichen enthalten sein könnten.
In Deinem Schnipsel ist eine typische Stelle, die diese Anpassung braucht, diese hier:
Eine syntajtische Möglichkeit der Verbesserung:
Gruss
Biber
willkommen im Forum.
Es ist in der Tat so, dass Du den Pfad bzw. "das Argument" für die "if exist"-Prüfung i Hochkommas einschliessen, falls da Leerzeichen enthalten sein könnten.
In Deinem Schnipsel ist eine typische Stelle, die diese Anpassung braucht, diese hier:
...[kann nicht fliegen: Leerzeichen im SubDir "Delphi 5"]
set _=%WORKDIR%\Addons\DevEx\ExpressCommon\Delphi 5\Sources
if exist %_%/nul (
....
...[könnte fliegen]
set "_=%WORKDIR%\Addons\DevEx\ExpressCommon\Delphi 5\Sources"
if exist "%_%\nul" (
...
--oder auch--
set "_=%WORKDIR%\Addons\DevEx\ExpressCommon\Delphi 5\Sources"
if exist "%_%" (
...
Gruss
Biber
Moin BerndB,
eine offizielle Quelle für das "geänderte Verhalten" habe ich auch nicht parat.
Und dass es OHNE angehängtes "\nul"-Device funktioniert seit ein paar Windowsversionen, das wusste ich zwar und habe auch seit Jahren kein "if exist pfad\nul" mehr verwendet.
Aber dass es MIT angehängtem "...\nul" nicht mehr funktioniert, das war mir auch nicht bewusst.
Nach flüchtigem Test am CMD-Prompt scheint es so auszusehen:
[ mit d:\temp==Verzeichnis ohne Leerzeichen; "Y:\Eigene Dateien" == Verzeichnis mit Leerzeichen]
a1) if exist D:\temp ...----> OK
a2) if exist "D:\temp" ...--> OK
a3) if exist "D:\temp\nul" ...---> Funktioniert nicht
a4) if exist D:\temp\nul ...--->OK
a5) if exist D:\temp\ ...--->OK
a6) if exist "D:\temp\" ...--->OK
b1) if exist "Y:\Eigene Dateien" --->OK
b2) if exist "Y:\Eigene Dateien\" --->OK
b3) if exist "Y:\Eigene Dateien\nul" ---> geht nicht.
Also korrigiere ich mein oben geschriebene Empfehlung und behaupte:
Falls noch jemand eine offizielle M$-Quelle weiß, bitte gerne posten...
Gruss Biber
eine offizielle Quelle für das "geänderte Verhalten" habe ich auch nicht parat.
Und dass es OHNE angehängtes "\nul"-Device funktioniert seit ein paar Windowsversionen, das wusste ich zwar und habe auch seit Jahren kein "if exist pfad\nul" mehr verwendet.
Aber dass es MIT angehängtem "...\nul" nicht mehr funktioniert, das war mir auch nicht bewusst.
Nach flüchtigem Test am CMD-Prompt scheint es so auszusehen:
[ mit d:\temp==Verzeichnis ohne Leerzeichen; "Y:\Eigene Dateien" == Verzeichnis mit Leerzeichen]
a1) if exist D:\temp ...----> OK
a2) if exist "D:\temp" ...--> OK
a3) if exist "D:\temp\nul" ...---> Funktioniert nicht
a4) if exist D:\temp\nul ...--->OK
a5) if exist D:\temp\ ...--->OK
a6) if exist "D:\temp\" ...--->OK
b1) if exist "Y:\Eigene Dateien" --->OK
b2) if exist "Y:\Eigene Dateien\" --->OK
b3) if exist "Y:\Eigene Dateien\nul" ---> geht nicht.
Also korrigiere ich mein oben geschriebene Empfehlung und behaupte:
Die empfohlene Biber-Empfehlung zur Prüfungen von Verzeichnissen:
- sollten üblicherweise in einer Variablen OHNE umschließende Anführungszeichen und OHNE abschließenden "\" gespeichert werden [Set "verz=d:\temp" -bzw- set "verz=Y:\Eigene Dateien"]
- dann führt immer zum richtigen Ergebnis:
if exist "%verz%\" [anweisung]....
Falls noch jemand eine offizielle M$-Quelle weiß, bitte gerne posten...
Gruss Biber
Danke Dir, BerndD,
wieso sollte ich Dir nicht das letzte Wort lassen wollen wollen?
... das habe ich mit meiner Ex jahrelang getan ...
Aber an einer Stelle muss ich doch noch mal richtigstellen:
Test:
Hoffe, hier wird deutlicher, was ich mit "Variablen ohne umschließende Anfü-Zeichen" meinte.
Schönes Wochenende
wieso sollte ich Dir nicht das letzte Wort lassen wollen wollen?
... das habe ich mit meiner Ex jahrelang getan ...
Aber an einer Stelle muss ich doch noch mal richtigstellen:
:: ------------snipp settest.bat -------
:: ----M$-Set-Syntax
@Set var1=hallo world
:: ---Bibers-Set-Syntax
@Set "var2=hallo M$"
:: --- ...und eine Syntax, die tatsächlich eine Variable <b>mit</b>
:: --- ... umschließenden Leerzeichen erzeugt
@Set var3="hallo alle"
@set var
@echo Alles:.....var1:[%var1%] var2:[%var2%] var3:[%var3%]
>settest
var1=hallo world
var2=hallo M$
var3="hallo alle"
Alles:.....var1:[hallo world] var2:[hallo M$] var3:["hallo alle"]
Hoffe, hier wird deutlicher, was ich mit "Variablen ohne umschließende Anfü-Zeichen" meinte.
Schönes Wochenende