hoffi3d
Goto Top

Bat - Schleife aus txt Datei

Hallo,

ich habe mir ein kleines Sicherungsscript gebastelt, und würde dieses gerne vereinfachen.
Im Augenblick habe ich für jeden zu sichernden Rechner einen Abschnitt in der BAT.
Schön wäre es aber wenn ich die Eckdaten (Rechnername, Adresse, Infos) in eine .txt schreiben könnte und die Schleife, Zeile für Zeile abläuft:

Hier mal der "Code" für jeden einzelnen PC. Fett ist alles was sich von PC zu PC ändert
Für weitere Vereinfachungen bin ich natürlich offen!


echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> **Rechnername** - **Nutzername** %date% %time% <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> %errordatei%  
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> **Rechnername** - **Nutzername** %date% %time% <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> %logdatei%  
ping -n 1 **Rechnername** >> %logdatei% 2>&1
IF ERRORLEVEL == 1 (
  echo.
  ECHO !nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar! >> %errordatei%
  echo.

  
  ) ELSE (
    echo.
  ECHO [_/] Ping >> %errordatei%
  net use U: \\**Rechnername**\d /user:%nutzer% %passwort% >> %logdatei% 2>&1
IF ERRORLEVEL == 1 (
  echo.
  ECHO !Netzlaufwerk wurde nicht eingebunden!Netzlaufwerk wurde nicht eingebunden!Netzlaufwerk wurde nicht eingebunden!Netzlaufwerk wurde nicht eingebunden!Netzlaufwerk wurde nicht eingebunden! >> %errordatei%
  echo.

  
  ) ELSE (
    echo.
  ECHO [_/] Netzlaufwerk >> %errordatei%
  ROBOCOPY U:\ D:\sicherung\**Rechnername**\D /XD "System Volume Information" "$RECYCLE.BIN" /XF MEMORY.DMP /MIR /TEE /ETA /COPY:DAT /a-:hs /r:0 /w:1 /NP /NFL /NDL /NJH >> %logdatei%  
    IF ERRORLEVEL == 16 (
  echo.
  ECHO !es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert! >> %errordatei%
  echo.

  
  ) ELSE (
    echo.
  ECHO [_/] gesichert >> %errordatei%
  echo.
   
    )
  net use u: /delete /yes
  echo.
   
    )
  echo.
   
    )



P.S. wenn mir jemand erklärt wie ich Code mit Zeilenzahl und in einer Tabelle im Forum poste wäre ich Happy ;)

Content-Key: 235711

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

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

Member: Xaero1982
Xaero1982 Apr 16, 2014 at 07:53:51 (UTC)
Goto Top
Hi,

so ganz blick ichs nicht was du da eigentlich machst? Wozu soll diese "Sicherung" gut sein? Wieso benutzt du nicht die Boardmittel von Windows?
Von welchem OS reden wir hier?

Benutze vor dem Code den <"code"> Tag und danach den <"/code"> Tag. Jeweils ohne " ".

Gruß
Member: hoffi3d
hoffi3d Apr 16, 2014 at 08:03:25 (UTC)
Goto Top
hallo,

es werden alle PC´s im Netzwerk gesichert sprich auf meinen PC kopiert und von dort auf eine USB-Festplatte!
Was für Boardmittel existieren dafür????

Von Win 7

 Code 

Cool ;)
Member: Xaero1982
Xaero1982 Apr 16, 2014 updated at 08:10:03 (UTC)
Goto Top
Member: hoffi3d
hoffi3d Apr 16, 2014 at 08:21:32 (UTC)
Goto Top
erledigt.

Windowssicherung hilft mir aber meines Wissens nach nicht ferne Rechner übers Netzwerk zu sichern und die Daten auf eine USB Festplatte zu sichern.
Ich sichere hier 20 Rechner!
Ausserdem müssen die Dateien einzeln abrufbar sein, also ich brauche keine Image sondern jede Datei einzeln...!

Das Script funktioniert ja 1a, ich brauche nur eine Variante wo ich die Variablen also Rechnername etc. aus einer txt Datei ziehen kann und die Schleife Zeile für Zeile der TXT Datei durchläuft!
Member: colinardo
colinardo Apr 16, 2014 updated at 10:08:26 (UTC)
Goto Top
Hallo hoffi3d,
kleines Beispiel wenn deine Textdatei z.B. so aussieht (Spalten via Semikolon getrennt):
PC01;maxmustermann;Passw0rd
PC02;henriettemuster;Passw0rd
PC03;seppmeier;Passw0rd
kannst du sie hiermit durchlaufen:
for /f "usebackq tokens=1-3 delims=;" %%a in ("deineDatei.txt") DO @(  
  echo Rechnername: %%a / Nutzername: %%b / Password: %%c
  REM Hier machst du Backup für den jeweiligen Rechner
)
Grüße Uwe
Member: Xaero1982
Xaero1982 Apr 16, 2014 updated at 08:41:27 (UTC)
Goto Top
Auch das geht problemlos wenn du es mal eingerichtet hast und der Zugriff auf einzelne Dateien geht auch durch doppelklick auf die Sicherung face-smile

Aber seis drum... was der "Kunde" will, soll der "Kunde" haben.

An den Anfang der Batch:
FOR /F "tokens=1,2,3 delims=," %%i in (test.txt) do (  
set nutzer=%%i
set rechnername=%%j
set passwort=%%k

Ans Ende der Batch:
)

Sollte theoretisch klappen. Auch wenn ich das Gefühl habe, dass du uns was verschweigst ... das ist nicht die ganze Batch, weil deine Variablen fehlen etc.

Gruß
Edit: Da war der Colinardo schneller ... meine Textdatei ist mit Nutzer,Rechnername,PW aufgebaut und mit einem Komma getrennt.
Member: colinardo
colinardo Apr 16, 2014 updated at 08:42:33 (UTC)
Goto Top
Zitat von @hoffi3d:
es werden alle PC´s im Netzwerk gesichert sprich auf meinen PC kopiert und von dort auf eine USB-Festplatte!
Was für Boardmittel existieren dafür????
Windows Backup kann auch auf Netzlaufwerke sichern ... und lässt sich ebenfalls über die Kommandozeile steuern:
wbadmin start backup -allCritical -vssfull -quiet -noVerify -include:c: -backupTarget:\\Servername\Freigabe"
und in das Backup lässt sich auch hineinschauen da in eine VHD gesichert wird, die man unter Windows als Laufwerk mounten kann wenn man möchte.
Member: hoffi3d
hoffi3d Apr 16, 2014 at 09:43:52 (UTC)
Goto Top
Hallo,

erstmal vielen vielen Dank.

Naja verschweigen ist das falsche Wort.
Ich habe den WOL Part herausgelassen, den Part wo ich die Variablen setze und die blat.exe wo die eMails versandt werden.
Machte für mich jetzt keine Relevanz oder?

Ich habe jetzt

for /f "usebackq delims=;" %%a in (%rechner_datei%) DO @(   
set PC_Name=%%a
set User_Name=%%b
set placeholder=%%c
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> %PC_Name% - %User_Name% %date% %time% <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> %errordatei%  
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> %PC_Name% - %User_Name% %date% %time% <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> %logdatei%  
ping -n 1 %PC_Name% >> %logdatei% 2>&1
IF ERRORLEVEL == 1 (
  echo.
  ECHO !nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar!nicht pingbar! >> %errordatei%
  echo.

  
  ) ELSE (
    echo.
  ECHO [_/] Ping >> %errordatei%
  net use U: \\%PC_Name%\d /user:%nutzer% %passwort% >> %logdatei% 2>&1
IF ERRORLEVEL == 1 (
  echo.
  ECHO !Netzlaufwerk wurde nicht eingebunden!Netzlaufwerk wurde nicht eingebunden!Netzlaufwerk wurde nicht eingebunden!Netzlaufwerk wurde nicht eingebunden!Netzlaufwerk wurde nicht eingebunden! >> %errordatei%
  echo.

  
  ) ELSE (
    echo.
  ECHO [_/] Netzlaufwerk >> %errordatei%
  ROBOCOPY U:\ D:\sicherung\%PC_Name%\D /XD "System Volume Information" "$RECYCLE.BIN" /XF MEMORY.DMP /MIR /TEE /ETA /COPY:DAT /a-:hs /r:0 /w:1 /NP /NFL /NDL /NJH >> %logdatei%  
    IF ERRORLEVEL == 16 (
  echo.
  ECHO !es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert!es wurde nichts gesichert! >> %errordatei%
  echo.

  
  ) ELSE (
    echo.
  ECHO [_/] gesichert >> %errordatei%
  echo.
   
    )
  net use u: /delete /yes
  echo.
   
    )
  echo.
   
    )
	
)

Pause

Die Schleife läuft einmal durch, lässt aber die Variablen leer, die .txt sieht wie folgt aus =>
rechnername1;name1;placeholder
rechnername2;name2;placeholder
rechnername3;name3;placeholder
Member: colinardo
colinardo Apr 16, 2014 updated at 09:52:48 (UTC)
Goto Top
Dachte ich mir doch das das kommt, habe dich aber erst mal gegen die Wind fahren lassen face-wink .... Du musst beim setzen von Variablen innerhalb einer FOR-Schleife vorher die verzögerte Variablenerweiterung aktivieren
@echo off & setlocal ENABLEDELAYEDEXPANSION
und dann innerhalb deiner Schleife die Variablen mit Ausrufezeichen anstatt Prozentzeichen ansprechen
echo !deineVar!
und die Errorlevel solltest du dann ebenfalls so überprüfen !ERRORLEVEL!
Member: Xaero1982
Xaero1982 Apr 16, 2014 updated at 10:02:28 (UTC)
Goto Top
Colinardo, womit hängt das zusammen, weil ich hab das getestet wie ich es oben geschrieben habe und ich hab problemlos die Werte die in der Textdatei stehen angezeigt bekommen.

Gruß
edit: ah ok bei der Ausgabe kommt nix wenn ich zwei Zeilen einfüge. Bei einer gehts, wenn ich es außerhalb der For-Schleife ausgebe, aber dann auch nur der letzte Wert. Man lernt ja nie aus face-smile
Member: hoffi3d
hoffi3d Apr 16, 2014 at 09:58:38 (UTC)
Goto Top
;)

sehr viel besser jedoch bekomme ich jetzt noch

%b statt der zweiten "spalte" der .txt zurück!

">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *rechnername* - %b 16.04.2014 11:54:56,15 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"

bin ich noch etwas ratlos

for /f "usebackq delims=;" %%a in (%rechner_datei%) DO @(   
set PC_Name=%%a
set User_Name=%%b
set placeholder=%%c
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> !PC_Name! - !User_Name! %date% %time% <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> %errordatei%  
Member: colinardo
colinardo Apr 16, 2014 updated at 10:12:03 (UTC)
Goto Top
noch ein tokens=1-3 dazu, war mir oben entfallen, sorry:
for /f "usebackq tokens=1-3 delims=;" %%a in ("%rechner_datei%") DO @(
Member: hoffi3d
hoffi3d Apr 16, 2014 at 11:19:10 (UTC)
Goto Top
funktioniert 1a! Danke
für eine 4te Spalte müsste ich es jetzt ändern auf:
 "usebackq tokens=1,2,3,4 delims=;"  

oder?
Member: colinardo
colinardo Apr 16, 2014 updated at 11:58:20 (UTC)
Goto Top
ja, oder
tokens=1-4
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, Merci.
Die Hauptfrage ist ja beantwortet.

Grüße Uwe
Member: hoffi3d
hoffi3d Apr 16, 2014 at 15:08:08 (UTC)
Goto Top
Hallo,

alles gelöst ich danke euch beiden!
Member: bastla
bastla Apr 16, 2014, updated at Apr 17, 2014 at 16:39:43 (UTC)
Goto Top
@ colinardo
und die Errorlevel solltest du dann ebenfalls so überprüfen !ERRORLEVEL!
ist natürlich richtig - weshalb es bei hoffi3d trotzdem funktioniert liegt daran, dass der Interpreter clever genug ist, die unnötigen "==" einfach zu ignorieren und daher de facto die Abfrage
IF ERRORLEVEL 1 (
ausführt. Dass damit nicht auf "= 1", sondern auf ">= 1" geprüft wird, dürfte nicht weiter stören ...

Grüße
bastla