Jump to content

Anlegen von Shares mit Fehlerprotokoll


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

Empfohlene Beiträge

Guten Morgen!

 

Mich beschäftigt folgendes:

 

Ich hab mir vom Server X alle Shares ausgelesen, diese mit "net share" und den entsprechenden Parametern zusammengebaut - Funktioniert soweit auch alles.

 

Problematisch wird es, wenn es an die Fehlerprotokollierung geht. Da es sich dabei um ca. 100 Shares handelt, wäre es sehr aufwendig zu kontrollieren ob alle Shares angelegt wurden.

 

Ich hab ein wenig herumexperimentiert und dabei festgestellt, dass nicht immer der errorlevel gesetzt wird, d.h. eine Überprüfung über den errorlevel ist nicht möglich.

 

Ich würde das gerne folgendermaßen realisieren:

 

Alle Befehle zum anlegen der Shares werden ausgeführt. Sobald ein Befehl ausgeführt ist, soll überprüft werden ob ein Eintrag in der "error.log" hinzugefügt wurde. Der Eintrag wird mittels "2>error.log" hinzugefügt. (aka Sobald vom DOS-Prompt ein Errorcode ausgegeben wird, wird dieser dort eingetragen.).

 

Ist ein Eintrag vorhanden, soll die dazugehörige Zeile in die "failed.txt" eingetragen werden und das Skript soll normal weiter laufen.

 

Ich hoffe ihr könnt mir helfen ;)!

 

Gruß

Link zu diesem Kommentar

Hi Stephan!

 

Naja, ein alter Fileserver wird abgeschaltet und ein neuer wird aktiviert - Und da müssen die Freigaben nun neu erstellt werden ;).

 

Hab das Ganze aber dann doch noch hingekriegt. Man vergisst zu leicht zu schnell DelayedExpansion.

 

Für alle Interessierten:

 

@echo off

setlocal enabledelayedexpansion 

for /F "Delims=" %%i IN (user_shares.txt) DO ( %%i >>successful.log
	if !errorlevel! NEQ 0 (
	echo Fehler bei:       %%i >>error.log
	) 
	)
setlocal disabledelayedexpansion

 

In der user_shares.txt sind einfach die zusammengefrickelten "net share..." Befehle. Durch das DelayedExpansion kann sich der Errorcode nun auch innerhalb der FOR-Schleife entsprechend anpassen.

 

Falls noch jemand Rückfragen hat.. ;)

Link zu diesem Kommentar

Moin Narugami,

 

wenn Du den Weg über diese Textdatei user_shares.txt gehst, brauchst Du die DelayedExpansion nicht - jedenfalls nicht für eine ERRORLEVEL-Auswertung.

 

Kürzer ginge es so:


@echo off

for /F "Delims=" %%i IN (user_shares.txt) DO (
%%i >>successful.log
if errorlevel 1 echo Fehler bei: %%i >>error.log
)
[/Code]

-oder-

[Code]
@echo off
for /F "Delims=" %%i IN (user_shares.txt) DO (
%%i >>successful.log ||echo Fehler bei: %%i >>error.log
)
[/Code]

 

...soll sogar Exoten geben, die so etwas direkt als Oneliner vom CMD-Prompt abfeuern..

[Code]
@for /F "Delims=" %i IN (user_shares.txt) DO %i >>successful.log||echo Fehler bei: %i >>error.log
[/Code]

 

Grüße

Biber

Link zu diesem Kommentar
Hmm, okay. Scripting ist halt nicht meine Baustelle. Aber notfalls wären die Freigaben auch in der Registry unter "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\Shares" hinterlegt. Und eine REG-Datei ist ja schnell importiert.

 

Aber wenn es so auch gaht, dann ist ja okay.

 

Problematisch ist, dass sich teilweise Pfade geändert haben und diese entsprechend abgeändert werden mussten. Hab aber bisher auch noch nie in REG-Dateien direkt rumgefriemelt (von wegen Suchen & Ersetzen o.a.).

 

@Biber

 

Wird der Errorlevel neu eingelesen wenn das Ganze über die user_shares.txt läuft? Hatte bisher die Erfahrung gemacht, dass dieser konstant blieb - Drum hatt ich DelayedExpansion aktiviert. Aber möglicherweise hatte sich auch irgendwo der Fehlerteufel eingeschlichen.

 

Danke für den Hinweis und die verkürzte Form! :-)

Link zu diesem Kommentar

Moin narugami,

Wird der Errorlevel neu eingelesen wenn das Ganze über die user_shares.txt läuft

[/Quote]

Jein... oder zumindest der Ausdruck "eingelesen" passt hier nicht...

Also noch mal:

 

- Du hast vollkommen Recht - die Variable %errorlevel% ändert sich nicht innerhalb einer CMD-Anweisung.

Auch nicht wenn die "Zeile" der FOR-Anweisung optisch auf 30 Zeilen formatiert wird.

Somit hat ein "FOR ....%i in (whatever) Do ... & echo %errorlevel%" immer zur Folge, dass %errorlevel% IMMER den Wert anzeigt, der VOR dieser Zeile gesetzt war.

- Du hast ebenfalls Recht: Ein Auflösen der Variable %ERRORLEVEL% "erst bei jedem Anfassen" funktioniert mit DelayedExpansion und !ErrorLevel!-Schreibweise

- Nu' ich mit meiner Ergänzung: Für ERRORLEVEL existiert aber noch eine Spezial-Syntax-Erweiterung, nämlich außer den Prüfungen, die für alle Variablen gelten

-->IF %ERRORLEVEL%==1 .... ( %Errorlevel%-Var-Inhalt immer wie vor dieser Zeile)

-->IF !ERRORLEVEL!==1 ( %Errorlevel%-Var-Inhalt neu berechnet/aufgelöst)

 

....daneben gibt es noch die "IF ERRORLEVEL 1" ...... "IF ERRORLEVEL 0" -Prüfung.

Die prüft erstens nicht exakt ->"IF ERRORLEVEL 0 " ist erfüllt, wenn es 0 oder größer ist.

zweitens ist diese Prüfung aber wie die !var!-Prüfung immer topaktuell.

Hier bekommst Du also auch den ERRORLEVEL-Wert der durch die FOR-Anweisung aufgerufenen Befehle zurück.

 

Und diese Syntax habe ich bei der ersten Variation des Themas oben verwendet.

 

Grüße

Biber

Link zu diesem Kommentar
Moin narugami,

 

Jein... oder zumindest der Ausdruck "eingelesen" passt hier nicht...

Also noch mal:

 

- Du hast vollkommen Recht - die Variable %errorlevel% ändert sich nicht innerhalb einer CMD-Anweisung.

Auch nicht wenn die "Zeile" der FOR-Anweisung optisch auf 30 Zeilen formatiert wird.

Somit hat ein "FOR ....%i in (whatever) Do ... & echo %errorlevel%" immer zur Folge, dass %errorlevel% IMMER den Wert anzeigt, der VOR dieser Zeile gesetzt war.

- Du hast ebenfalls Recht: Ein Auflösen der Variable %ERRORLEVEL% "erst bei jedem Anfassen" funktioniert mit DelayedExpansion und !ErrorLevel!-Schreibweise

- Nu' ich mit meiner Ergänzung: Für ERRORLEVEL existiert aber noch eine Spezial-Syntax-Erweiterung, nämlich außer den Prüfungen, die für alle Variablen gelten

-->IF %ERRORLEVEL%==1 .... ( %Errorlevel%-Var-Inhalt immer wie vor dieser Zeile)

-->IF !ERRORLEVEL!==1 ( %Errorlevel%-Var-Inhalt neu berechnet/aufgelöst)

 

....daneben gibt es noch die "IF ERRORLEVEL 1" ...... "IF ERRORLEVEL 0" -Prüfung.

Die prüft erstens nicht exakt ->"IF ERRORLEVEL 0 " ist erfüllt, wenn es 0 oder größer ist.

zweitens ist diese Prüfung aber wie die !var!-Prüfung immer topaktuell.

Hier bekommst Du also auch den ERRORLEVEL-Wert der durch die FOR-Anweisung aufgerufenen Befehle zurück.

 

Und diese Syntax habe ich bei der ersten Variation des Themas oben verwendet.

 

Grüße

Biber

 

Man lernt nie aus ;)! Aber nun hab ichs drin :)! Danke für die ausführliche Erklärung!

 

@twenty: Werd ich mir für die nächste Migration mal vornehmen! Danke dir!

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