Batch Zahlen nach Reihenfolge sortieren?
Hey, habe eine Frage zu Batch.
Und zwar möchte ich zufällig generierte Zahlen, in der richtigen Reihenfolge (klein zu groß oder umgekehrt) auflisten. Alles bis zum sortieren klappt.
Bis jetzt habe ich nur herausgefunden, wie man die höchste und niedrigste Zahl auflistet (indem man jede Zahl/Variable mit Vergkleichsoperatoren gegenüberstellt:
z.B.
if %zahl1% GEQ %zahl2% (set /a highest=%zahl1%) else set /a highest=%zahl2%
if %zahl3% GEQ %highest% (set /a highest=%zahl3%)
usw.
Aber wie komme ich auf die anderen Zahlen?
Wäre um jede Hilfe dankbar :)
3 Antworten
...damit wärst Du an dem Punkt angelangt an dem Batch keine einfach zu handhabende Sprache mehr ist...
Batch ist nicht wirklich für die Arbeit mit Zahlen geschaffen und spatestens wen es ans sortieren und der gleichen geht beikommst Du die volle "Breitseite" , nicht jeder Befehl kann Daten über die Pipe weitergeben (for und call können es offiziell nicht, wie es ginge möchtest Du nicht wissen...)... dann bleib nur eine Hilfsdatei...
demo.cmd
@echo off
setlocal enableDelayedExpansion
rem erzeuge 20 Zufalszahlen und speicher die Ausgabe in eine Datei (den Output eines for-loop kann man nicht über eiene Pipe weiterreichen)
(for /l %%a in (1,1,20) do @(
rem es gibt in Batch keine größere Zufallszahl als 32767
rem Batch kan nur Strings sortieren, also muss dafür gesorgt werden das die zu sortierenden ZahlenStrings das gleich format haben (führende Nullen etc.)
rem das geht ganz einfach, indem wir die zufallszahl einfach zu zB 1000000 hinzuadieren
set /a "Rand=1000000+!random!"
echo !Rand!
))>"myRandoms.txt"
rem mal anzeigen
type "myRandoms.txt"
echo:
echo Datei mal sortiert anzeigen:
sort "myRandoms.txt"
echo:
rem jetzt lesen wir die Nummern aus der Datei sortiert in ein Array und entfernen auch gleich die 1000000
set "index=1"
for /f "tokens=*" %%a in ('sort "myRandoms.txt"') do (
set /a "sortedRandom.!index!=%%a - 1000000"
rem mal anzeigen (geschachtelte dynamische Variablennamen sind in Batch echt Kacke auszugeben)
call echo %%sortedRandom.!index!%%
set /a "index+=1"
)
rem jetzt kannst du auch auf die Variablen zugreifen
echo Kleinste Zufallszahl : %sortedRandom.1%
echo dazwischen:
for /l %%a in (2,1,19) do (
echo !sortedRandom.%%a!
)
echo Groesste Zufallszahl : %sortedRandom.20%
pause
...und genau derartige Monster sind der Grund, weshalb Batch von Poweshell abgelöst wird/wurde...
Die ganze Nummer sähe in Powershell s aus...
einfach 20 Zufallszahlen erzeugen und sortieren:
1..20|ForEach-Object{Get-Random}|Sort-Object
#oder kurz:
1..20|%{Get-Random}|sort
willst Du die Lottozahlen sollte keine Zahl doppelt anfallen, dan geht man etwas anders vor
lotto.ps1
#wähle 6 zufällige Zahlen aus eine Aufzählung von 1 bis 49...
1..49|Get-Random -count 6|sort
pause
Vergiss einfach Batch, wenn Du nicht gerade irgendwelche masochistischen "Kraftproben" mit dieser störrischen Sprache bestehen möchtest.
Wende dich der Zukunft zu und nutze für Kleinkram Powershell...
wenn Dich das starten eine Powershellscripts per rechtsklick stört kanst du es in eine Batch "verpacken":
Als Einzeiler :
lotto.cmd
@echo off
powershell -c "Write-Host 'Deine Lotozahlen:' -fo green; 1..49|Get-Random -count 6|sort"
pause
oder als Hybridscript (wenn's für einen Einzeiler zu komplex wird):
Hybrid.cmd
<# : Batch Abschnitt ,Batch sieht in dieser Zeile die Eingabe aus der Datei # an ein SprungLabel, Powershell sieht den begin eines Kommentars.
@echo off
powershell "iex (gc '%~f0' -Encoding UTF8 -ReadCount 0 | out-string)"
exit /b
: Ende Batch und Powershellkommentar #>
$MyLotoZahlen=1..49|Get-Random -count 6
Write-Host 'Deine Lotozahlen wie gezogen:' -fo green
$MyLotoZahlen
Write-Host '...dito sortiert:' -fo green
$MyLotoZahlen|sort
pause
Eine Quick-and-Dirty-Methode wäre, die Zahlen alle mit führenden Nullen aufzufüllen, in eine Datei zu schreiben und dann mit SORT die Datei zu sortieren.
Eine bestimmte Zeile kann man mit FOR /F, "skip=%nk%" und ein paar Tricks mit IF u. Ä. auslesen.
Schau mal diese Diskussion.
Batch Datei für Sortierung sortiert Zahlen größer 99 falsch - Administrator.de
Warum die Eierei mit führenden Nullen? einfach jeweils zur gleichen großen Zahl addieren sortieren und anschließend diese große Zahl wieder subtrahieren...