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

Variable aufrufen, deren Name in einer Variable gespeichert ist.

Mitglied: LaserPanzerWal

LaserPanzerWal (Level 1) - Jetzt verbinden

03.11.2011, aktualisiert 18.10.2012, 3199 Aufrufe, 12 Kommentare

Ich und ein Kollege haben uns vorgenommen, ein Spiel (in diesem Fall Schiffe versenken) als Batch-Datei umzusetzen. Jeder versucht es gerade für sich umzusetzen, und natürlich sehe ich es als persönliche Herausforderung als erster fertig zu werden;)
Allerdings komme ich bereits jetzt nicht weiter, weil ich versuche, eine Variable aufzurufen, deren Name sich aus Werten von weiteren Variablen ergibt, die wiederum in einer FOR-Schleife festgelegt werden.
Da das ganze jetzt wahrscheinlich recht verwirrend klingt, hier mal der bisherige Quelltext. Leider habe ich ihn noch nicht wirklich mit Kommentaren versehen, es dürfte aber hoffentlich erkennbar sein, was ich versuche. Die Deklaration der 200 Variablen lasse ich der Übersicht halber weg, sie sind anfangs alle mit einer Tilde (~) gefüllt.

01.
@echo off
02.
setlocal ENABLEDELAYEDEXPANSION
03.
set a1=~
04.
set a2=~
05.
::Hier ist im richtigen Quelltext alles von a1 bis a100 und b1 bis b100 deklariert....
06.
set b99=~
07.
set b100=~
08.
set planning=true
09.

10.
:MAINLOOP
11.

12.
echo   THE ENEMY               YOU
13.
echo   1 2 3 4 5 6 7 8 9 10    1 2 3 4 5 6 7 8 9 10
14.
echo 1  %a1% %a2% %a3% %a4% %a5% %a6% %a7% %a8% %a9% %a10%     %b1% %b2% %b3% %b4% %b5% %b6% %b7% %b8% %b9% %b10%
15.
echo 2  %a11% %a12% %a13% %a14% %a15% %a16% %a17% %a18% %a19% %a20%     %b11% %b12% %b13% %b14% %b15% %b16% %b17% %b18% %b19% %b20%
16.
echo 3  %a21% %a22% %a23% %a24% %a25% %a26% %a27% %a28% %a29% %a30%     %b21% %b22% %b23% %b24% %b25% %b26% %b27% %b28% %b29% %b30%
17.
echo 4  %a31% %a32% %a33% %a34% %a35% %a36% %a37% %a38% %a39% %a40%     %b31% %b32% %b33% %b34% %b35% %b36% %b37% %b38% %b39% %b40%
18.
echo 5  %a41% %a42% %a43% %a44% %a45% %a46% %a47% %a48% %a49% %a50%     %b41% %b42% %b43% %b44% %b45% %b46% %b47% %b48% %b49% %b50%
19.
echo 6  %a51% %a52% %a53% %a54% %a55% %a56% %a57% %a58% %a59% %a60%     %b51% %b52% %b53% %b54% %b55% %b56% %b57% %b58% %b59% %b60%
20.
echo 7  %a61% %a62% %a63% %a64% %a65% %a66% %a67% %a68% %a69% %a70%     %b61% %b62% %b63% %b64% %b65% %b66% %b67% %b68% %b69% %b70%
21.
echo 8  %a71% %a72% %a73% %a74% %a75% %a76% %a77% %a78% %a79% %a80%     %b71% %b72% %b73% %b74% %b75% %b76% %b77% %b78% %b79% %b80%
22.
echo 9  %a81% %a82% %a83% %a84% %a85% %a86% %a87% %a88% %a89% %a90%     %b81% %b82% %b83% %b84% %b85% %b86% %b87% %b88% %b89% %b90%
23.
echo 10 %a91% %a92% %a93% %a94% %a95% %a96% %a97% %a98% %a99% %a100%     %b91% %b92% %b93% %b94% %b95% %b96% %b97% %b98% %b99% %b100%
24.

25.
if "%planning%"=="true" (
26.
	goto PLANNINGLOOP
27.
) else (
28.
	goto BATTLELOOP
29.
)
30.

31.
:PLANNINGLOOP
32.
for /L %%i IN (2 1 5) do (
33.
	:REPEATCOMPUTERPLANNING
34.
	set /a zeile=!random! %%10 + 1
35.
	set /a spalte=!random! %%10 + 1
36.
	set /a richtung=!random! %%2
37.
	set /a laenge=7 - %%i
38.
	set /a var=!zeile! * 10 - 10
39.
	set /a var=!var! + !spalte!
40.
	if "!richtung!"=="1" (
41.
	::waagerecht
42.
		for /L %%o IN (0 1 !laenge! -1) do (
43.
			set /a temp=!zeile! * 10
44.
			if !var! GTR !temp! (
45.
				goto REPEATCOMPUTERPLANNING
46.
			)
47.
			echo !var!
48.
			echo %%o
49.
			set /a tempvar=!var! + %%o
50.
			if NOT "!a!tempvar!!" == "~" (
51.
				goto REPEATCOMPUTERPLANNING
52.
			)
53.
		)
54.
		for /L %%o IN (0 1 !laenge! -1) do (
55.
			set tempvar=!var! + %%o
56.
			set a!tempvar!=M
57.
		)
58.
	) else (
59.
	::senkrecht
60.
	
61.
	)
62.
)
In Zeile 50 versuche ich, zu prüfen, ob der Wert der zufällig ausgesuchten Variable eine Tilde ist (also Wasser im Spiel), oder nicht (also ein Schiff, ein beschossenes Feld oder was auch immer).
Das Problem scheint zu sein, dass ich zwar durchaus "echo a!tempvar!" ausgeben oder in einer weiteren variable speichern kann, er mich aber den inhalt dieser variable nicht benutzen lässt, um z.b. die variable a34 aufzurufen (wenn tempvar ==34)
Die Möglichkeiten, das umzusetzen, die ich bisher gefunden habe, mögen ausserhalb der Schleife funktionieren, hier tun sie es aber leider nicht.
Ich hoffe es ist klar was ich hier probiere.
Wer kann mir weiterhelfen?
Mitglied: icsat
04.11.2011 um 08:16 Uhr
Hallo erst mal! (so viel Zeit muss sein)

01.
@echo off
Ist zum finden von Fehlern erst mal eine schlechte Idee!
01.
if NOT "!a!tempvar!!" == "~" (
Da Dir das entfernen von Echo Off allerdings in diesem Fall (Variablen mit !) keinen Aufschluss über die Auflösung der Variablen in dieser Zeile gibt hat sich bei mir zusätzlich bewährt, vor problematisch zeilen mal ein echo zu setzen und das Ergebnis anzuschauen und zu verstehen was wie aufgelöst wird.
01.
echo if NOT "!a!tempvar!!" == "~" (
Da die Variable "a" (!a!) nicht definiert ist und "" (!!) auch keinen Sinn ergibt, sollte das Ergebnis in diesem Fall etwa
01.
if NOT "tempvar" == "~" (
lauten.

Die Lösung für Dein Problem hast Du imho ja schon fast selber geschrieben:
Zitat von LaserPanzerWal:
...
"echo a!tempvar!" ausgeben oder in einer weiteren variable speichern
...
Speicher Dir den Kram einfach in noch einer Variablen zwischen:
01.
set "nochnetempvar=a!tempvar!
und verwende diese dann für deine Abfrage:
01.
if NOT "!nochnetempvar!" == "~" (
Schöne Restwoche

icsAT

(auch dafür war noch Zeit da!)
Bitte warten ..
Mitglied: jeb-the-batcher
04.11.2011 um 11:12 Uhr
Halli Hallo,

und noch eine Technik, nur der Vollständigkeit halber (weil die Methode von icsAT ansich gut funktioniert und übersichtlicher ist).

01.
FOR /F "delims=" %%V in ("!tempvar!") DO (
02.
  if NOT "!a%%V!"=="~" (
03.
   goto REPEATCOMPUTERPLANNING
04.
 )
05.
)
Dabei fällt mir noch auf, dass du versuchst innerhalb einer FOR-loop wild mit GOTO's herum zuspringen.
Zum einen verwendet man GOTO mal so gar nicht und nimmer um den Code lesbar und verständlich zu halten(Ok diesen Punkt kann man bei Batch vergessen).

Zum anderen stoppt ein GOTO sofort jede FOR-Loop im aktuellem CALL-Scope,
sprich das ist das Ende deiner Schleife.

Ich denke ein paar elegante Funktionen würden der Lesbarkeit hier ohnehin nicht schaden.

jeb
Bitte warten ..
Mitglied: mathe172
04.11.2011, aktualisiert 18.10.2012
Hallo,

entweder ich überseh da was, oder bei der Möglichkeit von icsat ist etwas falsch. Man prüft ja, ob der Inhalt von "Nochnetempvar" =="~" ist. Der Inhalt ist aber "a23" oder "a15".

Vielleicht noch eine andere Möglichkeit:
01.
set "a15=~"
02.
set "tempvar=15"
03.
call echo %a%tempvar%%
Und was du dir auch noch anschauen solltest sind Pseudo-Arrays in Batch - das würde das ganze erheblich verkürzen. Schau mal hier.

MfG,
Mathe172
Bitte warten ..
Mitglied: jeb-the-batcher
04.11.2011 um 15:29 Uhr
Hallo mathe0815,

wobei das mit den Pseudo-Arrays vermutlich am Ende auf die gleiche Problematik hinausläuft

Kleiner Tippfehler (es fehlt ein %)
01.
call echo %%a%tempvar%%
Aber das übel an der CALL Lösung ist, CALL ist extrem langsam und auch nicht sicher an dieser Stelle.

Dies testen und wundern ...
01.
echo rem /? >echo%~x0
02.
set "a15=~" 
03.
set "tempvar=15" 
04.
call echo %%a%tempvar%%
Das erklärt auch warum CALL so langsam ist

jeb
Bitte warten ..
Mitglied: mathe172
04.11.2011 um 17:11 Uhr
@ jeb: Also bei mir funktioniert meine Variante, obwohl ich nicht verstehe, warum es nicht "call echo %%a%tempvar%%%" heissen muss.

Mathe172
Bitte warten ..
Mitglied: icsat
04.11.2011 um 20:45 Uhr
Hallo mathe172,

wenn man auf die Schnelle ungetestete Codezeilen postet darf man sich nicht wundern, wenn am Ende nur Müll dabei rauskommt! Das oben produzierte Ergebnis hat am Ende genau das Problem, welches der TE ja ausführlich beschrieben hat. Es lässt sich so nicht weiterverarbeiten.

Daher ziehe ich meinen unqualifizierten Kommentar von heute Morgen hiermit zurück. Vielen Dank, dass Dir das aufgefallen ist.

Der von Dir angesprochene Call wäre da tatsächlich ein Lösung. Damit müsste meine Definition der zusätzlichen Variable
01.
call set "nochnetempvar=%%a!tempvar!%%"
lauten, wobei das auch nur dann funktionieren kann, wenn die "a"-Variable außerhalb der Schleife gesetzt wurde. Ich würde hier eindeutig die Variante von jeb-the-batcher vorziehen.

Gruß icsAT
Bitte warten ..
Mitglied: icsat
04.11.2011 um 21:08 Uhr
Hallo,

die erste Variante von mathe172
01.
call echo %a%tempvar%%
funktioniert bei der direkten Eingabe. Im Batch hingegen ist das Ergebnis "tempvar".

Die Variante von jab-the-batcher
01.
call echo %%a%tempvar%%
funktioniert nicht. Bei direkter Eingabe "%~" und im Batch "a15".

die zweite Variante von mathe172
01.
call echo %%a%tempvar%%%
funktioniert im Batch. Bei der direkten Eingabe hingegen ist das Ergebnis "%~%".

Da das eigentliche Problem aber gelöst ist, war dieser Kommentar dann wohl OT. Sorry dafür.


Schönes WE

icsAT
Bitte warten ..
Mitglied: jeb-the-batcher
05.11.2011 um 10:18 Uhr
Hallo icsAt,

Zitat von icsat:

01.
call set "nochnetempvar=%%a!tempvar!%%"
lauten, wobei das auch nur dann funktionieren kann, wenn die "a"-Variable außerhalb der Schleife gesetzt wurde.

Die "a"-Variable gibt es ja gar nicht, die Variable heißt ja "a15" und dein Code funktioniert natürlich auch innerhalb der Schleife,
dafür ist ja der CALL Befehl da.

Man kann auch ganz ohne delayed expansion innerhalb der Schleife arbeiten
01.
call call set "contentOfVar=%%%%a%%tempvar%%%%%%"
Aber scheinbar hat keiner mein zweites "Wunder"-Beispiel ausprobiert
Da hätte ich nämlich mit Reaktionen gerechnet

jeb
Bitte warten ..
Mitglied: pieh-ejdsch
05.11.2011 um 22:21 Uhr
moin jeb,

wieso denn "Wundern"? - Fragen!
call ruft die Batch echo.cmd mit dem Parameter, welcher aus der %%Pseu%DOvariable%% besteht aus dem Verzeichnis auf.
Nur der Parameter entspricht nicht ganz der erwarteten Variable - warum überhaupt?
erst wird %tempvar% nach 15 aufgelöst (was warscheinlich heist: erst werden Vorhandene Variablen aufgelöst) und die Variable %a die gibt es nicht
  • aber das komischste daran: die Variable "%a15" gibt es nit - warum steht dann etwas da?

[Edit]
ach ja - erst wird das Dopplte Prozent zu einem Prozent und dann %Tempvar% aufgelöst. Das Letzte Prozent ist nur eins und wird im Batch ja gelöscht.
ist geklärt warum doch etwas da steht.
[/Edit]

for /L %%o IN (0 1 !laenge! -1) do ( 
Auch wenn es geht: für was ist -1? Falls das Boot zu kurz ist? laenge ist doch immer definiert.

Gruß Phil
Bitte warten ..
Mitglied: icsat
07.11.2011 um 15:02 Uhr
Hallo,

schönen Start in die Woche.

Zitat von jeb-the-batcher:
Die "a"-Variable gibt es ja gar nicht, die Variable heißt ja "a15" und dein Code funktioniert
natürlich auch innerhalb der Schleife,
dafür ist ja der CALL Befehl da.

Mit die "a"-Variable war natürlich a1 bis a100 oder in unserem Beispiel a15 gemeint. Ansonsten gebe ich Dir recht.


Gruß icsAT
Bitte warten ..
Mitglied: LaserPanzerWal
07.11.2011 um 19:58 Uhr
Hallo wiedereinmal, und Danke schonmal für die vielen Antworten.

Leider funktioniert das mit der Variable trotzdem nicht so recht. Es klappt zwar mit den beschriebenen Möglichkeiten wunderbar in einer neuen Batch, aber wenn ich es in einer Schleife laufen lassen will weigert er sich strikt, so zu funktionieren wie ich das gerne möchte. Egal wie ich es anstelle, er gibt mir entweder den Variablennamen aus (z.b. a15) oder er meldet mir dass Echo off gesetzt ist, also die angegebene Variable vermutlich leer (und damit nicht richtig) ist. Allerdings will ich auch ungern die Schleife durch ein Pseudo-Schleifen-GOTO-gewurstel ersetzen, nur um das Problem zu umgehen, denn das kann nicht die wirklich sinnvolle Lösung sein.
Mach ich einfach nur irgendetwas falsch, oder klappt das in einer Schleife nicht so einfach?

Grüße,
der Wal =)
Bitte warten ..
Mitglied: mathe172
09.11.2011 um 18:02 Uhr
Hallo,

wahrscheinlich könnte man dir einfacher Helfen, wenn du uns den Code zeigen würdest.
Schau dir mal "setlocal enabledelayedexpansion" an. Und was die Pseudoschleifen angeht, ich würde eher Pseudo-Call-Subs benutzen

MfG,
Mathe172
Bitte warten ..
Ähnliche Inhalte
Java
Aufruf der web.xml
gelöst Frage von qwertz1Java3 Kommentare

Hallo, ich habe einen Server, der diverse Java-Servlets hat. Habe nur http-Zugriff auf diesen Server. Die Servlets kann man ...

Festplatten, SSD, Raid

Ist der Festplattenindex auf der festplatten Platine gespeichert

gelöst Frage von 77282Festplatten, SSD, Raid12 Kommentare

Hallo, ist ein Teil oder der Index der Festplatte auf dem dicken Chip auf der Festplattenplatine gespeichert? Das hat ...

Netzwerkgrundlagen

Kennwort bei der Netzwerkfreigabe wird "gespeichert"

gelöst Frage von dimaqwNetzwerkgrundlagen14 Kommentare

Es geht um eine Netzwerkfreigabe eines Ordners am NAS. Wenn man sich mit dieser Freigabe verbindet kommt die Benutzer-Passwort-Abfrage. ...

JavaScript

Wie funktioniert der Aufruf für folgende Funktion?

gelöst Frage von PeacerJavaScript4 Kommentare

Hallo Zusammen, habe hier eine HTML Seite und möchte wissen wie folgender Funktionsaufruf funktioniert: Folgende JS Dateien wurden im ...

Neue Wissensbeiträge
LAN, WAN, Wireless

Cisco Mikrotik VPN Standort Vernetzung mit dynamischem Routing

Anleitung von aqui vor 2 StundenLAN, WAN, Wireless

1. Allgemeine Einleitung Das nachfolgende Tutorial ist eine Fortführung der hier bei Administrator.de schon bestehenden VPN Tutorials und beschreibt ...

Windows Mobile

Support für Windows Mobile endet im Dezember 2019

Information von transocean vor 1 TagWindows Mobile

Moin, Microsoft empfiehlt als Alternative den Umstieg auf iOS oder Android, wie man hier lesen kann. Gruß Uwe

Internet

Kommentar: Bundesregierung erwägt Ausschluss von Huawei im 5G-Netz - Unsere Presse wird immer sensationsgieriger

Information von Frank vor 3 TagenInternet5 Kommentare

Hier mal wieder ein schönes Beispiel für fehlgeleiteten Journalismus und Politik zugleich. Da werden aus Gerüchten plötzlich Fakten, da ...

Windows 10

Netzwerk-Bug in allen Windows 10-Versionen durch Januar 2019-Updates

Information von kgborn vor 3 TagenWindows 101 Kommentar

Nur ein kurzer Hinweis für Admins, die Windows 10-Clients im Portfolio haben. Mit den Updates vom 8. Januar 2019 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Temporäre WLAN Verbindung für AD-Login
Frage von Christian.WidauerLAN, WAN, Wireless15 Kommentare

Hallo zusammen, ich weiß leider nicht unter welchem Begriff ich dafür suchen muss, daher habe ich bisher leider nichts ...

LAN, WAN, Wireless
Bekannte Drosselungen bei Providern ?
Frage von HenereLAN, WAN, Wireless15 Kommentare

Servus zusammen, in bereits angefangen, aber ich hoffe dass der Beitrag hier mehr Informationen bringt. Sind Portdrosselungen bzw gezielte ...

Netzwerkmanagement
Reverse Proxy für TCP und UDP Anfragen
gelöst Frage von flxklsNetzwerkmanagement14 Kommentare

Hallo zusammen, ich besitze einen Rootserver, der nur eine öffentliche IP besitzt und auf dem mehrere VMs laufen. Da ...

Netzwerkmanagement
Server bauen
Frage von JugendringNetzwerkmanagement11 Kommentare

Moin Moin, wir, der Jugendring sind ein ständig wachsender Verein mit vielen Unterprojekten. Da liegt es nah, dass wir ...