Buecherwurm 16 Geschrieben 22. April 2008 Melden Teilen Geschrieben 22. April 2008 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ß Zitieren Link zu diesem Kommentar
Stephan Betken 43 Geschrieben 22. April 2008 Melden Teilen Geschrieben 22. April 2008 Hallo Narugami, ich kann Dir zwar bei Deiner Anfrage nicht helfen, aber dennoch interessiert es mich, was Du genau vor hast. Es hört sich so an, als willst Du lediglich vorhandene Freigaben auf eine andere Maschine übernehmen. Ist das korrekt? Zitieren Link zu diesem Kommentar
Buecherwurm 16 Geschrieben 22. April 2008 Autor Melden Teilen Geschrieben 22. April 2008 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.. ;) Zitieren Link zu diesem Kommentar
Stephan Betken 43 Geschrieben 22. April 2008 Melden Teilen Geschrieben 22. April 2008 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. Zitieren Link zu diesem Kommentar
Biber 10 Geschrieben 22. April 2008 Melden Teilen Geschrieben 22. April 2008 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 offfor /F "Delims=" %%i IN (user_shares.txt) DO ( %%i >>successful.log if errorlevel 1 echo Fehler bei: %%i >>error.log )[/Code] -oder- [Code]@echo offfor /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 Zitieren Link zu diesem Kommentar
Buecherwurm 16 Geschrieben 23. April 2008 Autor Melden Teilen Geschrieben 23. April 2008 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! :-) Zitieren Link zu diesem Kommentar
Biber 10 Geschrieben 23. April 2008 Melden Teilen Geschrieben 23. April 2008 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 Zitieren Link zu diesem Kommentar
twenty 12 Geschrieben 23. April 2008 Melden Teilen Geschrieben 23. April 2008 Verwende die Suche nach "FileServerMigrationTool". Das hat mir bei der Migration unheimlich viel Arbeit abgenommen. Zitieren Link zu diesem Kommentar
Buecherwurm 16 Geschrieben 24. April 2008 Autor Melden Teilen Geschrieben 24. April 2008 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! Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.