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

Mehrere Variablen bzw. Zahlen vergleichen und den höchsten Wert ausgeben

Frage Entwicklung Batch & Shell

Mitglied: Skyemugen

Skyemugen (Level 2) - Jetzt verbinden

14.02.2011, aktualisiert 11:54 Uhr, 5276 Aufrufe, 6 Kommentare

Aloha alle miteinander (once again),

Kaum ist es Montag, purzeln neue Kniffligkeiten ins Haus. =)

Der Hintergrund des Ganzen ist eine Reparaturpatchung von Charakterdateien für ein privat-MMORPG.

Die folgende Bearbeitung basiert in veränderter Form auf den Code aus meinem Vorgängethread

Ablauf
Mastery1 bis Mastery7 sowie Level werden eigentlich per Schleife aus den .ini-Dateien ausgelesen:
for /f "tokens=2 delims=^=" %%i in ('findstr /n "^" %1^|findstr "^42:"') do set Mastery1=%%i
(wobei ich für jeden einzelnen Wert eine einzelne for-Schleife habe, da die Zeilen sich natürlich ändern [Level = Zeile 6; Mastery1 = Zeile 42 ... Mastery 7 = Zeile 48]

Habe ich hierfür aber fest definiert, um ein besseres Beispiel darstellen zu können.

Ziel
Aus den Werten der Mastery1-7 soll der höchste Wert ermittelt und mit dem Level verglichen werden.
In diesem Fall z.B. haben Mastery1 und Mastery4 ein höheres Level als der Charakte rLevel.

Bisheriger Workaround
Momentan habe ich die ganze Problematik mit einer Rangliste, einer Sortierung und einem Auslesen der Zeile 1 der temporär erstellen Datei gelöst, finde dieses aber unschön und bin auf der Suche nach einem direkteren Weg.

01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
set /a Mastery1=50 
04.
set /a Mastery2=0 
05.
set /a Mastery3=0 
06.
set /a Mastery4=50 
07.
set /a Mastery5=30 
08.
set /a Mastery6=0 
09.
set /a Mastery7=0 
10.
set /a Level=47 
11.
 
12.
set R=%temp%\Liste.log 
13.
set T=%temp%\result.tmp  
14.
if exist %R% del %R% 
15.
if exist %T% del %T% 
16.
 
17.
set /a Anzahl=7 
18.
for /L %%i in (1,1,%Anzahl%) do for /L %%j in (1,1,%Anzahl%) do if !Mastery%%i! leq !Mastery%%j! set /a Rang%%i+=1 
19.
for /L %%i in (1,1,%Anzahl%) do set Wert=!Rang%%i!=!Mastery%%i! && echo !Wert! >>%T% 
20.
 
21.
sort %T% /O %T% 
22.
 
23.
for /f %%m in (%T%) do >>"%R%" echo\%%m 
24.
for /f "tokens=2 delims=^=" %%k in ('findstr /n "^" %R%^|findstr "^1:"') do set LV=%%k 
25.
 
26.
echo Hoechste Mastery ist Level %LV% 
27.
 
28.
if %LV% GTR %Level% ( 
29.
set /a Ausgleich=%LV%-%Level% 
30.
) else ( 
31.
echo kein Masterylevel ist zu hoch 
32.
pause 
33.
goto :eof 
34.
35.
echo Der Charakterlevel wird um %Ausgleich% Level erhoeht. 
36.
pause
Nachbehandlung
Darüber muss man sich nicht allzuviele Gedanken machen, denn wie man im code bereits erkennen kann, habe ich vor, einen Ausgleichs-Wert zu definieren,
set /a Ausgleich=%LV%-%Level%
der später auf das Level addiert wird und per VBS in die per drag&drop gewählte Datei überschrieben wird.

Sprich: Der Level wird dem Wert der höchsten Mastery angepasst (gut, es werden auch noch Attributpunkte zusätzlich gesetzt, spielt aber keine größere Rolle, da dies alles schon funktioniert)

Anmerkung:
Es ist in dem Spiel durchaus möglich, ein niedrigeres Charakterlevel zu haben als die Masterys sind (durch sterben z.B.), allerdings passiert dies bei uns eher durch bugs beim Rollback und die Spieler erhalten keine Erfahrungspunkte mehr beim Monsterkillen.

Ich hoffe, es ist nicht zu verwirrend und ich hoffe ebenso, dass ihr mich bei der Lösungsfindung für einen direkteren Weg als ich ihn momentan gewählt habe, unterstützen werdet.

Grüße, André
Mitglied: bastla
14.02.2011 um 12:04 Uhr
Hallo Skyemugen!

Wenn es also grundsätzlich nur darum geht, aus allen Werte der Variablen %Mastery#% sowie von %Level% den höchsten zu finden, würde ich das (ungetestet wie fast immer ) so anlegen:
01.
set /a Max=%Level% 
02.
for /f "tokens=2 delims==" %%i in ('set Mastery') do if %%i gtr %Max% set /a Max=%%i
Grüße
bastla
Bitte warten ..
Mitglied: Skyemugen
14.02.2011 um 12:26 Uhr
Aloha bastla!

Ausgehend davon, dass dies den ganzen Rangliste und Sort-Mist ersetzen soll ... bekomme ich jedoch immer nur den Wert von Level; müsste bei ('set Mastery') nicht noch etwas hinzugefügt werden (so geht er doch gar nicht alle sieben Variablen durch oder wie oder was *grübel*)?

Ein interessanter Ansatz. (wenn das funktionieren würde, muss ich ja trotzdem nochmal mit %Level% vergleichen, um die Information zu bekommen, ob Max größer ist als Level, um die Differenz zu bekommen oder das Skript zu beenden - oder kommt mein Zug heute mal wieder später?)

Grüße, André

EDIT: Würde in diesem Fall die for-Schleife nicht sogar nur den erstgrößeren Wert ausgeben?
Bitte warten ..
Mitglied: bastla
14.02.2011 um 12:32 Uhr
Hallo Skyemugen!

Wenn %Level% nur mit dem Max-Wert der einzelnen Variablen verglichen werden soll, dann natürlich eher so:
01.
set /a Max=0 
02.
for /f "tokens=2 delims==" %%i in ('set Mastery') do if %%i gtr %Max% set /a Max=%%i 
03.
set /a Diff=Max-Level 
04.
If %Diff% gtr 0 echo Ausgleichspunkte: %Diff%
Wenn Du übrigens einmal in der Konsole die Variablen setzt und ein "set Mastery" eingibst, sollte Deine Frage hinsichtlich "geht doch gar nicht alle sieben Variablen durch" eigentlich beantwortet sein ...

Grüße
bastla
Bitte warten ..
Mitglied: Skyemugen
14.02.2011 um 12:44 Uhr
Aloha bastla!

Ähm ja, natürlich: Umgebungsvariable. (ich seh schon „/“ wo keine sind). Hm, mit der letzten Lösung setzt er bei Max den niedrigsten Wert ungleich Null ein. (also hier: 30)

Also doch mit set /a Max=%Level% ^.^

Faszinierende Lösung (und da glaubt/hofft man, inzwischen vieles zu kennen *g*) und vorallem: so schön kompakt.

Ach, ich danke dir wieder einmal, mein guter bastla! und ich bau mir da einen Wolf zusammen, haha

set Mastery ... an diese Umsetzung hätte ich in den nächsten Monaten noch nichtmal gedacht ;)

Grüße André
Bitte warten ..
Mitglied: bastla
14.02.2011 um 12:52 Uhr
Hallo Skyemugen!

Sorry - war nicht sonderlich konzentriert, sonst hätte mir "%" anstelle von "!" eigentlich nicht passieren sollen - jetzt aber:
01.
set /a Max=0 
02.
for /f "tokens=2 delims==" %%i in ('set Mastery') do if %%i gtr !Max! set /a Max=%%i 
03.
set /a Diff=Max-Level 
04.
If %Diff% gtr 0 echo Ausgleichspunkte: %Diff%
set Mastery ... an diese Umsetzung hätte ich in den nächsten Monaten noch nichtmal gedacht ;)
... ist aber bei sinnvoller Benennung der Variablen (gleiches Präfix) die einfachste Möglichkeit ...

Grüße
bastla
Bitte warten ..
Mitglied: Skyemugen
14.02.2011 um 13:00 Uhr
Zitat von bastla:
Hallo Skyemugen!

Sorry - war nicht sonderlich konzentriert, sonst hätte mir "%" anstelle von "!" eigentlich nicht
passieren sollen - jetzt aber:

Aloha bastla!

Ja nun das zeigt auch wieder nur meine unausgeprägte Fähigkeit codes schnell zu interpretieren, sonst hätte mir das mit % statt ! in der for-Schleife selber auffallen müssen *schäm*.

> set Mastery ... an diese Umsetzung hätte ich in den nächsten Monaten noch nichtmal gedacht ;)
... ist aber bei sinnvoller Benennung der Variablen (gleiches Präfix) die einfachste Möglichkeit ...

Indeed, hatte bisher keine Fälle, wo dies zugetroffen hätte man befasst sich ja immer erst mit neuen Dingen, wenn man mit den üblichen Methoden an seine Grenzen kommt aber good to know.

Nun dann: Noch einen erholsamen ist das Wort eigentlich angebracht an einem Montag ... Tag wünsche ich dir =)

Grüße, André
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Powershell: Variablen aus .txt Dateien heraus ausgeben (5)

Frage von Tobiased zum Thema Batch & Shell ...

VB for Applications
Mehrere Spalten Durchsuchen und Ergebnisse in neuer Tabelle Ausgeben (3)

Frage von Mr.Green zum Thema VB for Applications ...

Windows Server
AD-Berechtigungen von zwei Servern miteinander vergleichen (3)

Frage von s0m3ting zum Thema Windows Server ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...