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 ist während einer If Abfrage nicht verfügbar

Mitglied: ForgottenRealm

ForgottenRealm (Level 1) - Jetzt verbinden

31.10.2012 um 14:33 Uhr, 2866 Aufrufe, 11 Kommentare

Hallo zusammen!

Ich habe immer wieder das Problem, dass Variablen die während einer If Abfrage durch eine Funktion erstellt wurden, nicht sofort verfügbar sind.

Als konkretes Beispiel;

01.
If /i "%IsUNCPath%"=="True" ( 
02.
	Call :ReplaceUNCPath "%Zielordner%" "%UNCPath%" ZielordnerUNC 
03.
	 
04.
	Echo. 
05.
	Echo Zielordner UNC: "%ZielordnerUNC%" 
06.
)
In der Funktion ReplaceUNCPath wird die Variable ZielordnerUNC erstellt und sollte verfügbar sein (ist sie in der Funktion auch).

Wenn ich mir die Variable mit Echo während der If Abfrage ...

01.
If ... ( 
02.
    Call ... 
03.
 
04.
    Echo %ZielordnerUNC% 
05.
)
... ausgeben lasse, wird nichts angezeigt.

Wo liegt das Problem?

grüße
Mitglied: Hitman4021
31.10.2012, aktualisiert um 14:41 Uhr
Hallo,

zeig mal den Sprungpunkt ":ReplaceUNCPath".
am Ende von :ReplacUNCPath ist die Variable Verfügbar?

Eigentlich sollte es ja so funktionieren wenn die Variable richtig gesetzt wird.

Gruß
Bitte warten ..
Mitglied: mayho33
31.10.2012 um 14:45 Uhr
Hmmm, Bin echt nicht der BATCH-Guru, aber sollte die Variable nicht vor der Verwendung befüllt werden? Wäre wesentlich sicherer
Bitte warten ..
Mitglied: ForgottenRealm
31.10.2012, aktualisiert um 14:51 Uhr
01.
	:GetUNCPath 
02.
:: Ermittelt den aktuellen Wochentag 
03.
Set Value1=%1 
04.
Set Value2=%2 
05.
Set Value3=%3 
06.
If NOT defined Value1 GoTo :eof 
07.
If NOT defined Value2 GoTo :eof 
08.
If NOT defined Value3 GoTo :eof 
09.
 
10.
Set VBScriptFile=%TMP%\VBScript_%RANDOM%.vbs 
11.
 
12.
13.
	ECHO Dim Letter 
14.
	ECHO Dim Link 
15.
	ECHO Dim Host 
16.
	ECHO. 
17.
	ECHO Dim Zielordner 
18.
	ECHO. 
19.
	ECHO Zielordner ^= %Value1% 
20.
	ECHO. 
21.
	ECHO Set Network ^= CreateObject^("WScript.Network"^) 
22.
	ECHO Set Drives ^= Network.EnumNetworkDrives^(^) 
23.
	ECHO. 
24.
	ECHO For i ^= 1 To Drives.Length Step 2 
25.
	ECHO     Letter ^= Drives^(i - 1^) 
26.
	ECHO     Link ^= Drives^(i^) 
27.
	ECHO     Host ^= Split(^Link, "\"^)^(2^) 
28.
	ECHO. 
29.
	ECHO     If Left^(Zielordner, 2^) ^= Letter Then 
30.
	ECHO         WScript.Echo Link ^& "|" ^& "True" 
31.
	ECHO         Exit For 
32.
	ECHO     Else 
33.
	ECHO         WScript.Echo Link ^& "|" ^& "False" 
34.
	ECHO     End if 
35.
	ECHO Next 
36.
)>%VBScriptFile% 
37.
 
38.
:: Wert zurückgeben 
39.
For /F "tokens=1-2 delims=|" %%A IN ('cscript //nologo %VBScriptFile%') DO ( 
40.
	Set "%2=%%A" 
41.
	Set "%3=%%B" 
42.
43.
 
44.
:: Script löschen 
45.
If Exist %VBScriptFile% Del /F /Q %VBScriptFile% 
46.
 
47.
GoTo :eof
Das wäre meine Funktion GetUNCPath. Sollten Fragen dazu sein, nur zu

Die Variable wird als Stringwert an die Funktion übergeben (%3) und wird am Ende mit dem Ergebnis zurückgegeben, erst dann gibt es die Variable überhaupt.
Bitte warten ..
Mitglied: Hitman4021
31.10.2012 um 14:50 Uhr
Hallo,

Zitat von mayho33:
Hmmm, Bin echt nicht der BATCH-Guru, aber sollte die Variable nicht vor der Verwendung befüllt werden? Wäre wesentlich
sicherer
meinst du sowas in der Art
01.
set ZielordnerUNC=NULL 
02.
if %ZielordnerUNC%="NULL" ( 
03.
   echo "No UNC Path" 
04.
05.
else ( 
06.
   echo "Mache irgendwas" 
07.
)
Finde ich persönlich unötig da eine Batch Datei normalerweise nicht an sicherheitskritischen Stellen ausgeführt wird.

Gruß
Bitte warten ..
Mitglied: Hitman4021
31.10.2012 um 14:53 Uhr
Hallo,

ich glaube ich habe deinen Fehler.
Setze am Ende mal die Variable Direkt.
also
01.
set ZielordnerUNC=irgendwas
Du hast das in der gleichen Datei oder?

Gruß
Bitte warten ..
Mitglied: ForgottenRealm
31.10.2012 um 15:06 Uhr
Hallo

Auch wenn ich die Variable während der FUnktion direkt setze, und nicht über Set %3=... ist sie ausserhalb der Funktion nicht verfügbar. Erst ausserhalb der If Schleife.

Die Funktion ist in der selben Datei.
Bitte warten ..
Mitglied: Hitman4021
31.10.2012 um 15:15 Uhr
Hallo,

Zitat von ForgottenRealm:
Auch wenn ich die Variable während der FUnktion direkt setze, und nicht über Set %3=... ist sie ausserhalb der Funktion
nicht verfügbar.
Habe es gerade nach gebaut und getestet, anscheinend wird die Variable erst danach zugewiesen. Keine Ahnung warum meine Batch Fähigkeiten sind etwas begrenzt.

Erst ausserhalb der If Schleife.
Es gibt Keine If Schleife.
IF, Case, etc. sind Abzweigungen
For, Foreach, While, etc. sind Schleifen

Gruß
Bitte warten ..
Mitglied: ForgottenRealm
31.10.2012 um 15:27 Uhr
Ja ich habe es einfach mal so genannt

Ok dann warte ich mal ob noch jemand eine Idee hat.

Hier mal die komplette Funktion zum Testen.

01.
@Echo OFF & setlocal enabledelayedexpansion 
02.
 
03.
Set Zielordner=Z:\Sicherung und so 
04.
Set ZielordnerUNC=Nix 
05.
 
06.
:: Abfrage 
07.
Call :GetUNCPath "%Zielordner%" UNCPath IsUNCPath 
08.
 
09.
:: Ausgabe 
10.
If /i "%IsUNCPath%"=="True" ( 
11.
	Echo Der Ordner "%Zielordner%" ist ein Netzlaufwerk 
12.
	Echo. 
13.
	Echo Pfad: "%UNCPath%" 
14.
) Else ( 
15.
	Echo Der Ordner "%Zielordner%" ist ein lokaler Ordnerpfad 
16.
17.
 
18.
:: Ändert einen Netzlaufwerkpfad in einen UNC Pfad 
19.
If /i "%IsUNCPath%"=="True" ( 
20.
	Call :ReplaceUNCPath "%Zielordner%" "%UNCPath%" ZielordnerUNC 
21.
 
22.
	:: Hier gibt es die Variable noch nicht 
23.
	Echo. 
24.
	Echo Zielordner UNC: "%ZielordnerUNC%" 
25.
26.
 
27.
:: Hier ist die Variable vorhanden 
28.
Echo. 
29.
Echo Zielordner UNC: "%ZielordnerUNC%" 
30.
 
31.
pause 
32.
 
33.
exit 
34.
:: ________________________________________________________________________________________________ 
35.
	:GetUNCPath 
36.
:: Ermittelt den aktuellen Wochentag 
37.
Set Value1=%1 
38.
Set Value2=%2 
39.
Set Value3=%3 
40.
If NOT defined Value1 GoTo :eof 
41.
If NOT defined Value2 GoTo :eof 
42.
If NOT defined Value3 GoTo :eof 
43.
 
44.
Set VBScriptFile=%TMP%\VBScript_%RANDOM%.vbs 
45.
 
46.
47.
	ECHO Dim Letter 
48.
	ECHO Dim Link 
49.
	ECHO Dim Host 
50.
	ECHO. 
51.
	ECHO Dim Zielordner 
52.
	ECHO. 
53.
	ECHO Zielordner ^= %Value1% 
54.
	ECHO. 
55.
	ECHO Set Network ^= CreateObject^("WScript.Network"^) 
56.
	ECHO Set Drives ^= Network.EnumNetworkDrives^(^) 
57.
	ECHO. 
58.
	ECHO For i ^= 1 To Drives.Length Step 2 
59.
	ECHO     Letter ^= Drives^(i - 1^) 
60.
	ECHO     Link ^= Drives^(i^) 
61.
	ECHO     Host ^= Split(^Link, "\"^)^(2^) 
62.
	ECHO. 
63.
	ECHO     If Left^(Zielordner, 2^) ^= Letter Then 
64.
	ECHO         WScript.Echo Link ^& "|" ^& "True" 
65.
	ECHO         Exit For 
66.
	ECHO     Else 
67.
	ECHO         WScript.Echo Link ^& "|" ^& "False" 
68.
	ECHO     End if 
69.
	ECHO Next 
70.
)>%VBScriptFile% 
71.
 
72.
:: Wert zurückgeben 
73.
For /F "tokens=1-2 delims=|" %%A IN ('cscript //nologo %VBScriptFile%') DO ( 
74.
	Set "%2=%%A" 
75.
	Set "%3=%%B" 
76.
77.
 
78.
:: Script löschen 
79.
If Exist %VBScriptFile% Del /F /Q %VBScriptFile% 
80.
 
81.
GoTo :eof 
82.
:: ________________________________________________________________________________________________ 
83.
	:ReplaceUNCPath 
84.
:: Wandelt den übergebenen Ordnerpfad in einen UNC Pfad um 
85.
Set Value1=%1 
86.
Set Value2=%2 
87.
Set Value3=%3 
88.
If NOT defined Value1 GoTo :eof 
89.
If NOT defined Value2 GoTo :eof 
90.
If NOT defined Value3 GoTo :eof 
91.
 
92.
Set VBScriptFile=%TMP%\VBScript_%RANDOM%.vbs 
93.
 
94.
95.
	ECHO Dim Zielordner 
96.
	ECHO Dim UNCPath 
97.
	ECHO Dim ZielordnerUNC 
98.
	ECHO. 
99.
	ECHO Zielordner = %Value1% 
100.
	ECHO UNCPath = %Value2% 
101.
	ECHO. 
102.
	ECHO ZielordnerUNC ^= UNCPath ^& Mid^(Zielordner, 3, Len^(Zielordner^) - 2^) 
103.
	ECHO. 
104.
	ECHO WScript.Echo ZielordnerUNC 
105.
)>%VBScriptFile% 
106.
 
107.
:: Wert zurückgeben 
108.
For /F "tokens=1 delims=|" %%A IN ('cscript //nologo %VBScriptFile%') DO ( 
109.
	Set "%3=%%A" 
110.
111.
 
112.
:: Script löschen 
113.
If Exist %VBScriptFile% Del /F /Q %VBScriptFile% 
114.
 
115.
GoTo :eof
Bitte warten ..
Mitglied: bastla
31.10.2012 um 15:31 Uhr
Hallo ForgotenRealm!

Du aktivierst zwar richtiger Weise "delayedExpansion", verwendest sie dann aber nicht - versuch es daher mit der Schreibweise "!ZielordnerUNC!" ...

Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
31.10.2012, aktualisiert um 16:00 Uhr
moin,

  1. in einer Befehlszeile gibt es jeden Variablenwert in %ProzentZeichen% genau so wieder, wie dieser vor dieser Befehlszeile war oder bestimmt worden ist.
  2. Klammern fassen den Inhalt zu einer Befehlszeile zusammen also auch den Call zwischendrin.
  3. IF (Befehl) ELSE Befehl ist auch als eine Befehlszeile zu werten.

Zeile 13-35 fasst Du ja auch mit Klammern zu einer Befehlszeile zusammen, um die Umleitung insgesamt in die Datei zu schreiben.

Gruß Phil
Bitte warten ..
Mitglied: ForgottenRealm
01.11.2012 um 08:29 Uhr
Guten Morgen!

Mit "!ZielordnerUNC!" funktioniert die Ausgabe während des If jetzt, vielen Dank!


Nur noch mal für mich zum besseren Verständnis ...

Eine Variable, die in den Klammern gesetzt wird, kann nicht über %% sondern nur durch !! abgerufen/verwendet werden. Der Grund dafür ist, das alle Befehle in den Klammern ein Befehlsaufruf sind.
Bitte warten ..
Ähnliche Inhalte
Microsoft Office

Accsess SQL Abfrage als Variable in einer anderen Abfrage übergeben

Frage von Luna01Microsoft Office1 Kommentar

Guten Morgen, zu meinem Problem: ich habe mehrere (Haupt-) Abfragen, die ich über ein Kombinationsfeld KombiHauptabfrage aufrufe. qyrHaupt1, qyrHaupt2, ...

Batch & Shell

Variablen außerhalb einer For Schleife abfragen

gelöst Frage von Michael-24Batch & Shell3 Kommentare

Hallo miteinander, ich habe ein Problem, bei dem ich überhaupt nicht weiter komme. Ich möche ein kleine Batchdatei erstellen, ...

VB for Applications

Abfrage, ob Datei mit Variablem Wert existiert

gelöst Frage von AnrionVB for Applications12 Kommentare

Hallo Forum, Ich habe diesen Code: Jedoch funktioniert er nicht ganz wie er soll (bzw. gar nicht). Es soll ...

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

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 2 TagenWindows 105 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 2 TagenAdministrator.de Feedback18 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 2 TagenHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 3 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Router & Routing
Router auf Orginal Firmware zurück flashen mit Tftpd
Frage von ILeonardRouter & Routing21 Kommentare

Hallo, Ich habe zwei Router, einmal TP-Link 841n v11 und TP-Link 940N v5. Ich wollte fragen, ob jemand mir ...

Router & Routing
WRT keine Verbindung zum Web Interface
gelöst Frage von ILeonardRouter & Routing18 Kommentare

Hallo, Ich habe einen TP-Link WR841n mit wrt geflasht, das Problem ist ich kann mich mit 192.168.1.1 nicht verbinden. ...

TK-Netze & Geräte
Telefonie zweier Fritzboxen mit je eigenem DSL Anschluss verbinden
Frage von hannsgmaulwurfTK-Netze & Geräte10 Kommentare

Hallo zusammen, ich habe hier einen Haushalt mit zwei Anschlüssen. Einmal ISDN, einmal DSL. An jedem Anschluss hängt eine ...

Windows Server
Standortvernetzung zu einem Strato VServer (Windows)
Frage von matzefratze81Windows Server10 Kommentare

Moin, ich komme aus einem Enterprise-Umfeld und habe den Fehler gemacht, dass ich mich auf ein kleines Unternehmen eingelassen ...