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

Parameter SICHER einer Variable zuweisen?

Frage Entwicklung Batch & Shell

Mitglied: jeb-the-batcher

jeb-the-batcher (Level 1) - Jetzt verbinden

05.10.2010, aktualisiert 17:16 Uhr, 8654 Aufrufe, 11 Kommentare

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.

param.bat one^&two"&three

Denn diese Varianten schlagen alle fehl

01.
set var=%1 
02.
set "var=%1" 
03.
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.

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.
Mitglied: miniversum
05.10.2010 um 18:42 Uhr
Schildere doch mal den konkreten Anwendungsfall für den du das benötigst?
so ohne es auszuprobieren würd ich jetzt aber einfach mal behaupten das die "& kombination ein Problem bereitet.
Bitte warten ..
Mitglied: jeb-the-batcher
05.10.2010 um 19:08 Uhr
Hallo miniversum,

ich habe keine konkreten Fall, es geht mir darum, ob es prinzipiell möglich ist.
Und schliesslich betrifft es ja auch alle Funktionen innerhalb eines Batchfiles bei dem Strings als Parameter übergeben werden sollen.

call :stringLength result "%myString%"



Die "& Komibination alleine kann man lösen.

param.bat two"&three
01.
set var=%~1
Auch die Kombination one^&two ist für sich alleine kein Problem

param.bat one^&two
01.
set "var=%~1"
Aber bereits die Entscheidung welche Variante man wählen muss, ist schon nicht offensichtlich.
Bitte warten ..
Mitglied: miniversum
05.10.2010 um 19:45 Uhr
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.
Bitte warten ..
Mitglied: pieh-ejdsch
05.10.2010 um 20:44 Uhr
nun entweder ich trenne meine Parameter Klar auf oder ich fasse diese zusammen mit Umschliessenden Anführungszeichen, wenn Leer- & SonderZeichen enthalten sind.

Gruß Phil
Bitte warten ..
Mitglied: jeb-the-batcher
06.10.2010 um 09:03 Uhr
Nun der Sinn ist, zu verstehen wie man Programme sicher schreibt.

Wenn ich z.B. eine Funktion schreibe, dann überlege ich auch ob diese alle Eingaben verkraftet oder in bestimmten Fällen ein falsches Ergebnis liefert oder sogar komplett abstürzt.
Und wenn ich eine Funktion String_Length aufrufe erwarte ich ein korrektes Ergebnis, und nicht ein: "Bei diesem oder jenem String funktioniert das nicht".

Sprich bei Batch möchte ich auch sicher gehen, dass es egal ist welche Parameter übergeben werden, das Batchfile sollte damit zurecht kommen.
Bitte warten ..
Mitglied: pieh-ejdsch
06.10.2010 um 20:33 Uhr
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!" 
in den Batch einbauen - mit diesem wiederum kannst Du gefahrlos weiterarbeiten.

Ob Du nun diese Verzwickte Zeichenfolge in die erste oder zweite CMDZeile hackelst macht es doch nicht unbedingt schwieriger.

Gruß Phil
Bitte warten ..
Mitglied: jeb-the-batcher
06.10.2010 um 21:00 Uhr
Das mit dem set /p ist schon klar.

Aber wenn ich ein batch-File schreibe, dann habe ich vielleicht keinen Einfluss darauf, was jemand an Parametern übergibt.

Zumindestens sollte das Programm erkennen können, dass die Parameter nicht dem erforderlichen Format entsprechen.
Bitte warten ..
Mitglied: pieh-ejdsch
06.10.2010 um 21:44 Uhr
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
Bitte warten ..
Mitglied: rubberman
08.10.2010 um 23:49 Uhr
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
Bitte warten ..
Mitglied: jeb-the-batcher
09.10.2010 um 09:08 Uhr
Ich habe zuerst in der Richtung gesucht mit call set "var=%%1" und call call set %%caret%%"var2=%%1"
und dann aus var und var2 die Lösung zusammen zu basteln.
Klappt aber auch nicht mit allen Strings
"&"^&

Den REM Befehl, habe ich dann auch als Lösung gefunden.
Der Trick besteht darin, die Ausgabe in eine Datei zu redirecten.
Denn aus einer Datei kann man problemlos zerstörungsfrei lesen.

Das Problem ist, dass man die Debugausgabe nicht direkt umleiten kann.
01.
>debug.txt rem %1 
Klappt also nicht

Dafür klappt dies
01.
echo on 
02.
call :func > debug.txt 
03.
goto :eof 
04.
:func 
05.
rem This %1 
06.
goto :eof
Nur leider kann man in der Funktion nicht mehr auf %1 der Batch zugreifen.

Das ganze klappt auch nicht mit einer umgeleiteten For-Schleife, aber mit zweien

01.
@echo off 
02.
 
03.
 
04.
setlocal DisableDelayedExpansion 
05.
set "prompt=X" 
06.
for %%a in (1 ) do ( 
07.
	@echo on 
08.
	for %%b in (4) do ( 
09.
		rem #%1# 
10.
	)  
11.
) > XY.txt 
12.
@echo off 
13.
for /F "delims=" %%a in (xy.txt) DO ( 
14.
  set "param=%%a" 
15.
16.
setlocal EnableDelayedExpansion 
17.
rem set param=!param:~7,-4! 
18.
echo param='!param!' 
19.
@goto :eof
Die #%1# ist dazu da, mögliche Multiline Kombinationen zu unterdrücken.
Denn auch in einem Rem wird ^ ausgewertet, allerdings nur wenn es am ersten Token (nach dem REM) hängt
01.
rem This is a remark^ 
02.
rem This_is_a_multiline^ 
03.
rem "This is also a multiline"^
jeb
Bitte warten ..
Mitglied: rubberman
09.10.2010 um 15:47 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Batch: Variable einen Wert zuweisen (7)

Frage von sascha382 zum Thema Batch & Shell ...

JavaScript
AngularJS Variable über Input in Funktion ausführen

Frage von badkilla zum Thema JavaScript ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

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

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...