Top-Themen

Aktuelle Themen (A bis Z)

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, 5353 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 ..
Ähnliche Inhalte
Batch & Shell
Variable mit mehreren Werten durch eine Zahl teilen - Linux
gelöst Frage von lapvikaBatch & Shell2 Kommentare

Hallo zusammen, einer Variablen werden mehrere Werte (Zahlen) zugewiesen. Ich möchte nun all diese Werte (Zahlen) die der Variablen ...

PHP
Wert in Variable schreiben, abfragen, ausgeben
Frage von wescraven07PHP4 Kommentare

Moin Developer, ich hab gerade ein Problem, mit einem Wert, der aus Magento kommt, den ich in eine Variabel ...

Microsoft Office
2 Tabellen vergleichen und aus Zelle wert ausgeben
Frage von BatzmaMicrosoft Office5 Kommentare

Hallo da draußen! Ich weiß ich es gibt genügend Posts darüber jedoch bin ich nach mittlerweile 3h zu sauer ...

Microsoft Office
Excel: Wert aus mehreren Zeilen vergleichen
gelöst Frage von NicolaasMicrosoft Office2 Kommentare

Hallo zusammen, ich würde mir gerne eine Auswertung mit Excel erstellen. Ich habe leider gerade keine Idee mit welcher ...

Neue Wissensbeiträge
Microsoft

Update KB4073578 für AMD CPU (Spectre und Meltdown Lücke)

Information von sabines vor 3 StundenMicrosoft

Wegen Problemen (BOSD, nicht startende PCs) wurde das Update KB4056897 und KB4056894 für AMD CPUs zurückgezogen. Dieses Update KB4073578 ...

Mac OS X

MacOS wo ist die Tilde ?

Tipp von Alchimedes vor 16 StundenMac OS X1 Kommentar

Hallo, ich hab eine MacOS qwertz Keyboard auf US Layout umgestellt da die Sonderzeichen besser erreichbar sind. Leider fehlt ...

Datenschutz

Weitere Informationen zum Sicherheitsproblem BeA

Information von Penny.Cilin vor 23 StundenDatenschutz

Im folgenden ein weiterer Bericht über die Sicherheitsprobleme von Bea. Fataler Konstruktionsfehler im besonderen elektronischen Anwaltspostfach Gruss Penny

Windows 10

Systemdienste behalten nach Win10 inplace-Upgrade nicht die ggf. modifizierte Startart bei

Tipp von DerWoWusste vor 1 TagWindows 103 Kommentare

Stellt Euch vor, Ihr habt ein Win10 System und modifiziert dort die Startart von Systemdiensten. Zum Beispiel wollt Ihr ...

Heiß diskutierte Inhalte
Batch & Shell
Anmeldevorgang für Informatikraum (Schule) unter Windows
Frage von IngenieursBatch & Shell24 Kommentare

Hey zusammen, ich werde in naher Zukunft den Informatik Raum meiner jetzigen Schule von dem aktuellen Betreiber übernehmen (Vertrag ...

Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von fyrb38Windows 1019 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...

Microsoft Office
Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei
Anleitung von SarekHLMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...