berndd
Goto Top

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:
@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
)
Hier nun die Ausgabe:
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

Content-Key: 57115

Url: https://administrator.de/contentid/57115

Printed on: April 24, 2024 at 07:04 o'clock

Mitglied: 17243
17243 Apr 19, 2007 at 19:50:53 (UTC)
Goto Top
Hi Bernd

Nimm bei der letzten Anweisung
@Echo.
set _="gibt es auch"  
if exist "%_%NUL" (  
echo Datei %_% existiert 
) else (
echo Datei %_% existiert nicht
)
die "" bei der set-Anweisung weg:

@Echo.
<b>set _=gibt es auch</b>
if exist "%_%NUL" (  
echo Datei %_% existiert 
) else (
echo Datei %_% existiert nicht
)

gretz drop
Member: BerndD
BerndD Apr 20, 2007 at 07:29:54 (UTC)
Goto Top
Hi drop,

hast du es bei dir ausprobiert? Dein Vorschlag hatte ich bereits probiert:
@Echo off
set _=gibt es auch
if exist "%_%\NUL" (  
echo Datei %_% existiert 
) else (
echo Datei %_% existiert nicht
)

Leider funktioniert das nicht, das Verzeichnis wird nicht gefunden. Ich habe bereits mehr durchprobiert als ich hier posten kann. Das ich an sowas einfachen scheitere ist schon sehr frustrierend. Das Problem scheint jedenfalls nicht so einfach zu sein als es im ersten Moment aussieht.

Meine original Anwendung, bei den ich den Fehler entdeckt habe, ist noch anders. Ich hatte die Test-Batch nur geschrieben um euch das reindenken in meine Anwendung zu ersparen. Hier nun doch ein Ausschnitt:
@Echo off
if "%1" == "" goto usage  
SET STARTDIR=%CD%
cd /D ..
SET ROOTDIR=%CD%
SET WORKDIR=%ROOTDIR%\%1
SET DELPHI_DIR=c:\develop\borland\delphi5
SET OUTPUT_DIR=%DELPHI_DIR%\Projects\Bpl
SET BRCC32=%DELPHI_DIR%\BIN\BRCC32.EXE
SET DCC32=%DELPHI_DIR%\bin\dcc32.exe -B -N"%ROOTDIR%\%1\units" -LE%OUTPUT_DIR% -LN%OUTPUT_DIR% -U%OUTPUT_DIR%  
SET regfile=%ROOTDIR%\Packages.reg
SET UNIT_OUTPUT_DIR=c:\a\svn\diss4usb\Units
SET DCC32=%DELPHI_DIR%\bin\dcc32.exe -LE%OUTPUT_DIR% -LN%OUTPUT_DIR% -U%OUTPUT_DIR% -N%UNIT_OUTPUT_DIR%
SET RegPath=HKEY_CURRENT_USER\Software\Borland\Delphi\5.0\Known Packages
Echo REGEDIT4 >%regfile%
Echo. >>%regfile%
Echo [%RegPath%] >>%regfile%

set _=%WORKDIR%\Addons\DevEx\ExpressCommon\Delphi 5\Sources
if exist %_%/nul (
echo ----------------------------------------
echo Build %_%
echo ----------------------------------------
cd /D %_%
%DCC32% dxComnD5.dpk
if errorlevel 1 goto Fail
echo "$(DELPHI)\\Projects\\Bpl\\dxComnD5.bpl"="ExpressCommon by Developer Express Inc.">>%regfile%  
)
if exist %_%/nul goto w0
echo "$(DELPHI)\\Projects\\Bpl\\dxComnD5.bpl"=->>%regfile%  
:w0
:Fail

Es ist eine automatisch generierte Batch Datei die alle zu einen Projekt gehörenden Dateien compilieren soll. Ich habe es für hier auf ein Verzeichnis gekürzt. Ob bestimmte Dateien kompiliert werden müssen, entscheidet sich anhand der Existenz des Hauptverzeichnisses. Ich habe bei dieser Batchdatei auf den ELSE Zweig verzichtet und statt dessen zweimal if exist verwendet. Das verrückte daran ist, das bei der ersten Abfrage das Verzeichnis erkannt, bei der zweiten Abfrage aber nicht mehr erkannt wird. Für mich sieht das so aus, als hätte der Kommandointerpreter von XP einen Fehler. Auch hier hilft ein setzen in Hochkommas nicht. Jedenfalls habe ich keine funktionierende Variante gefunden.

Ich habe für das Problem bereits viel zu viel Zeit aufgewendet, mehr als ich gegenüber meinen Chef rechtfertigen könnte. Ich wäre euch deshalb sehr dankbar wenn jemand verifizieren könnte ob es eine unter XP funktionierende Variante gibt.
Member: Biber
Biber Apr 20, 2007 at 08:25:46 (UTC)
Goto Top
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:
...[kann nicht fliegen: Leerzeichen im SubDir "Delphi 5"]  
set _=%WORKDIR%\Addons\DevEx\ExpressCommon\Delphi 5\Sources
if exist %_%/nul (
....
Eine syntajtische Möglichkeit der Verbesserung:
...[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
Member: BerndD
BerndD Apr 20, 2007 at 10:37:25 (UTC)
Goto Top
Hallo Biber,

bei deinen 1. Vorschlag wird das Verzeichnis nicht gefunden, der 2. Vorschlag funktioniert! Nach meinen Unterlagen dürfte er das aber nicht, weil if exist nicht auf Verzeichnisse angewendet werden kann. Deshalb gibt es ja den Trick mit \nul. Doch offensichtlich ist das unter XP nicht mehr so. Kannst du mir eine "offizielle" Quelle angeben, wo steht ab wann \nul nicht mehr benötigt wird?

Mir ist noch aufgefallen, das ich in meiner Batch-Datei ein Schrägstrich statt ein Backslash benutzt habe um das nul-Gerät dranzuhängen. Das geht bei Dateien ohne Leerzeichen trotzdem.

Vielen Dank für eure Hilfe!
Member: Biber
Biber Apr 20, 2007 at 11:38:49 (UTC)
Goto Top
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:
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
Member: BerndD
BerndD Apr 20, 2007 at 13:46:58 (UTC)
Goto Top
Hallo Biber,

du hast die Sache auf den Punkt gebracht, nur deine set Beispiele sind etwas unglücklich, weil man sich bein ersten Blick fragt: Nun doch mit Hochkommas?

Also nochmal deutlicher:
set verz=Y:\Eigene Dateien
if exist "%verz%\" [anweisung]...  

Aber eigentlich wollte ich nicht das letzte Wort haben, sonder mich nochmals bei dir bedanken. Wenn man im Archiv sucht, sieht man sehr schnell, das du hier sowas wie die Seele vom Forum bist. Als einer der in die meisten Foren nur mal reinstolpert "wenn es mal wieder brennt", möchte ich nicht gehen ohne dir zu sagen das ich großen Respekt vor Menschen wie dir habe. Ich bin zwar nicht die gute Fee (die drei Wünsche zu vergeben hat) aber wenn ich dir ein Gefallen tun kann - dann zögere nicht mich darum zu bitten.

Gruß
Bernd
Member: Biber
Biber Apr 20, 2007 at 14:12:04 (UTC)
Goto Top
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:

:: ------------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%]
Test:
>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