zimbosmurf
Goto Top

Windows Batch - Drag and Drop - prüfen ob Parameter leer

Hallo!

Ich habe ein Batch-Skript für eine Backuproutine entworfen, das aufgerufen werden soll, indem man einen Ordner auf das Skript zieht. Aus diesem Ordner wird dann das Backup in das laufende System zurückgespielt.

Eleganterweise würde ich gerne prüfen, ob das Skript wirklich per Drag and Drop gestartet wurde oder einfach per Doppelklick. In letzterem Fall (Kein Parameter) soll das Skript eine Fehlermeldung ausgeben und sich beenden.

Mein erster Versuch war der folgende:
@Echo off
if %1=="" goto fehler  
Echo Alles ist gut, das Skript wird jetzt weiter ausgeführt!
Die Bedingung wird aber nie true, denn es wird 'nichts' mit einem String verglichen, der aus zwei Anführungszeichen besteht.

Also habe ich in einem nächsten Versuch das ganze mit Anführungszeichen um die %1 abgeändert:
@Echo off
if "%1"=="" goto fehler  
Echo Alles ist gut, das Skript wird jetzt weiter ausgeführt!
Jetzt bricht das Skript korrekt ab, wenn kein Parameter ausgegeben wurde, arbeitet korrekt, wenn ein einfacher Pfad übergeben wird, steigt aber aus, wenn ein Pfad mit Leerzeichen übergeben wird, denn der Pfad mit Leerzeichen kommt als "c:\Pfad mit Leerzeichen" (und die Anführungszeichen sind Teil des Strings!) in der Batch-Datei an und der Vergleich lautet dann
if ""c:\Pfad mit Leerzeichen""=="" goto fehler  
und bei den doppelten Anführungszeichen steigt cmd aus.

Nächste Idee: Naja, dann strippe ich halt die Anführungszeichen aus dem Parameter weg, bevor ich vergleiche Ich brauche ihn nachher sowieso ohne die Anführungszeichen, weil ich an den Pfad noch Strings anhängen möchte um gezielt Unterpfade anzusprechen:
@Echo off
set config_path=%1
set config_path=%config_path:"=%  
if "%config_path%"=="" goto fehler  
Echo Alles ist gut, das Skript wird jetzt weiter ausgeführt!
Jetzt klappt alles wunderbar, wenn ich Pfade mit oder ohne Leerzeichen übergebe, dafür steigt cmd aus, wenn ich mit einem Doppelklick ohne Parameter starte, denn aus dem nicht vorhandenen Parameter wird durch den Versuch zu strippen
"=  
und dadurch endet mein Vergleich als
if ""="=="" goto fehler  
und ich habe wieder ein doppeltes Anführungszeichen und cmd steigt aus.

Nächster Versuch ist der folgende:
(ziemlich von hinten durch die Brust!)
@echo off
set config_path=%1
set config_path=#%config_path%#
if %config_path%==## goto fehler
set config_path=%config_path:"=%  
set config_path=%config_path:#=%
Diese Variante funktioniert jetzt endlich in allen drei Varianten! An einen Pfad, egal ob mit oder ohne Leerzeichen und Anführungszeichen, werden vorne und hinten die # angehängt, ein leerer Parameter wird somit zu ## und der Vergleich funktioniert, danach werden beim Pfad die # und Anführungszeichen wieder weggestrippt. Problem: der # (und viele andere Zeichen, die ich stattdessen verwenden könnte, auch) darf auch ganz normal in einem Ordner- oder Dateinamen vorkommen. Ist zwar unwahrscheinlich, aber nicht unmöglich.

Aktuell letzter Versuch war dann der folgende, sehr ähnliche:
@echo off
set config_path=%1
if #%config_path%#==## goto fehler
set config_path=%config_path:"=%  
Der funktioniert jetzt endlich so, wie ich es mir erhoffe, macht auch keine Probleme, wenn das # im Pfad steckt und scheint mir die praktikabelste Lösung zu sein. Schön finde ich es trotzdem nicht.

Meine Frage:
Gibt es für dieses - ja eigentlich nicht ungewöhnliche - Problem nicht eine elegantere Lösung? Bin ich zu doof, um das offensichtliche zu sehen?

Content-Key: 337146

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

Ausgedruckt am: 19.03.2024 um 11:03 Uhr

Mitglied: 132895
Lösung 132895 08.05.2017 aktualisiert um 13:00:57 Uhr
Goto Top
Mitglied: zimbosmurf
zimbosmurf 08.05.2017 um 13:57:32 Uhr
Goto Top
Da ist das offensichtliche! Super! Vielen Dank!

Und Danke für die verlinkte Übersicht!