Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

if exist funktioniert nicht bei Verzeichnisnamen mit Leerzeichen

Frage Entwicklung Batch & Shell

Mitglied: BerndD

BerndD (Level 1) - Jetzt verbinden

19.04.2007, aktualisiert 20.04.2007, 8487 Aufrufe, 7 Kommentare

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:
01.
@Echo off 
02.
set _=_gibt_es_ 
03.
if exist %_%NUL ( 
04.
echo Datei %_% existiert  
05.
) else ( 
06.
echo Datei %_% existiert nicht 
07.
08.
@Echo. 
09.
set _=gibt es auch 
10.
if exist %_%NUL ( 
11.
echo Datei %_% existiert  
12.
) else ( 
13.
echo Datei %_% existiert nicht 
14.
15.
@Echo. 
16.
set _= gibt_es_nicht 
17.
if exist %_%NUL ( 
18.
echo Datei %_% existiert  
19.
) else ( 
20.
echo Datei %_% existiert nicht 
21.
22.
@Echo. 
23.
set _= gibt es nicht 
24.
if exist %_%NUL ( 
25.
echo Datei %_% existiert  
26.
) else ( 
27.
echo Datei %_% existiert nicht 
28.
29.
@Echo. 
30.
set _="gibt es auch" 
31.
if exist "%_%NUL" ( 
32.
echo Datei %_% existiert  
33.
) else ( 
34.
echo Datei %_% existiert nicht 
35.
)
Hier nun die Ausgabe:
01.
C:asvnBuild>test 
02.
Datei _gibt_es_ existiert 
03.
 
04.
Datei gibt es auch existiert 
05.
Datei gibt es auch existiert nicht 
06.
 
07.
Datei  gibt_es_nicht existiert nicht 
08.
 
09.
Datei  gibt es nicht existiert 
10.
Datei  gibt es nicht existiert nicht 
11.
 
12.
Datei "gibt es auch" existiert 
13.
Datei "gibt es auch" existiert nicht 
14.
C:asvnBuild> 
15.
 
16.
C:asvnBuild>dir *. 
17.
 Volume in Laufwerk C: hat keine Bezeichnung. 
18.
 Volumeseriennummer: 96B9-7E82 
19.
 
20.
 Verzeichnis von C:asvnBuild 
21.
 
22.
19.04.2007  20:39    <DIR>          . 
23.
19.04.2007  20:39    <DIR>          .. 
24.
19.04.2007  20:34    <DIR>          gibt es auch 
25.
19.04.2007  20:33    <DIR>          _gibt_es_ 
26.
               0 Datei(en)              0 Bytes 
27.
               4 Verzeichnis(se),  6.880.346.112 Bytes frei 
28.
 
29.
C:asvnBuild>ver 
30.
 
31.
Microsoft Windows XP [Version 5.1.2600]
Was mache ich falsch und wie wird es richtig gemacht?

Vielen Dank im voraus!
Bernd
Mitglied: drop-ch
19.04.2007 um 21:50 Uhr
Hi Bernd

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

01.
@Echo. 
02.
<b>set _=gibt es auch</b> 
03.
if exist "%_%NUL" ( 
04.
echo Datei %_% existiert  
05.
) else ( 
06.
echo Datei %_% existiert nicht 
07.
)
gretz drop
Bitte warten ..
Mitglied: BerndD
20.04.2007 um 09:29 Uhr
Hi drop,

hast du es bei dir ausprobiert? Dein Vorschlag hatte ich bereits probiert:
01.
@Echo off 
02.
set _=gibt es auch 
03.
if exist "%_%\NUL" ( 
04.
echo Datei %_% existiert  
05.
) else ( 
06.
echo Datei %_% existiert nicht 
07.
)
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:
01.
@Echo off 
02.
if "%1" == "" goto usage 
03.
SET STARTDIR=%CD% 
04.
cd /D .. 
05.
SET ROOTDIR=%CD% 
06.
SET WORKDIR=%ROOTDIR%\%1 
07.
SET DELPHI_DIR=c:\develop\borland\delphi5 
08.
SET OUTPUT_DIR=%DELPHI_DIR%\Projects\Bpl 
09.
SET BRCC32=%DELPHI_DIR%\BIN\BRCC32.EXE 
10.
SET DCC32=%DELPHI_DIR%\bin\dcc32.exe -B -N"%ROOTDIR%\%1\units" -LE%OUTPUT_DIR% -LN%OUTPUT_DIR% -U%OUTPUT_DIR% 
11.
SET regfile=%ROOTDIR%\Packages.reg 
12.
SET UNIT_OUTPUT_DIR=c:\a\svn\diss4usb\Units 
13.
SET DCC32=%DELPHI_DIR%\bin\dcc32.exe -LE%OUTPUT_DIR% -LN%OUTPUT_DIR% -U%OUTPUT_DIR% -N%UNIT_OUTPUT_DIR% 
14.
SET RegPath=HKEY_CURRENT_USER\Software\Borland\Delphi\5.0\Known Packages 
15.
Echo REGEDIT4 >%regfile% 
16.
Echo. >>%regfile% 
17.
Echo [%RegPath%] >>%regfile% 
18.
 
19.
set _=%WORKDIR%\Addons\DevEx\ExpressCommon\Delphi 5\Sources 
20.
if exist %_%/nul ( 
21.
echo ---------------------------------------- 
22.
echo Build %_% 
23.
echo ---------------------------------------- 
24.
cd /D %_% 
25.
%DCC32% dxComnD5.dpk 
26.
if errorlevel 1 goto Fail 
27.
echo "$(DELPHI)\\Projects\\Bpl\\dxComnD5.bpl"="ExpressCommon by Developer Express Inc.">>%regfile% 
28.
29.
if exist %_%/nul goto w0 
30.
echo "$(DELPHI)\\Projects\\Bpl\\dxComnD5.bpl"=->>%regfile% 
31.
:w0 
32.
: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.
Bitte warten ..
Mitglied: Biber
20.04.2007 um 10:25 Uhr
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:
01.
...[kann nicht fliegen: Leerzeichen im SubDir "Delphi 5"] 
02.
set _=%WORKDIR%\Addons\DevEx\ExpressCommon\Delphi 5\Sources 
03.
if exist %_%/nul ( 
04.
....
Eine syntajtische Möglichkeit der Verbesserung:
01.
...[könnte fliegen] 
02.
set "_=%WORKDIR%\Addons\DevEx\ExpressCommon\Delphi 5\Sources" 
03.
if exist "%_%\nul" ( 
04.
... 
05.
 
06.
--oder auch-- 
07.
set "_=%WORKDIR%\Addons\DevEx\ExpressCommon\Delphi 5\Sources" 
08.
if exist "%_%" ( 
09.
...
Gruss
Biber
Bitte warten ..
Mitglied: BerndD
20.04.2007 um 12:37 Uhr
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!
Bitte warten ..
Mitglied: Biber
20.04.2007 um 13:38 Uhr
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
Bitte warten ..
Mitglied: BerndD
20.04.2007 um 15:46 Uhr
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:
01.
set verz=Y:\Eigene Dateien 
02.
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
Bitte warten ..
Mitglied: Biber
20.04.2007 um 16:12 Uhr
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:

01.
:: ------------snipp settest.bat ------- 
02.
:: ----M$-Set-Syntax 
03.
@Set var1=hallo world 
04.
:: ---Bibers-Set-Syntax 
05.
@Set "var2=hallo M$" 
06.
:: --- ...und eine Syntax, die tatsächlich eine Variable <b>mit</b>  
07.
:: --- ... umschließenden Leerzeichen erzeugt 
08.
@Set var3="hallo alle" 
09.
@set var 
10.
@echo Alles:.....var1:[%var1%] var2:[%var2%] var3:[%var3%]
Test:
01.
>settest 
02.
var1=hallo world 
03.
var2=hallo M$ 
04.
var3="hallo alle" 
05.
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Router & Routing
Transparenter Proxy funktioniert nicht? (1)

Frage von mrserious73 zum Thema Router & Routing ...

Linux
LTSP: PXE Boot funktioniert nicht (23)

Frage von Fenris14 zum Thema Linux ...

Microsoft Office
gelöst Dropdownlisten in Abhängigkeit mit Leerzeichen im Namen (Datenüberprüfung) (2)

Frage von kevische zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...