meandmyself
Goto Top

Anmeldename kürzen mit Bedingung per batch

Hallo zusammen,

wir möchten aus dem (in der registry hinterlegten) (Novell-)Anmeldenamen ein Benutzerkürzel zusammensetzen und diesen als Variable speichern, um ihn dann weiterverarbeiten zu können.

Die Schwierigkeit ist, dass der Anmeldename (hier: NWUSERNAME) nicht einheitlich aufgebaut ist. In einem Fall besteht er nur aus dem Nachnamen (klein geschrieben oder mit Anfangsbuchstabe gross), in anderen Fällen, wo der Nachname nicht individuell ist (z. B. wenn es zwei Müller gibt), lautet er beispielhaft "MüllerA" und "MüllerB" für Anton Müller und Berta Müller.
Nun soll aus "Musterfrau" bzw. "musterfrau" die ersten zwei Anfangsbuchstaben für das Kürzel extrahiert werden, also Mu bzw. mu, wenn der Anmeldename am Ende kein Grossbuchstabe ist. Wenn das der Fall ist, sollen die ersten zwei Anfangsbuchstaben und der letzte Buchstabe als Grossbuchstabe zusammengesetzt werden, sodass aus "MüllerB" MüB wird.

Bisher hab ich für die ersten 2 Anfangsbuchstaben:

@echo off & setlocal

chcp 1252

set "regkey="HKCU\Volatile Environment""  
Set "qrycmd= reg query %regkey% /v NWUSERNAME"  
FOR /F "tokens=2*" %%i in ('%QryCmd%^|find "REG_SZ"') do set "nwusername=%%j"  

set initial=%nwusername%
set iniEnd=%initial:~-1%
set ini=%initial:~0,2%
set ini2=%ini%%iniEnd%

chcp 850
echo %ini2%
pause

Wie krieg´ ich den zweiten Teil der Bedingung mit dem Grossbuchstaben hin?

Vielen Dank und Gruß,
meandmyself

Content-Key: 155020

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

Printed on: April 16, 2024 at 05:04 o'clock

Member: rubberman
rubberman Nov 13, 2010 at 14:20:02 (UTC)
Goto Top
Hallo meandmyself.

Du brauchst einen Befehl, der Groß- und Kleinbuchstaben unterscheiden kann. FIND oder FINDSTR bieten sich an.
* snipp
echo\%iniEnd%|findstr "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Ä Ö Ü" >nul &&(  
  set "ini2=%ini%%iniEnd%"  
) || (
  set "ini2=%ini%"  
)
* snipp
Wenn du FINDSTR benutzt, kannst du das unter Verwendung von regulären Ausdrücken noch etwas vereinfachen.

Grüße
rubberman

<EDIT: zu FINDSTR geändert />
Member: meandmyself
meandmyself Nov 13, 2010 at 14:34:47 (UTC)
Goto Top
Hallo rubberman,

dankesehr, aber ich verstehe deinen Code glaube ich nicht, in der ersten Zeile sucht er nach Grossbuchstaben in der %iniEnd%-Variable und dann?
Wenn ich deine Code einfüge, bekomme ich beim Beispiel "MüllerA" nur am echo raus.

Danke für weitere Anregungen,

meandmyself
Member: meandmyself
meandmyself Nov 13, 2010 at 14:38:04 (UTC)
Goto Top
Hallo rubberman,

dankesehr, aber ich verstehe deinen Code nicht ganz, in der ersten Zeile sucht er nach Grossbuchstaben in der Variablen %iniEnd% und dann?

Wenn ich dein Beispiel einfüge, bekomme ich für MüllerA am echo ausgeworfen.

Danke für weitere Anregungen,

meandmyself
Member: meandmyself
meandmyself Nov 13, 2010 at 14:39:33 (UTC)
Goto Top
oops, sorry für das Doppelposting.
Member: rubberman
rubberman Nov 13, 2010 at 15:06:09 (UTC)
Goto Top
Hallo meandmyself.

Dann mal gleich mit FINDSTR. FIND funktioniert natürlich anders, sorry.
echo\%iniEnd%|findstr "[A-Z] Ä Ö Ü" >nul &&(  
  set "ini2=%ini%%iniEnd%"  
) || (
  set "ini2=%ini%"  
)

Grüße
rubberman
Member: meandmyself
meandmyself Nov 13, 2010 at 15:11:32 (UTC)
Goto Top
super, nun wirft er für "JemandX" JeX aus, aber bei "Jemand" sollte nur Je rauskommen statt Jed? Woran liegt das?
Danke für dein Hilfe.

Gruß,
meandmyself
Member: rubberman
rubberman Nov 13, 2010 at 15:32:05 (UTC)
Goto Top
Hallo meandmyself.

Liegt wahrscheinlich daran, dass du es nicht richtig in deinen Code eingebaut hast.
@echo off & setlocal

chcp 1252>nul

set "regkey="HKCU\Volatile Environment""  
Set "qrycmd= reg query %regkey% /v NWUSERNAME"  
FOR /F "tokens=2*" %%i in ('%QryCmd%^|find "REG_SZ"') do set "nwusername=%%j"  

set "iniEnd=%nwusername:~-1%"  
set "ini=%nwusername:~0,2%"  
echo\%iniEnd%|findstr "[A-Z] Ä Ö Ü" >nul &&(  
  set "ini2=%ini%%iniEnd%"  
) || (
  set "ini2=%ini%"  
)

chcp 850>nul
echo %ini2%
pause

Grüße
rubberman
Member: meandmyself
meandmyself Nov 13, 2010 at 15:36:51 (UTC)
Goto Top
nee, auch mit exakt deinem Code kommt "Jed" raus.

Noch ne Idee? Danke.
Member: rubberman
rubberman Nov 13, 2010 at 16:04:22 (UTC)
Goto Top
Das verwirrt mich gerade etwas, aber du hast recht. Der reguläre Ausdruck [A-Z] wird nicht richtig verwendet. Selbst mit Option /R nicht.
Es funktioniert aber mit der ausführlichen Version. Ersetze Zeile 11 durch
echo\%iniEnd%|findstr "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Ä Ö Ü" >nul &&(  
Vielleicht kann jemand anders erklären warum. Mir fällt da gerade nichts ein.

Grüße
rubberman
Member: meandmyself
meandmyself Nov 13, 2010 at 18:42:00 (UTC)
Goto Top
Genial, jetzt klappt´s! Nochmals dankeschön für deine Unterstützung.

Beste Grüße,

meandmyself
Mitglied: 76109
76109 Nov 14, 2010 at 13:51:16 (UTC)
Goto Top
Member: pieh-ejdsch
pieh-ejdsch Nov 14, 2010 at 16:29:46 (UTC)
Goto Top
Moin zusammen,
Zitat von @rubberman:
Das verwirrt mich gerade etwas, aber du hast recht. Der reguläre Ausdruck [A-Z] wird nicht richtig verwendet. Selbst mit Option /R nicht.
Vielleicht kann jemand anders erklären warum. Mir fällt da gerade nichts ein.

ganz einfach: findstr sucht in einen Angegebenen Bereich von Buchstaben erst den kleinen Buchstaben dann den großen Buchstaben.
Wird der SuchBereich mit kleinen Buchstaben angegeben wird der Buchstabe nach dem Bindestrich als GroßBuchstabe nicht gesucht.
echo\Ab|findstr "[a-B]"
findet auch ein großes A und auch ein kleines b

echo\aB|findstr "[A-b]"
findet dagegen nichts

echo\"%nwusername:~-1%"|findstr "[ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ]"&&(  
	set "ini2=%nwusername:~0,2%%nwusername:~-1%"  
) || ( ....)
würde Zeile 9 und 10 überflüssig machen.

Gruß Phil
Member: rubberman
rubberman Nov 14, 2010 at 17:11:37 (UTC)
Goto Top
Moin pieh-ejdsch.

Ja aber ... ich hab doch mit [A-Z] einen Bereich angegeben, der ausschließlich Großbuchstaben umfasst. Wie kommt findstr dazu (ohne dass Option /i angegeben ist) auch Kleinbuchstaben zu matchen. Irgendwie will mir das noch nicht einleuchten. Du hast es mit einer Klasse gelöst, aber wie müsste denn ein Bereich definiert werden, damit das funktioniert?

Grüße
rubberman