Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung Batch & Shell

Mitglied: ForgottenRealm

ForgottenRealm (Level 1) - Jetzt verbinden

31.10.2012 um 14:33 Uhr, 2818 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 ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Abfrage Vergleiche mit Variable goto (4)

Frage von Zunaras zum Thema Batch & Shell ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

Datenbanken
gelöst Row Number bei einer Abfrage sinnvoll einsetzen (1)

Frage von Aximand zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (8)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...