Parameter SICHER einer Variable zuweisen?
Ist es generell möglich einen Parameter (%1) einer Variablen zuzuweisen?
Nein. Die Antwort ist nicht trivial!
Bereits bei meinem ersten Beispiel finde ich keine Lösung.
Denn diese Varianten schlagen alle fehl
Das Problem ist offensichtlich, die Verarbeitung der Sonderzeichen.
Die stellen kein Problem mehr da, wenn man den Inhalt erst mal in einer Variablen hat, aber wie bekommt man das erst mal hin?
Meine Versuche mit
Bei DelayedExpansion wird gar nicht aufgelöst, ebenso wenig bei for-loop variabeln.
Der Versuch mit call verschiebt das Problem einfach nur in den zweiten Parser-Lauf, dort wird beim Auffinden von Sonderzeichen gleich die Bearbetung gestoppt, das ist zwar noch besser als die anderen Varianten, aber scheinbar auch kein Lösungsansatz.
Aber vielleicht hat ja noch jemand eine bessere Idee.
Nein. Die Antwort ist nicht trivial!
Bereits bei meinem ersten Beispiel finde ich keine Lösung.
param.bat one^&two"&three
Denn diese Varianten schlagen alle fehl
set var=%1
set "var=%1"
set "var=%~1"
Das Problem ist offensichtlich, die Verarbeitung der Sonderzeichen.
Die stellen kein Problem mehr da, wenn man den Inhalt erst mal in einer Variablen hat, aber wie bekommt man das erst mal hin?
Meine Versuche mit
set "var=!1"
for %%a in (dumm) do set var=%%1
call set var=%%1
scheitern leider auch alle.for %%a in (dumm) do set var=%%1
call set var=%%1
Bei DelayedExpansion wird gar nicht aufgelöst, ebenso wenig bei for-loop variabeln.
Der Versuch mit call verschiebt das Problem einfach nur in den zweiten Parser-Lauf, dort wird beim Auffinden von Sonderzeichen gleich die Bearbetung gestoppt, das ist zwar noch besser als die anderen Varianten, aber scheinbar auch kein Lösungsansatz.
Aber vielleicht hat ja noch jemand eine bessere Idee.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 152411
Url: https://administrator.de/contentid/152411
Ausgedruckt am: 08.11.2024 um 21:11 Uhr
11 Kommentare
Neuester Kommentar
Ok dann haben wir zwei unterschiedliche Auffassungen. Den ich sehe keinen Sinn in so einer Konstruktion und daher ist eine rein theoretische Lösung für ein nicht vorhandenes, nur rein erdachtes Problem es mit einfach nicht wert darüber nachzudenken, sorry. Sollte ich ein ähnliches Problem in der Praxis wirklich haben würde ich eine speziell dafür angepaste Lösung verwenden die die vorhandene Umgebung berücksichtigt. Ich hätte dann dann auch kein Problem auf eine andere Sprache umzusteigen.
Nun der Sinn ist, zu verstehen wie man Programme sicher schreibt.
aber grundlegend gibst Du doch dem Bachprogramm als Parameter mit was auch klar unterschieden werden kann.
- Optionen mit einem führenden / slash
- Pfad\Dateinamen mit SonderZeichen in Anführungszeichen
da die (Umschliessenden) Anführungszeichen Sonder - Sonderzeichen sind, sollten diese nur zum ParameterBegrenzen benutzt werden wenn die Restlichen Sonderzeichen für welche eines Dateinamens stehen.
für solche ProblemZeichen kannst Du doch den Befehl
SET /P var=Bitte gib die zu bearbeitende Zeichenfolge ein
oder
SET /P "var=Bitte gib die zu bearbeitende Zeichenfolge ein & drueck Eingabe!"
Ob Du nun diese Verzwickte Zeichenfolge in die erste oder zweite CMDZeile hackelst macht es doch nicht unbedingt schwieriger.
Gruß Phil
da gibst Du dem Batch eine Aussagekräftige Hilfe mit, welche der Anwender im Zweifelsfall als Dokumentation durchlesen kann.
so hab ich es bei Script Programmcode auch gemacht
Ich weis .... Version 1.9 ist auch schon fast fertig - coming soon
PS: Deine Originale ParameterÜbergabe übersteht es auch! (wenigstens mit einer Fehlermeldung)
Gruß Phil
so hab ich es bei Script Programmcode auch gemacht
Ich weis .... Version 1.9 ist auch schon fast fertig - coming soon
PS: Deine Originale ParameterÜbergabe übersteht es auch! (wenigstens mit einer Fehlermeldung)
Gruß Phil
Hallo jeb,
habe keinerlei Lösung finden können. Der einzige Befehl, der deinen Beispielparameter überhaupt als literalen Ausdruck interpretiert, scheint REM zu sein. Bei eingeschaltetem Prompt bekomme ich
>rem one&two"&three
angezeigt.
Wie das dabei helfen könnte, den Spaß in eine Umgebungsvariable zu packen ist mir allerdings selbst schleierhaft.
Grüße
rubberman
habe keinerlei Lösung finden können. Der einzige Befehl, der deinen Beispielparameter überhaupt als literalen Ausdruck interpretiert, scheint REM zu sein. Bei eingeschaltetem Prompt bekomme ich
>rem one&two"&three
angezeigt.
Wie das dabei helfen könnte, den Spaß in eine Umgebungsvariable zu packen ist mir allerdings selbst schleierhaft.
Grüße
rubberman
Hallo jeb.
Dass man das ganze in eine Datei umleiten sollte, war mir irgendwie schon klar. Anfangs dachte ich dass mir irgend ein sinnentfremdeter Befehl (wie TYPE %1 o.ä.) eine brauchbare Fehlermeldung ausspuckt.
REM umleiten zu wollen habe ich allerdings gleich wieder verworfen, da REM keinen Stream zu StdOut oder StdErr sendet. Um so mehr überrascht mich, dass es über Umwege doch funktioniert.
Grüße
rubberman
Dass man das ganze in eine Datei umleiten sollte, war mir irgendwie schon klar. Anfangs dachte ich dass mir irgend ein sinnentfremdeter Befehl (wie TYPE %1 o.ä.) eine brauchbare Fehlermeldung ausspuckt.
REM umleiten zu wollen habe ich allerdings gleich wieder verworfen, da REM keinen Stream zu StdOut oder StdErr sendet. Um so mehr überrascht mich, dass es über Umwege doch funktioniert.
Grüße
rubberman