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:
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:
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
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:
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
und ich habe wieder ein doppeltes Anführungszeichen und cmd steigt aus.
Nächster Versuch ist der folgende:
(ziemlich von hinten durch die Brust!)
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:
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?
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!
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!
if ""c:\Pfad mit Leerzeichen""=="" goto fehler
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!
"=
if ""="=="" goto fehler
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:#=%
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:"=%
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 337146
Url: https://administrator.de/contentid/337146
Ausgedruckt am: 22.11.2024 um 02:11 Uhr
2 Kommentare
Neuester Kommentar