forgottenrealm
Goto Top

Variable ist während einer If Abfrage nicht verfügbar

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;

If /i "%IsUNCPath%"=="True" (  
	Call :ReplaceUNCPath "%Zielordner%" "%UNCPath%" ZielordnerUNC  
	
	Echo.
	Echo Zielordner UNC: "%ZielordnerUNC%"  
)

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

If ... (
    Call ...

    Echo %ZielordnerUNC%
)

... ausgeben lasse, wird nichts angezeigt.

Wo liegt das Problem?

grüße face-smile

Content-Key: 193556

Url: https://administrator.de/contentid/193556

Printed on: April 19, 2024 at 22:04 o'clock

Member: Hitman4021
Hitman4021 Oct 31, 2012 updated at 13:41:10 (UTC)
Goto Top
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ß
Member: mayho33
mayho33 Oct 31, 2012 at 13:45:18 (UTC)
Goto Top
Hmmm, Bin echt nicht der BATCH-Guru, aber sollte die Variable nicht vor der Verwendung befüllt werden? Wäre wesentlich sicherer
Member: ForgottenRealm
ForgottenRealm Oct 31, 2012 updated at 13:51:06 (UTC)
Goto Top
	:GetUNCPath
:: Ermittelt den aktuellen Wochentag
Set Value1=%1
Set Value2=%2
Set Value3=%3
If NOT defined Value1 GoTo :eof
If NOT defined Value2 GoTo :eof
If NOT defined Value3 GoTo :eof

Set VBScriptFile=%TMP%\VBScript_%RANDOM%.vbs

(
	ECHO Dim Letter
	ECHO Dim Link
	ECHO Dim Host
	ECHO.
	ECHO Dim Zielordner
	ECHO.
	ECHO Zielordner ^= %Value1%
	ECHO.
	ECHO Set Network ^= CreateObject^("WScript.Network"^)  
	ECHO Set Drives ^= Network.EnumNetworkDrives^(^)
	ECHO.
	ECHO For i ^= 1 To Drives.Length Step 2
	ECHO     Letter ^= Drives^(i - 1^)
	ECHO     Link ^= Drives^(i^)
	ECHO     Host ^= Split(^Link, "\"^)^(2^)  
	ECHO.
	ECHO     If Left^(Zielordner, 2^) ^= Letter Then
	ECHO         WScript.Echo Link ^& "|" ^& "True"  
	ECHO         Exit For
	ECHO     Else
	ECHO         WScript.Echo Link ^& "|" ^& "False"  
	ECHO     End if
	ECHO Next
)>%VBScriptFile%

:: Wert zurückgeben
For /F "tokens=1-2 delims=|" %%A IN ('cscript //nologo %VBScriptFile%') DO (  
	Set "%2=%%A"  
	Set "%3=%%B"  
)

:: Script löschen
If Exist %VBScriptFile% Del /F /Q %VBScriptFile%

GoTo :eof

Das wäre meine Funktion GetUNCPath. Sollten Fragen dazu sein, nur zu face-smile

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.
Member: Hitman4021
Hitman4021 Oct 31, 2012 at 13:50:18 (UTC)
Goto Top
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
set ZielordnerUNC=NULL
if %ZielordnerUNC%="NULL" (  
   echo "No UNC Path"  
)
else (
   echo "Mache irgendwas"  
)

Finde ich persönlich unötig da eine Batch Datei normalerweise nicht an sicherheitskritischen Stellen ausgeführt wird.

Gruß
Member: Hitman4021
Hitman4021 Oct 31, 2012 at 13:53:32 (UTC)
Goto Top
Hallo,

ich glaube ich habe deinen Fehler.
Setze am Ende mal die Variable Direkt.
also
set ZielordnerUNC=irgendwas

Du hast das in der gleichen Datei oder?

Gruß
Member: ForgottenRealm
ForgottenRealm Oct 31, 2012 at 14:06:58 (UTC)
Goto Top
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.
Member: Hitman4021
Hitman4021 Oct 31, 2012 at 14:15:57 (UTC)
Goto Top
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ß
Member: ForgottenRealm
ForgottenRealm Oct 31, 2012 at 14:27:26 (UTC)
Goto Top
Ja ich habe es einfach mal so genannt face-smile

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

Hier mal die komplette Funktion zum Testen.

@Echo OFF & setlocal enabledelayedexpansion

Set Zielordner=Z:\Sicherung und so
Set ZielordnerUNC=Nix

:: Abfrage
Call :GetUNCPath "%Zielordner%" UNCPath IsUNCPath  

:: Ausgabe
If /i "%IsUNCPath%"=="True" (  
	Echo Der Ordner "%Zielordner%" ist ein Netzlaufwerk  
	Echo.
	Echo Pfad: "%UNCPath%"  
) Else (
	Echo Der Ordner "%Zielordner%" ist ein lokaler Ordnerpfad  
)

:: Ändert einen Netzlaufwerkpfad in einen UNC Pfad
If /i "%IsUNCPath%"=="True" (  
	Call :ReplaceUNCPath "%Zielordner%" "%UNCPath%" ZielordnerUNC  

	:: Hier gibt es die Variable noch nicht
	Echo.
	Echo Zielordner UNC: "%ZielordnerUNC%"  
)

:: Hier ist die Variable vorhanden
Echo.
Echo Zielordner UNC: "%ZielordnerUNC%"  

pause

exit
:: ________________________________________________________________________________________________
	:GetUNCPath
:: Ermittelt den aktuellen Wochentag
Set Value1=%1
Set Value2=%2
Set Value3=%3
If NOT defined Value1 GoTo :eof
If NOT defined Value2 GoTo :eof
If NOT defined Value3 GoTo :eof

Set VBScriptFile=%TMP%\VBScript_%RANDOM%.vbs

(
	ECHO Dim Letter
	ECHO Dim Link
	ECHO Dim Host
	ECHO.
	ECHO Dim Zielordner
	ECHO.
	ECHO Zielordner ^= %Value1%
	ECHO.
	ECHO Set Network ^= CreateObject^("WScript.Network"^)  
	ECHO Set Drives ^= Network.EnumNetworkDrives^(^)
	ECHO.
	ECHO For i ^= 1 To Drives.Length Step 2
	ECHO     Letter ^= Drives^(i - 1^)
	ECHO     Link ^= Drives^(i^)
	ECHO     Host ^= Split(^Link, "\"^)^(2^)  
	ECHO.
	ECHO     If Left^(Zielordner, 2^) ^= Letter Then
	ECHO         WScript.Echo Link ^& "|" ^& "True"  
	ECHO         Exit For
	ECHO     Else
	ECHO         WScript.Echo Link ^& "|" ^& "False"  
	ECHO     End if
	ECHO Next
)>%VBScriptFile%

:: Wert zurückgeben
For /F "tokens=1-2 delims=|" %%A IN ('cscript //nologo %VBScriptFile%') DO (  
	Set "%2=%%A"  
	Set "%3=%%B"  
)

:: Script löschen
If Exist %VBScriptFile% Del /F /Q %VBScriptFile%

GoTo :eof
:: ________________________________________________________________________________________________
	:ReplaceUNCPath
:: Wandelt den übergebenen Ordnerpfad in einen UNC Pfad um
Set Value1=%1
Set Value2=%2
Set Value3=%3
If NOT defined Value1 GoTo :eof
If NOT defined Value2 GoTo :eof
If NOT defined Value3 GoTo :eof

Set VBScriptFile=%TMP%\VBScript_%RANDOM%.vbs

(
	ECHO Dim Zielordner
	ECHO Dim UNCPath
	ECHO Dim ZielordnerUNC
	ECHO.
	ECHO Zielordner = %Value1%
	ECHO UNCPath = %Value2%
	ECHO.
	ECHO ZielordnerUNC ^= UNCPath ^& Mid^(Zielordner, 3, Len^(Zielordner^) - 2^)
	ECHO.
	ECHO WScript.Echo ZielordnerUNC
)>%VBScriptFile%

:: Wert zurückgeben
For /F "tokens=1 delims=|" %%A IN ('cscript //nologo %VBScriptFile%') DO (  
	Set "%3=%%A"  
)

:: Script löschen
If Exist %VBScriptFile% Del /F /Q %VBScriptFile%

GoTo :eof
Member: bastla
bastla Oct 31, 2012 at 14:31:35 (UTC)
Goto Top
Hallo ForgotenRealm!

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

Grüße
bastla
Member: pieh-ejdsch
pieh-ejdsch Oct 31, 2012 updated at 15:00:43 (UTC)
Goto Top
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
Member: ForgottenRealm
ForgottenRealm Nov 01, 2012 at 07:29:23 (UTC)
Goto Top
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.