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 Den größten mehrerer Werte herausfinden - Batch

Mitglied: fame.styler

fame.styler (Level 1) - Jetzt verbinden

16.12.2013, aktualisiert 18.06.2014, 1274 Aufrufe, 5 Kommentare, 3 Danke

Hi Leute ;)

nach ewigen Zeiten habe ich mal wieder eine Frage an meine Meister des Batch =)

Gibt es eine Möglichkeit in Batch, aus mehreren Werten den kleinsten Wert herauszufinden? und das Ergebnis dann in eine Variable zu speichern? Evtl mit for?
Erklärung folgt auf dem Fuße:

01.
If %W002% GTR %W001% ( 
02.
set CNT=01 
03.
goto :OK) 
04.
 
05.
If %W003% GTR %W002% ( 
06.
set CNT=02 
07.
goto :OK) 
08.
 
09.
If %W004% GTR %W003% ( 
10.
set CNT=03 
11.
goto :OK) 
12.
 
13.
etc.
Grundsätzlich sei gesagt, das das Batch funktioniert!! Ich denke auch nicht, dass ich jemals mit dieser Version Probleme haben werde. Aber ich hab immer gern alles möglichkeiten abgedeckt.

Das Ziel des obigen Scripts (welches nur ein Auszug ist, im ersten Kommentar poste ich das gesamte Script - der Auszug steht dann für die Zeilen 108-149) soll sein, unter den verschiedenen %W00X%-Variablen den größten Wert herauszufinden.

Das Problem, das ich mit der oberigen Version sehe ist, dass wenn z.B. W002 größer ist als W003, dann bricht das File die suche nach dem kleinsten Wert zu früh ab.

Hintergrund ist folgender (ich muss dazu leider ein klein wenig ausholen):
  • Es geht um ein Spiel.
  • Die relevanten Faktoren in dem Spiel sind
    • dein Konto (z.B. ein Guthaben von 1000 Goldmünzen), und
    • kaufbare Gebäude. Gebäude bringen ein stündliches Income. z.B. Gebäude 1 kostet 100 Goldmünzen und bringt ein Income von 1 Goldmünze pro Stunde.
  • Man kann ein Gebäude mehrmals kaufen, jedoch kostet es mit jedem Kauf 1/10 vom Startpreis mehr, also 1=100g, 2=110g, 3=120g usw.
  • Mit steigendem Level stehen mehr Gebäude zur Verfügung, die jedoch im Verhältnis mehr kosten als sie bringen (z.B. Gebäude 2 kostet 210g und bringt "nur" 2 Goldmünzen)

Sinn des gesamten Batch-Files ist nun, aus der Wertigkeit der Gebäude (also Ertrag im Verhältnis zu den Kosten) das "effektivste" Gebäude herauszufinden und dann bei einem bestimmten Kontostand auszurechnen, wie viele Gebäude ich von welchem Typ kaufen kann bis mein Gold nicht mehr für das effektivste Gebäude reicht.
Ich hoffe dass es soweit verständlich ist. Wie schon gesagt poste ich das gesamte Script für Interessierte im ersten Kommentar. ;)

Der obige Auszug enthält nun den Bereich, der für das Vergleichen der Effektivität/Wertigkeit (daher auch %W00X%) zuständig ist. (Allerdings nur für 4 Gebäude, es sind in in meinem jetztigen File 11 Gebäude, siehe erster Kommentar)

Mein Problem ist nun: Ich bin mir nicht sicher, ob das in allen Fällen so funktioniert. (also undabhängig davon, wie viele Gebäude ich von der jeweiligen Nummer schon habe.)

Gibt es eine Möglichkeit in Batch, aus mehreren Werten den kleinsten Wert herauszufinden? und das Ergebnis dann in eine Variable zu speichern? Evtl mit for?

Falls weitere Fragen auftauchen, nur zu =)
Ich hoffe ich habe nichts vergessen.. und vielen Dank schon mal für jeden, der sich in diese (vielleicht ein bisschen komplizierte) Spielerei eindenkt ;)

Fame.Styler

PS.: Noch eine kurze Erklärung zu den Variablen:
  • %G% ist das Gold das ich auf dem Konto habe
  • %C00X% ist der Counter des jeweiligen Gebäudetyps, also die Anzahl die ich davon bereits besitze
  • %B00X% ist der Basispreis der Gebäude (also wenn ich keines besitzten würde)
  • %K00X% sind die Kosten des nächst höheren Gebäudes, berechnet aus Counter und Basis ;)
  • %I00X% ist das stündliche Income, das mir das Gebäude bringt
  • %W00X% ist die Effektivität/Wertigkeit des Gebäudes, berechnet aus Kosten und Income
*Upkeep kann igroniert werden ;) Wen's doch interessiert, kann ja fragen.

PPS.: Ich speichere meine Gebäudezahl in einer MonsterWarlordGebaude.txt (Name des Spiels) als zahlenreihe aka 10.5.3.1 (<- 10 vom ersten, 5 vom zweiten etc.), sodass ich sie der Einfachheit halber in der Batch auslesen kann, falls ich nichts gekauft habe, ohne es in der Batch vorher berechnet zu haben.

PPPS.: Da ich mit der Batch oft Berechnungen teste, habe ich am Schluss die Frage nach dem Test (in dem fall wird nichts in dem Textfile verändert) und nach einem erneuten Starten der Batch gehängt ;)
Mitglied: fame.styler
16.12.2013 um 20:36 Uhr
01.
@echo off & setlocal enabledelayedexpansion 
02.
:0 
03.
cls 
04.
 
05.
::Konto 
06.
set /p G= Kontostand:  
07.
set G0=%G% 
08.
echo.  
09.
 
10.
::GebaudeZahlerAutomatisch 
11.
for /f "tokens=1-11 delims=. " %%a in (MonsterWarlordGebaude.txt) do ( 
12.
set C001=%%a 
13.
set C002=%%b 
14.
set C003=%%c 
15.
set C004=%%d 
16.
set C005=%%e 
17.
set C006=%%f 
18.
set C007=%%g 
19.
set C008=%%h 
20.
set C009=%%i 
21.
set C010=%%j 
22.
set C011=%%k 
23.
24.
echo Check for: %C001%.%C002%.%C003%.%C004%.%C005%.%C006%.%C007%.%C008%.%C009%.%C010%.%C011% 
25.
 
26.
::AutoamtischOderManuell 
27.
set /p CHOICE= Automatische Gebaudeberechnung: [Y]es or [N]o: 
28.
if %CHOICE%==y goto BasisKosten 
29.
if %CHOICE%==Y goto BasisKosten 
30.
 
31.
::GebaudeZahlerManuell 
32.
set /p C001= Anzahl Farmen (1):  
33.
set /p C002= Anzahl Gehege (2):  
34.
set /p C003= Anzahl Lagerraume (3):  
35.
set /p C004= Anzahl Hutten (4):  
36.
set /p C005= Anzahl Wasserrader (5):  
37.
set /p C006= Anzahl Sagewerke (6):  
38.
set /p C007= Anzahl Schmieden (7):  
39.
set /p C008= Anzahl Backereien (8):  
40.
set /p C009= Anzahl Markte (9):  
41.
set /p C010= Anzahl Restaurants (10):  
42.
set /p C011= Anzahl Windmuehlen (11):  
43.
 
44.
::BasisKosten 
45.
:BasisKosten 
46.
set B001=40 
47.
set B002=200 
48.
set B003=400 
49.
set B004=2000 
50.
set B005=5000 
51.
set B006=11000 
52.
set B007=40000 
53.
set B008=100000 
54.
set B009=200000 
55.
set B010=400000 
56.
set B011=750000 
57.
 
58.
::GebaudeKosten 
59.
 
60.
set /A K001=%B001%+(%C001%*(%B001%/10)) 
61.
set /A K002=%B002%+(%C002%*(%B002%/10)) 
62.
set /A K003=%B003%+(%C003%*(%B003%/10)) 
63.
set /A K004=%B004%+(%C004%*(%B004%/10)) 
64.
set /A K005=%B005%+(%C005%*(%B005%/10)) 
65.
set /A K006=%B006%+(%C006%*(%B006%/10)) 
66.
set /A K007=%B007%+(%C007%*(%B007%/10)) 
67.
set /A K008=%B008%+(%C008%*(%B008%/10)) 
68.
set /A K009=%B009%+(%C009%*(%B009%/10)) 
69.
set /A K010=%B010%+(%C010%*(%B010%/10)) 
70.
set /A K011=%B011%+(%C011%*(%B011%/10)) 
71.
 
72.
::GebaudeEinkommen 
73.
 
74.
set I001=1 
75.
set I002=5 
76.
set I003=10 
77.
set I004=50 
78.
set I005=100 
79.
set I006=160 
80.
set I007=500 
81.
set I008=1000 
82.
set I009=1600 
83.
set I010=2500 
84.
set I011=3000 
85.
 
86.
::GebaudeEffektivitat 
87.
 
88.
set /A W001=%K001%/%I001% 
89.
set /A W002=%K002%/%I002% 
90.
set /A W003=%K003%/%I003% 
91.
set /A W004=%K004%/%I004% 
92.
set /A W005=%K005%/%I005% 
93.
set /A W006=%K006%/%I006% 
94.
set /A W007=%K007%/%I007% 
95.
set /A W008=%K008%/%I008% 
96.
set /A W009=%K009%/%I009% 
97.
set /A W010=%K010%/%I010% 
98.
set /A W011=%K011%/%I011% 
99.
 
100.
::Ausgaben 
101.
echo. 
102.
set /p Upkeep= Upkeep:  
103.
 
104.
::Einkommen(Income) 
105.
set /A Income0=(%C001%*%I001%)+(%C002%*%I002%)+(%C003%*%I003%)+(%C004%*%I004%)+(%C005%*%I005%)+(%C006%*%I006%)+(%C007%*%I007%)+(%C008%*%I008%)+(%C009%*%I009%)+(%C010%*%I010%)+(%C011%*%I011%)-%Upkeep% 
106.
 
107.
::=========== 
108.
:Calc 
109.
If %W002% GTR %W001% ( 
110.
set CNT=01 
111.
goto :OK) 
112.
 
113.
If %W003% GTR %W002% ( 
114.
set CNT=02 
115.
goto :OK) 
116.
 
117.
If %W004% GTR %W003% ( 
118.
set CNT=03 
119.
goto :OK) 
120.
 
121.
If %W005% GTR %W004% ( 
122.
set CNT=04 
123.
goto :OK) 
124.
 
125.
If %W006% GTR %W005% ( 
126.
set CNT=05 
127.
goto :OK) 
128.
 
129.
If %W007% GTR %W006% ( 
130.
set CNT=06 
131.
goto :OK) 
132.
 
133.
If %W008% GTR %W007% ( 
134.
set CNT=07 
135.
goto :OK) 
136.
 
137.
If %W009% GTR %W008% ( 
138.
set CNT=08 
139.
goto :OK) 
140.
 
141.
If %W010% GTR %W009% ( 
142.
set CNT=09 
143.
goto :OK) 
144.
 
145.
If %W011% GTR %W010% ( 
146.
set CNT=10 
147.
goto :OK) 
148.
 
149.
set CNT=11 
150.
 
151.
:OK 
152.
If !K0%CNT%! GEQ %G% goto :Anzeige 
153.
 
154.
::NeuerKontostand 
155.
set /A G=%G%-!K0%CNT%! 
156.
 
157.
::NeueGebaudeanzahl 
158.
set /A C0%CNT%=!C0%CNT%!+1 
159.
 
160.
::NeueGebaudekosten 
161.
set /A K0%CNT%=!K0%CNT%!+(!B0%CNT%!/10) 
162.
 
163.
::NeueGebaudeeffektivitat 
164.
set /A W0%CNT%=!K0%CNT%!/!I0%CNT%! 
165.
 
166.
::Neueseinkommen 
167.
set /A Income=((%C001%*%I001%)+(%C002%*%I002%)+(%C003%*%I003%)+(%C004%*%I004%)+(%C005%*%I005%)+(%C006%*%I006%)+(%C007%*%I007%)+(%C008%*%I008%)+(%C009%*%I009%)+(%C010%*%I010%)+(%C011%*%I011%))-%Upkeep% 
168.
 
169.
goto :Calc 
170.
 
171.
:Anzeige 
172.
cls 
173.
echo ============================================================ 
174.
echo. 
175.
echo Kontostand ist am Anfang: %G0%G  
176.
echo Kontostand ist am Ende: %G%G   
177.
echo.  
178.
echo Income (Anfang): %Income0%  
179.
echo Income (Ende): %Income%  
180.
echo Upkeep (Momentan): %Upkeep%  
181.
echo.  
182.
echo Gebaudebesitz (Ende):  
183.
echo Farm:%C001% - Gehege:%C002% - Lagerraum:%C003% -Hutte:%C004%   
184.
echo Wasserrad:%C005% - Sagewerk:%C006% - Schmiede:%C007% - Backerei:%C008%   
185.
echo Markt:%C009% - Restaurant:%C010% - Windmuehle:%C011%  
186.
 
187.
echo. 
188.
echo ============================================================ 
189.
echo. 
190.
 
191.
set /P TEST= Was this a test? - [Y]es or [N]o:  
192.
if %TEST%==Y goto jump 
193.
if %TEST%==y goto jump 
194.
echo %C001%.%C002%.%C003%.%C004%.%C005%.%C006%.%C007%.%C008%.%C009%.%C010%.%C011% > MonsterWarlordGebaude.txt 
195.
:jump 
196.
 
197.
echo. 
198.
 
199.
set /p Res= Restart?         - [Y]es or [N]o:  
200.
if %Res%==Y goto :0 
201.
If %Res%==y goto :0 
202.
:eof
Bitte warten ..
Mitglied: bastla
LÖSUNG 16.12.2013, aktualisiert um 23:25 Uhr
Hallo fame.styler!

Schematisch könnte das (wenn alle mit "W0" beginnenden Variablen ausgewertet werden sollen) etwa so gehen:
01.
set /a MAX=-999999 
02.
for /f "tokens=1-2 delims==" %%a in ('set W0') do if %%b gtr !MAX! ( 
03.
    set /a MAX=%%b 
04.
    set "CNT=%%a" 
05.
06.
set "CNT=%CNT:~2%"
Grüße
bastla
Bitte warten ..
Mitglied: fame.styler
16.12.2013, aktualisiert um 23:03 Uhr
Hey Bastla,

Is ja der Wahnsinn, wie schnell du immer antwortest =D

Zu deiner Einschränkung, dass alle mit W0 angehn: Rein theoretisch gäbe es vielleicht mehr als 99 Gebäude, hab sowas aber im Spiel bis jetzt noch nicht gesehen, glaub das Maximale was ich mal gesehen habe, sin ca. 30, also geht das in Ordnung =)

Um das mal im Vorraus schon mal zu verstehen. set /a kenn ich, for /f kenn ich auch.
  • Warum legst du als tokens 1-2 fest?
  • delims==" löscht alle Grenzzeichen(?) also auch leer und tab werden ignoriert, hab ich das richtig in Erinnerung?
  • ('set W0') ... versteh ich nicht ganz =D

set /a MAX=%%b, set "CNT=%%a" -> du setzt also das MAX mit dem momentanen Wert, und als CNT, also als Auswahl, welches Gebäude ich nehmen muss, ist %%a... oder?

Danke schon mal ;)

fame.styler

[Edit]
okay. ('set W0') benutzt einen Befehl. Nur versteh ich nicht recht warum? =)
bei set wird doch nichts verwertbares ausgegeben?! Oder steh ich grade auf dem Schlauch =D
[/Edit]
Bitte warten ..
Mitglied: bastla
LÖSUNG 16.12.2013, aktualisiert um 23:25 Uhr
Hallo fame.styler!

okay. ('set W0') benutzt einen Befehl. Nur versteh ich nicht recht warum? =)
Einfach mal als Zeile 99 (ohne Apostroph davor und danach) in Deinem Ansatz verwenden, dann siehst Du gleich den Sinn ...
delims==" löscht alle Grenzzeichen(?)
Nein; damit wird "=" als Trennzeichen (zwischen Variablenname und Wert der Variablen - siehe die Ausgabe von "set W0" - daher auch tokens 1-2: %%a und %%b) festgelegt.
set /a MAX=%%b, set "CNT=%%a" -> du setzt also das MAX mit dem momentanen Wert,
... wenn der aktuell betrachtete Wert größer als das bisherige Maximum ist ...
und als CNT, also als Auswahl, welches Gebäude ich nehmen muss, ist %%a... oder?
Genau genommen ist das zunächst der Variablenname, der am Ende noch um die ersten beiden Stellen ("W0") gekürzt wird.

Grüße
bastla
Bitte warten ..
Mitglied: fame.styler
16.12.2013, aktualisiert 17.12.2013
Hallo bastla,

inwzischen hab ich alles verstanden, daher auch den "alten" Kommentar hier im Prizip komplett gelöscht =D

Eine letzte Frage noch (der Thread wird als gelöst markiert):

Muss man am Anfang set /a MAX=-999999 setzten? Die Variable wird doch in der Schleife sowieso gesetzt, oder? Bzw. tuts dann nicht ein einfaches set MAX=0 nicht auch?



Vielen Dank nochmal dafür, bastla, wie immer warst/bist du eine riesen Hilfe =)

fame.styler

[Edit1]
Habs grade eingebaut, aber er verwendet !MAX! im If-Befehl leider nicht (gibt immer !MAX! aus statt dem Wert)... wenn ich die "!" durch "%" ersetze, wird zwar -999999 ausgegeben, allerdings ändert dieser sich nicht (das versteh ich aber, wegen den %)

[Edit2]
Habe jetzt gtr mit leq ersetzt (ich brauch ja den kleinsten Wert), und jetzt funktionierts.
Ich habe ebenfalls nochmal ein paar Versuche mit MAX und GTR gemacht, aber hat nie geklappt... Warum auch immer, es bleibt mir ein Rätsel ;)
01.
set MIN=999999  
02.
 
03.
for /f "tokens=1-2 delims==" %%a in ('set W0') do if %%b leq !MIN! (  
04.
    set MIN=%%b  
05.
    set CNT=%%a 
06.
07.
 
08.
set CNT=%CNT:~2%
[/Edit]
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch: Variable einen Wert zuweisen
gelöst Frage von veniplexBatch & Shell7 Kommentare

Hallo zusammen! Ich bin gerade am verzweifeln Ich habe in Batch 2 Variablen: Wenn ich mir von diesen den ...

Batch & Shell
CSV kleinerer Wert (Batch)
Frage von jochengBatch & Shell3 Kommentare

Ich habe eine CSV Datei mit folgendem Inhalt: 29664;24,95 29664;12,95 29645;9,95 29645;9,95 29655;12,95 29655;24,95 29664;24,95 29655,12,95 29655,24,95 29664;12,95 29664;24,95 ...

Batch & Shell

Wert aus Batch Schleife in Variable speichern

gelöst Frage von anmelderBatch & Shell5 Kommentare

Ich möchte aus einem Verzeichnis alle Dateien mit einer bestimmten Endung anzeigen lassen. Die Dateien sind nummeriert. Der Nutzer ...

Batch & Shell

XLXS zu CSV + Wert ersetzen - Batch

gelöst Frage von jochengBatch & Shell11 Kommentare

Hallo Leute ich habe ein Problem Ich brauch ein kleines Batch Script das ich täglich laufen lassen kann das ...

Neue Wissensbeiträge
Vmware
VMware Update für den ESXi 5.5 verfügbar
Information von sabines vor 6 StundenVmware

Nach dem ganzen Hickhack um Update mit Microcode Anpassungen und Rückzug, gibt es nun für den ESXi 5.5 ein ...

CPU, RAM, Mainboards

Meltdown und Spectre: Intel zieht Microcode-Updates für Prozessoren zurück

Information von keine-ahnung vor 10 StundenCPU, RAM, Mainboards5 Kommentare

Moin, extrem lutztig. Nur gut, dass ich noch nicht beim Probanden-Bingo mitgemacht habe :-) LG, Thomas

Router & Routing
PfSense als Addon auf QNAP
Information von magicteddy vor 1 TagRouter & Routing7 Kommentare

Moin, für Spielereien eine ganz nette Idee aber ich fürchte das soetwas auch als echte Firewall genutzt wird: In ...

Datenschutz

Teamviewer kommt für IoT-Geräte wie den Raspberry Pi

Information von magicteddy vor 1 TagDatenschutz1 Kommentar

Moin, jetzt werden IoT Geräte endgültig zur Wanze? Anscheinend kann man auf einem Dashboard seine Geräte visualisieren Ich stelle ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Preis für Wartungsvertrag ok?
gelöst Frage von a-za-zNetzwerkmanagement26 Kommentare

Hallo! Mal ne Frage, weil ich mich mit dem akzeptablen Preis für einen Reaktionszeitvertrag nicht auskenne. Meine Firma hat ...

Windows Server
TEMP-Profile
gelöst Frage von Forseti2003Windows Server21 Kommentare

Guten Morgen, wer kennt sie nicht, die lieben Temporären Benutzerprofile, vorallem immer dann, wenn man sie am wenigsten braucht. ...

Multimedia & Zubehör
Welches Tablet für die Verkäufer?
Frage von Hendrik2586Multimedia & Zubehör15 Kommentare

Guten Morgen meine Lieben, vielleicht könnt ihr mir ja helfen. Es geht um unsere Außendienstmitarbeiter /Verkäufer. Sie sollen demnächst ...

Windows Netzwerk
Ist ein Portforwarding auf einen PC ohne lauschendes Programm ein (großes) Sicherheitsproblem?
Frage von PluwimWindows Netzwerk13 Kommentare

Hallo zusammen, zur Fernwartung eines Rechners an einem anderen Ort nutze ich VNC. Da dieser Rechner einfach nur eine ...