juergenl
Goto Top

FOR-Schleife, Wert-Zuweisung eines SUB-Strings

FOR-Schleife, SET-Anweisung, SUB-String

Guten Tag allerseits! (ich bin hier Neuling, - erlaubt mir bitte folgende Anfängerfrage ... )

zum TEST einer FOR-Schleife habe ich mir ein kleines Batchfile geschrieben, welches aus drei Textstrings (xray yest zulu) drei Variable kreieren soll, die jeweils mit dem ANFANGS-Buchstaben des Strings initialisiert werden sollen.

Dabei wollte ich das Substring-Konstrukt '%variable:~n,m%' verwenden. So also meine Befehlszeile in der Batchdatei:

FOR %%i IN (xray,yest,zulu) DO SET %%i_wert=%%i:~0,1%

Danach weist der Befehl 'SET' aber NICHT die angestrebten Ergebniss zu (xray_wert:=x pp), sondern eher die SYNTAX der Substring-Anweisung, also:

xray_wert=xray:~0,1
yest_wert=yest:~0,1
zulu_wert=zulu:~0,1

Nach unzähligen Experimenten mit ALLEM, wovon ich glaubte, es schon verstanden zu haben, frage ich nun lieber die hier versammeltemnExperten: Worin besteht mein Denkfehler?

Danke im Voraus und beste Grüße

Jürgen
<Juergenl>

Content-Key: 27493

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

Printed on: April 19, 2024 at 21:04 o'clock

Member: maneich
maneich Mar 07, 2006 at 01:13:06 (UTC)
Goto Top
Hallo,

in einer Batch in der for-Schleife wird hier i mit %%i aufgerufen, also sollte

%%i:~0,1% eigentlich %%%i:~0,1% sein.

MfG maneich
Member: Juergenl
Juergenl Mar 07, 2006 at 06:25:09 (UTC)
Goto Top
Hallo,

in einer Batch in der for-Schleife wird hier
i mit %%i aufgerufen, also sollte

%%i:~0,1% eigentlich %%%i:~0,1% sein.

MfG maneich

Hallo maneich, danke für Deinen Hinweis!

Leider ändert das zusätzliche '%' aber nichts an dem Effekt, daß NICHT der vorgesehene Wert zugewiesen wird, sondern die Substring-ANWEISUNG. So sieht danach der von der Batch erzeugte Befehl aus:

C:\TEMP>SET xray_wert=%xray:~0,1%

Der Fehlergrund muß also tiefer liegen ...

Beste Grüße

Jürgen
Member: maneich
maneich Mar 07, 2006 at 13:07:51 (UTC)
Goto Top
Hallo,

kann das leider jetzt nicht testen, aber probiere mal folgendes

1. setze vorne und hinten noch %
%%%%i:~0, 1%%

oder

2. über call

FOR %%i IN (xray,yest,zulu) DO call :var %%i

:var
set x=%1
SET %1_wert=%x:~0,1%

MfG maneich
Member: Biber
Biber Mar 07, 2006 at 13:36:11 (UTC)
Goto Top
Moin JuergenL,

:: -------DelayedDemo.Bat
@echo off & setlocal enableDelayedExpansion
set "xray=Alpha" & set "yest=Beta" & set "Zulu=Gamma"  

FOR %%i IN (xray,yest,zulu) DO SET "%%i_wert=!%%i:~0,1!  
set x & set y & set z
:: -------DelayedDemo.Bat

Ergebnis:
xray=Alpha
xray_wert=A
yest=Beta
yest_wert=B
Zulu=Gamma
zulu_wert=G
HTH Biber
[Edit] Bullshit...Frage falsch verstanden. siehe unten. [/Edit]
Member: Biber
Biber Mar 07, 2006 at 19:13:03 (UTC)
Goto Top
Sorry, JuergenL,

hatte zu flüchtig gelesen beim ersten Mal und entsprechend viel zu sehr um die Ecke gedacht.

Das Ganze löst also schon ein Oneliner. Aus optischen Gründen auf zwei Zeilen verteilt.

:: -------DelayedDemo.Bat
@echo off & setlocal EnableDelayedExpansion
FOR %%i IN (xray,yest,zulu) DO set "tmpvar=%%i" &  set "%%i_wert=!tmpvar:~0,1!" & echo %%i_wert: [!%%i_wert!]  
:: -------DelayedDemo.Bat
Output
>DelayedDemo
xray_wert: [x]
yest_wert: [y]
zulu_wert: [z]

Anmerkung: Da ich bei mir DelayedExpansion als CMD-Standard eingestellt habe, kann ich es sogar über <u>eine</u> CMD-Zeile machen:
>@FOR %i IN (xray,yest,zulu) DO @set "tv=%i" & @set "%i_wert=!tv:~0,1!" & @echo %i_wert: [!%i_wert!]  

xray_wert: [x]
yest_wert: [y]
zulu_wert: [z]
Über maneichs Ansatz OHNE DelayedExpansion und mit Sub-Call geht es natürlich auch.
Gruß Biber
Member: Juergenl
Juergenl Mar 08, 2006 at 09:53:52 (UTC)
Goto Top
Hallo allerseits,

besten Dank für beiderseitige Hilfe, die mir eine Reihe von Aha-Erlebnissen beschert hat. (Da habe ich in meiner Unwissenheit offenbar ein größeres Faß aufgemacht .. gg .. )

Ich habe Eure Batch-Clips ausgeführt: Maneich, Deine zweite Varianten führte (in Varianten) hier auch wieder zur Zuweisung von "Syntax-Elementen", also Tilde, Doppelpunkt pp.

Biber, Deine BEIDEN Demo-Clips tun GENAU DAS, was ich ursprünglich gern erzielt hätte!

Ich bin froh über jeden (!) Hinweis, wie man so etwas macht. Mein Problem besteht allerdings darin, daß ich zur Zeit noch Mühe habe, solch anspruchsvollere Anweisungen Schritt für Schritt nachzuvollziehen und zu verstehen, - d.h. künftig "selber machen zu können".

Das Rüstzeug der DOS-Hilfen allein ist leider etwas sperrig, die einschlägigen Angebote im Netz kranken meist daran, daß sie stereotyp Formulierungen aus jenen Hilfetexten wiederholen: Meist also "Statements", ohne Didaktik zu den Hintergründen.

Ich habe zu diesem anspruchsvolleren Stoff bislang noch kein Tutorial gefunden. ( - die hier im Forum angebotenen habe ich mir natürlich zu Gemüte geführt.) Laßt Ihr mich bitte einmal wissen, ob es dafür ein Standard-Werk gibt, - möglichst in Deutsch.

Auf mein spezielles Zuweisungs-Problem, mit dem ich eigentlich "nur" an einem Uhrzeit-Algorithmus basteln wollte, komme ich später gern noch einmal zurück.

Fürs erste nochmals besten Dank und freundliche Grüße

Jürgen
Member: Biber
Biber Mar 08, 2006 at 17:51:38 (UTC)
Goto Top
Moin Jürgen,

ich gebe Dir Recht.. die Infos zum Thema "DelayedExpansion" sind ein bisschen dürftig.
Wir hatten das neulich mal kurz in dem Beitrag Set /p innerhalb von IF von Kollege yashi.. da wird es vielleicht ein bisschen deutlicher.

Ich habe offen gestanden auch ein bisschen versucht, dieses Thema "DelayedExpansion" ein bisschen flach zu halten - in einem meiner Batch-Tutorials (Tut II mit "NumberMe.bat") habe ich dieses Feature ja verwendet... aber musste auch da mit unerwarteten Seiteneffekten leben. Dieses Feature ist -in sinnvoller Dosierung- durchaus nützlich, aber an einigen Stellen schlicht und einfach buggy implementiert..
Ich werde aber noch zu dem Thema DelayedExpansion noch mal ein paar Zeilen hier als Tutorial posten und dann auch gerne yashis Frage und Dein Beispiel-Problem hier im Beitrag zitieren.

Hatte es bisher nicht so eilig damit, weil ich mir gar nicht sicher war, dass sich auch andere Anwender für dieses Thema interessieren.

Grüße Biber
Member: ahe
ahe Nov 22, 2006 at 16:32:18 (UTC)
Goto Top
Windows 2003 Shell Scripting 2. Aufl.
Armin Hanisch

Addison-Wesley

Gibt einen guten Überblick und liest sich flüssig face-smile

Ansonsten ist das Angebot für deutsche Scripting-Literatur entweder auf das Internet beschränkt oder bezieht sich auf VBS/WSH, wobei es dann meist eher was für Entwickler, als für Admins taugt (meist sehr OOP lastig...)

mfg
Axel
Member: Biber
Biber Nov 22, 2006 at 17:43:43 (UTC)
Goto Top
hmm,

ich wüsste gar nicht, wie ich für knapp 60 kombinierbare interne und externe CMD-Befehle so einen 320-Seiten-Wälzer zusammenschreiben könnte...
Selbst wenn ich noch ein paar Oneliner einstreue...

Nein, was ich wirklich sagen wollte:
@ahe: Danke für den Link, Axel.

@all: Bei Addison-Wesley gibt es auch eine kurze PDF-Leseprobe zum Download.

Lockerer geschrieben finde ich allerdings die Zeilen auf seiner Homepage.
Extra-Tipp: Download der Dateien zum Buch mit allen Codeschnipseln und ein paar Freeware-Utilities.

...und diesen Beitrag schließe ich jetzt mal.

Grüße
Biber