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

Frage Entwicklung Batch & Shell

Mitglied: ForgottenRealm

ForgottenRealm (Level 1) - Jetzt verbinden

31.10.2012 um 14:33 Uhr, 2851 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
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 ...

Batch & Shell
Batch Abfrage Vergleiche mit Variable goto
gelöst Frage von ZunarasBatch & Shell4 Kommentare

Schönen guten Tag! ich habe mir ein Script gebastelt. Mehr nach dem Try and Error Prinzip als wirklichem Können. ...

Windows Server
Abfragen, wann eine im AD erstellte Gruppe verfügbar ist
Frage von imacerWindows Server4 Kommentare

Hallo zusammen, unsere DCs stehen alle beim Konzern im Ausland. Daher dauert es etwas, wenn ich eine neue Sicherheitsgruppe ...

Neue Wissensbeiträge
Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 3 StundenLinux12 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 1 TagHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Heiß diskutierte Inhalte
Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing14 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Linux
Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde
Information von FrankLinux12 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Windows 10
Alle Programme mit bestimmtem Namen automatisch (per GPO) deinstallieren
gelöst Frage von lordofremixesWindows 1012 Kommentare

Hallo zusammen, gibt es eine Möglichkeit, alle Programme beginnend mit z.B. "Dell" im Namen per Script und somit per ...