Jump to content

Batch-Script mit If ( ) Blöcken


Gast Flipshot
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Gast Flipshot

Ich habe folgendes Batch-Script:

 

If "%ErrorLevel%" == "0" (

  If Exist "%LW_PC_Kunde%" (

    Echo %Indent%EXEC: Net Use "%LW_PC_Kunde%" /Delete >> "%LogFile%"

    Net Use "%LW_PC_Kunde%" /Delete > Nul

    Echo %Indent%PARAMETER: ErrorLevel=%ErrorLevel% >> "%LogFile%"

   )

 

  Echo Verbinde Laufwerk "%LW_PC_Kunde%" mit Freigabe "\\%H_LW_Server%\%H_LW%"...

 

  Echo %Indent%EXEC: Net Use "%LW_PC_Kunde%" "\\%H_LW_Server%\%H_LW%" >> "%LogFile%"

  Net Use "%LW_PC_Kunde%" "\\%H_LW_Server%\%H_LW%" > Nul

  Echo %Indent%PARAMETER: ErrorLevel=%ErrorLevel% >> "%LogFile%"

)

 

Gehen wir davon aus, dass die Bedingung "%ErrorLevel%" == "0" immer erfüllt ist und die Verarbeitung des If-Blocks statt findet.

 

Nun habe ich folgendes Problem, dass der If-Block

 

  If Exist "%LW_PC_Kunde%" (

    Echo %Indent%EXEC: Net Use "%LW_PC_Kunde%" /Delete >> "%LogFile%"

    Net Use "%LW_PC_Kunde%" /Delete > Nul

    Echo %Indent%PARAMETER: ErrorLevel=%ErrorLevel% >> "%LogFile%"

   )

 

auf einigen NT-PCs nur ausgeführt wird, wenn das Laufwerk wirklich bereits verbunden ist. Es wird also getrennt und neu verbunden. Wenn das Laufwerk nicht existiert, dann es jedoch auch nicht neu verbunden, die Anweisung zum neu verbinden, nach dem If-Block werden irgendwie einfach ignoriert.

 

Ich habe jetzt sowohl NT-PCs im Haus auf denen das einwandfrei funktioniert, und ich habe welche auf denen es absolut net funktioniert. Ich kann aber keinen Unterschied der PCs ausfindig machen.

 

Weiss hierzu jemand Rat?!

Link zu diesem Kommentar

hi!

 

also ich hab mal die echos weggetan...

 

If %ErrorLevel% == "0" (

If Exist %LW_PC_Kunde% (

Net Use %LW_PC_Kunde% /Delete > Nul

)

Net Use %LW_PC_Kunde% \\%H_LW_Server%\%H_LW% > Nul

)

 

die ganzen anführungszeichen kannst du dir sparen....sind ja alles variablen und keine strings.

 

 

 

so sollte es doch gehen oder?

hast du das ganze noch in eine for schleife gepackt? oder woher nimmst du die hostnamen?

 

oder du machst:

 

If %ErrorLevel% == "0" goto netzlaufwerke

 

 

:netzlaufwerke

If Exist %LW_PC_Kunde% Net Use %LW_PC_Kunde% /Delete >Nul

Net Use %LW_PC_Kunde% \\%H_LW_Server%\%H_LW% > Nul

 

 

lg

dani

Link zu diesem Kommentar

Moin Flipshot,

das Script ist also komplett o.k., nur an manchen Workstations läuft es nicht. Ich denke, für Deine Echos und Checks hast Du gute Gründe. Das erinnert mich an ein Anmeldescript, das ich in Delphi geschrieben hatte, so richtig schön mit roter und grüner Ampel. Das Dingen lieft erst in dem Moment auf wirklich allen Kisten, als ich zwischen die einzelnen Abfragen (WinAPI) soviele Timerticks gesetzt habe, daß das Prog auf der schnellsten Kiste lief (Schnellste = die schnellste im Netz!)

Setz doch mal zwischen Abfragen und NET USE - Befehle WAITs. Ich kann mir gut vorstellen, daß es dann auf allen Kisten läuft.

[zu den Wait: Ich habe da zwei Progrämmchen im Einsatz WAIT x und SLEEP x ((x=Sekunden), weiß aber nicht mehr, wo ich die her habe]

Ansonsten kenne ich bei solchen Scripten auch noch das Problem, daß WerWeißIch mal wieder irgend eine permanente Verbindung geschaffen hat. Unter diesem Aspekt ist "trenne alles" von lefg "Edgar" natürlich erste Wahl, weil es reinen Tisch macht. Ich sehe immer zu, einigermaßen Laufwerksbuchstaben-homogene Workstations im Netz zu haben, schreibe eine Batch aus lauter NET USE [Letter] / D > NUL und wandle sie mit Bat2Exec (ZiffDavis / PC-Mag - Utility) in eine .COM um, die ich dann zu Beginn des Scriptes aus \Netlogon$ aufrufe.

Viel Erfolg!

Link zu diesem Kommentar
Gast Flipshot
Original geschrieben von Dr.Lecter^

die ganzen anführungszeichen kannst du dir sparen....sind ja alles variablen und keine strings.

 

Ich setz nur sicherheitshalber Anführungszeichen drum rum. Könnt ja sein, dass mal jemand auf die Idee kommt und die Freigabe mit getrennten Wörtern schreibt.

 

 

Original geschrieben von Dr.Lecter^

hast du das ganze noch in eine for schleife gepackt? oder woher nimmst du die hostnamen?

 

Nein, es is keine Schleife drum rum. Die Variablen lass ich vorher setzen.

 

 

Original geschrieben von Dr.Lecter^

oder du machst:

 

If %ErrorLevel% == "0" goto netzlaufwerke

 

 

:netzlaufwerke

If Exist %LW_PC_Kunde% Net Use %LW_PC_Kunde% /Delete >Nul

Net Use %LW_PC_Kunde% \\%H_LW_Server%\%H_LW% > Nul

 

Von dieser Spaghetti-Programmierung will ich ja grad weg kommen!

Link zu diesem Kommentar
Original geschrieben von Flipshot

Ist aber nicht sauber! Siehe Beitrag zur Spaghetti-Programmierung.

 

Ich habe mich in meiner Programmierbegeisterung auch schon mal in solch ein Problem verbissen. Am Ende kam ich zu der Erkenntnis: Einfach ist manchmal besser.

Bei einem Hobby spielt die Zeit meist eine untergeordnete Rolle, bei einem Kunden oder in einem Institut geht es um teure Arbeitszeit.

 

Gruß

Edgar

Link zu diesem Kommentar
Gast Flipshot

Wenn ich das Laufwerk immer erst löschen lass, dann bekomm ich eine Fehlermeldung, wenn das Laufwerk net existiert, die ich aber auch net unterdrücken kann.

 

Es funktioniert mit dem neu verbinden dann zwar, die Fehlermeldung bringt aber die User durcheinander.

Link zu diesem Kommentar

Hi Flipshot!

 

Probier mal von der Konsole aus das hier:

if exist q:\.. echo Ist da

oder

if not exist q:\.. echo Ist sich nix mit q

 

und setz entsprechend in das Script statt

net use q: /d

einfach

if exist q:\.. net use q: /D > nul

 

Leider klappt das bei NET USE LPT1 /D nicht. Aber bei den Laufwerken müßte es jetzt bei Dir im grünen Bereich sein.

Gegrüßt!

Link zu diesem Kommentar

Ein Tipp.

 

http://www.bb-sys.de/bbshell.htm

 

Umlenkung von Ein- und Ausgabe:

 

BEFEHL > DATEI lenkt die Ausgabe auf eine angegebene Datei oder ein Standardgerät (LPT1, CON, PRN oder CONOUTS$) um. C:\DIR > DIR.TXT leitet das Inhaltsverzeichnis von C:\ in die Textdatei DIR.TXT. Dabei wird die Textdatei immer neu erstellt. C:\DIR >> DIR.TXT leitet das Inhaltsverzeichnis von C:\ an das Ende einer vorhandenen Textdatei DIR.TXT oder erstellt diese neu.

BEFEHL < DATEI leitet die Daten aus einer Datei in eine Befehlseingabe um.

BEFEHL 2> DATEI leitet Fehlermeldungen eines Befehls in die angegebene Datei um.

BEFEHL > DATEI 2>&1 leitet die Ausgabe und die Fehlermeldungen in die gleiche Datei um.

BEFEHL | BEFEHL leitet die Ausgabe eines Befehls in die Eingabe des nächsten Befehls (Pipe). C:\DIR | MORE leitet das Inhaltsverzeichnis in den MORE-Befehl zur seitenweise Anzeige

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...