Top-Themen

Aktuelle Themen (A bis Z)

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, 8808 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 ..
Ähnliche Inhalte
Batch & Shell
If Exists auf Datei in Pfad mit Leerzeichen?
Frage von TheRealErebosBatch & Shell6 Kommentare

Hallo, ich habe ein Problem mit einem Batch. Ich möchte gerne prüfen ob Datei 1 nicht mehr vorhanden ist ...

VB for Applications
If exist - if not exist in .vbs - Datei
gelöst Frage von Komoran12VB for Applications24 Kommentare

Moin, moin, vielleicht hat jemand ja einen Tipp für mich. Mit nachfolgender .vbs lasse ich mir einen Messagebox ausgeben: ...

Batch & Shell
Robocopy Pfad mit Leerzeichen in Anführungsstrichen funktioniert nicht
gelöst Frage von imebroBatch & Shell13 Kommentare

Hallo, ich nutze eine Batchdatei für das kopieren mit robocopy. Darin habe ich einen Zielpfad, der Leerzeichen enthält. Egal ...

PHP
Dateiendung und Verzeichnisname aus Scriptausgabe entfernen
Frage von Martin-BRPHP8 Kommentare

Hallo zusammen, ich möchte gerne in einem bereits vorhanden Script das Verzeichnis und die Dateiendung in der Ausgabe entfernen. ...

Neue Wissensbeiträge
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 16 StundenBatch & Shell8 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 18 StundenHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...

Windows 10
Bitlocker nach Verschlüsselung nicht mehr aufrufbar!
gelöst Frage von alexlazaWindows 1013 Kommentare

Hallo, ich besitze ein HP ZBook 17 G4 mit einem Windows 10 Pro Betriebssystem. Bei diesem Problem handelt sich, ...

Batch & Shell
Neuste Datei via PowerShell kopieren
gelöst Frage von kaiuwe28Batch & Shell11 Kommentare

Hallo zusammen, ich hatte mir mit Hilfe der Suche im Forum einen kleinen Code von colinardo rausgesucht und versucht ...