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.

Frage Entwicklung Batch & Shell

Mitglied: LaserPanzerWal

LaserPanzerWal (Level 1) - Jetzt verbinden

03.11.2011, aktualisiert 18.10.2012, 3159 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
Batch & Shell
Variable von EIN.bat in ZWEI.bat aufrufen
gelöst Frage von BatchAnfaenger91Batch & Shell8 Kommentare

Hi an alle, meine Frage ist, ist es möglich eine gespeicherte Variable von ein Batch Datei in eine andere ...

Batch & Shell
Wie Device name in Variable einfügen
gelöst Frage von it-fisiBatch & Shell6 Kommentare

Hallo, ich möchte per Batch file mit ADB auf mein Android Handy zugreifen. Zur Prüfung ob die Verbindung besteht ...

VB for Applications
Bestimmtes Arrayfeld mit Variable aufrufen? - VBS
gelöst Frage von gabrixlVB for Applications10 Kommentare

Hallo zusammen! Ist es möglich ein Arrayfeld mit einer Variable aufzurufen, anstatt eine Zahl zu verwenden? Das war meine ...

Batch & Shell
Datei mit Variablem namen in Variablem Verzeichnis umbenennen
Frage von PinkFLuffyUnicornBatch & Shell6 Kommentare

Moin Leute,i bims mal wieder. ich versuche nun seit ner gefühlten Ewigkeit, folgendes Script zum laufen zu bringen. es ...

Neue Wissensbeiträge
Datenschutz

Weitere Inforamtionen zum Sicherheitsproblem BeA

Information von Penny.Cilin vor 38 MinutenDatenschutz

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 2 StundenWindows 103 Kommentare

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

Microsoft Office

Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei

Anleitung von SarekHL vor 5 StundenMicrosoft Office17 Kommentare

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

Erkennung und -Abwehr

Sicherheitslücke Spectre und Meltdown: Status prüfen

Anleitung von Frank vor 11 StundenErkennung und -Abwehr2 Kommentare

Nach all den Updates der letzten Woche sollte man unbedingt auch den Status prüfen, ob die Sicherheitslücken Spectre, Meltdown ...

Heiß diskutierte Inhalte
Netzwerke
NTFS-Berechtigung
Frage von Daoudi1973Netzwerke23 Kommentare

Hallo zusammen und frohes neues Jahr (Sorry, ich bin spät dran) Meine Frage: 1- Ich habe einen Ordner im ...

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 ...

Drucker und Scanner
Gesucht DIN A3 Drucker
Frage von NebellichtDrucker und Scanner15 Kommentare

Hallo, ich möchte einen neuen DIN A3 Drucker kaufen. Um ab und zu, ca. 1 mal die Woche Farbausdrucke ...

E-Business
Bankgeheimnis abgeschafft - wie kann ich mich wehren?
Frage von honeybeeE-Business13 Kommentare

Hallo, ich nehme Bezug auf diesen Artikel: Als ich das gelesen habe, wurde mir schlecht Es geht ja niemanden ...