chrism73
Goto Top

Dateien im Netzwerk per Skript kopieren

Hallo ich soll in userem Netzwerk bei ca. 200 Clients überprüfen ob es unter c:\Programme ein bestimmtes Verzeichnis gibt, und in c:\windows eine Datei kopieren von der es unter Umständen schon eine solche gibt.

die hostnamen der Clients liegen als Txtfile vor:

pc1
server2
blabla
...

ich würde also gern ein Skript haben das folgendes macht:

- zuerst sich mit den Clients auf c$ aus der Liste verbindet, Administrator login sollte in der Batchdatei mitgegeben werden
- überprüft ob das Verzeichnis xxx in c:\Programme existiert. Wenn nicht den hostnamen in eine txt-datei schreibt.
-die datei blabla in das Verzeichnis c:\windows kopiert. Falls diese schon vorhanden ist sie trotzdem überschreibt.
- die Netzlaufwerke wieder trennt.

Wer kann mir helfen?

Content-ID: 61719

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

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

bastla
bastla 19.06.2007 um 10:11:37 Uhr
Goto Top
Hallo ChrisM73!

Schematisch (aber ungetestet) sollte es etwa so gehen (wobei ich keinen Grund für ein Mapping von C$ sehe und daher darauf verzichte):
@echo off & setlocal
set "V=Verzeichnisname"  
set "D=blabla.ext"  
set "Hostnames=hostnames.txt"  
::Logfiles
set "Offline=Offline.txt"  
set "NoDir=VerzeichnisFehlt.txt"  
set "NoCopy=NichtKopiert.txt"  
if exist "%Offline%" del "%Offline%"  
if exist "%NoDir%" del "%NoDir%"  
if exist "%NoCopy%" del "%NoCopy%"  
for /f "usebackq eol=; delims=" %%i in ("%Hostnames%") do call :ProcessHost "%%i"  
goto :eof
:ProcessHost
ping %~1 >nul || (echo %~1>>"%Offline%" & goto :eof)  
echo %~1
dir /ad "\\%~1\c$\Programme\%V%\" >nul 2>nul || echo %~1>>"%NoDir%"  
if exist "\\%~1\c$\Windows\" copy /y "%D%" "\\%~1\c$\Windows\" >nul 2>nul || echo %~1>>"%NoCopy%"  
if exist "\\%~1\c$\WINNT\" copy /y "%D%" "\\%~1\c$\WINNT\" >nul 2>nul || echo %~1>>"%NoCopy%"  
Da Du nicht erwähntest, dass die Batch-Datei unter W2000 laufen solle, habe ich mich beim Auswerten des "ping" auf den Errorlevel beschränkt.

Grüße
bastla

[Edit] Rechnernamen in %Hostnames% können per ";" auskommentiert werden; bei Bedarf wird in das Verzeichnis "WINNT" kopiert - siehe dazu auch unten [/Edit]
miniversum
miniversum 19.06.2007 um 10:56:37 Uhr
Goto Top
@bastla
ich glaube in die Zeile
solltest du noch ein goto:eof packen wenn das Verzeichnis nicht existieren sollte, also so:

miniversum
bastla
bastla 19.06.2007 um 10:59:32 Uhr
Goto Top
@miniversum

Hatte ich aus der Anforderung nicht herausgelesen, aber jetzt hat ChrisM73 ja beide Varianten zur Verfügung ...

Grüße
bastla
ChrisM73
ChrisM73 19.06.2007 um 15:01:46 Uhr
Goto Top
Hallo, sorry bin erst jetzt dazu gekommen es zu testen, wobei ich die Zeile von Miniversum eingefügt habe. Erst mal vielen Dank für eure schnelle Hilfe.
leider hat es aber nicht funktioniert...habd die Batchdatei, die liste mit den PCs und die Datei wo kopiert werden sollte in ein Verzeichnis kopiert. Nach ausführen der batch waren auch nur diese 3 Dateien darin.
Vielleicht habe ich ja auch was falsch verstanden.
Verzeichnisname ist also der Name des zu überprüfenden Programms.
blabla.ext ist der Name der zu kopierenden Datei?
hostnames.txt ist die Datei mit den PC-Namen?

Es können übrigens Win 200 Clients und XP Clients sein. In der Liste stehen jedoch auch Server, bei denen aber nix gemacht werden muss.
bastla
bastla 19.06.2007 um 15:35:04 Uhr
Goto Top
Hallo ChrisM73!

Nach ausführen der batch waren auch nur diese 3 Dateien darin.
... was an sich ein gutes Zeichen wäre, da diese Dateien nur für das Protokollieren von Fehlern gedacht sind:
  • In "Offline.txt" sollen die Namen jener Rechner, die per "ping" nicht erreichbar waren, geschrieben werden.
  • In "VerzeichnisFehlt.txt" erfolgt immer dann der Eintrag eines Rechnernamens, wenn das in Zeile 2 der Batchdatei festgelegte Verzeichnis nicht unter "C:\Programme" gefunden wurde, und
  • in "NichtKopiert.txt" werden fehlgeschlagene Kopierversuche der in der 3. Batchzeile festgelegten Datei durch Eintragung des Rechnernamens protokolliert.

hostnames.txt ist die Datei mit den PC-Namen?
Genau. Es werden alle Zeilen dieser Datei bearbeitet; wenn Du also ev enthaltene Server ausschließen willst, müssten diese entweder aus der Liste entfernt werden oder könnten zB mit ";" am Beginn der Zeile gekennzeichnet werden - eine entsprechende Änderung der "for"-Zeile nehme ich gleich oben im Code vor.
Der Hinweis auf W2000 bezog sich nur auf jenen Rechner, auf dem die Batchdatei gestartet wird - hinsichtlich des "ping" ist das Betriebssystem der Zielrechner nicht relevant; was allerdings das Kopieren in das "Windows"-Verzeichnis anlangt, müsste unterschieden werden, ob ev nach "WINNT" zu kopieren ist (trage ich ebenfalls gleich oben nach) ...
Zu Testzwecken kannst Du übrigens das "echo off" in der ersten Zeile in ein "echo on" ändern - dann kannst Du den Ablauf der Batchdatei besser verfolgen und den (vermuteten) Fehlern besser auf die Spur kommen.

Grüße
bastla
ChrisM73
ChrisM73 19.06.2007 um 16:08:07 Uhr
Goto Top
Vielen Dank, du bist Super, es kalppt...du hast mir viel Arbeit erspart...
er hört zwar immer wieder auf, aber dann lösche ich die bereits geprüften Clients aus der Liste, und er macht weiter.

Vielen Dank Bastla du bist der Checker!!!!
ChrisM73
ChrisM73 19.06.2007 um 16:50:28 Uhr
Goto Top
komischerweise hat er mir jetzt doch in die Datei VerzeichnisFehlt PCs reingeschrieben in denen das Verzeichnis vorhanden ist. Woran kann dies liegen?
bastla
bastla 19.06.2007 um 17:09:28 Uhr
Goto Top
Hallo ChrisM73!

Wie sieht denn das Ergebnis aus, wenn Du von der Kommandozeile für einen der betroffenen Rechner eine Eingabe der Art
dir /ad "\\Rechnername\C$\Programme\Verzeichnisname"  
machst?

Zum Testen könntest Du übrigens den Programmteil unter ":ProcessHost" auf diese Zeile
dir /b /ad "\\%~1\c$\Programme\%V%\" || echo %V% auf Rechner %~1 nicht vorhanden.  
reduzieren und, wie schon erwähnt, zusätzlich das "echo" in der ersten Zeile einschalten. Damit erhältst Du alle Ausgaben auf den Bildschirm (auch die gefundenen Unterordner von "C:\Programme\Verzeichnisname" des jeweiligen Rechners in etwas übersichtlicherer Art). Die "... nicht vorhanden."-Meldung dürfte nur nach einem "Das System kann die angegebene Datei nicht finden." bzw "Datei nicht gefunden" aufscheinen.

Grüße
bastla
ChrisM73
ChrisM73 19.06.2007 um 17:19:33 Uhr
Goto Top
auf den PCs scheint die administrative Freigabe zu deaktiviert sein, wenn ich dir /ad "\\Rechnername\C$\Programme\Verzeichnisname" eingebe sagt er mir bei den betroffenen PCs Zugriff verweigert. Kann ich dies evtl. durch Eingabe des Administratorkennworts umgehen?
bastla
bastla 19.06.2007 um 17:31:26 Uhr
Goto Top
Hallo ChrisM73!

Kann ich dies evtl. durch Eingabe des Administratorkennworts umgehen?
Wenn die administrative Freigabe deaktiviert ist, wird Dir auch ein Administratorkennwort nicht nützen - abgesehen davon, dass ich eine derartige Aktion ohnehin nur vom Domänen-Admin-Account aus starten würde, was die Eingabe des Passworts unnötig macht (machen sollte).

Außerdem würdest Du damit nur Symptome, aber nicht die Krankheit behandeln - schau lieber auf den entsprechenden Rechnern nach, was da los ist ...

Grüße
bastla
ChrisM73
ChrisM73 20.06.2007 um 08:49:28 Uhr
Goto Top
oh mann, klar hab ich ganz vergessen, ich bin auf einigen PCs lokaler Admin, deswegen hat es bei denen funktioniert, kaumm macht mans als Domänen Admin schon gehts...bitte sags niemand weiter.

Danke für deine Hilfe.
ChrisM73
ChrisM73 02.07.2007 um 09:38:46 Uhr
Goto Top
Hallo inzwischen habe ich festgestellt, das die Liste mit den Hostnamen unvollständig war, da an einigen Clients der Windows Firewalldienst gestartet war. Gibt es eine möglichkeit dem Skript einfach einen IP-Adressraum zur Verarbeitung zu geben?
bastla
bastla 02.07.2007 um 11:29:28 Uhr
Goto Top
Hallo ChrisM73!

Du könntest die Zeile
<i>for /f "usebackq eol=; delims=" %%i in ("%Hostnames%") do call :ProcessHost "%%i"</i>  
ersetzen durch etwas in der Art:
for /l %%i in (10,1,99) do call :ProcessHost 192.168.0.%%i
%%i nimmt dabei alle Werte von 10 bis 99 (in 1er-Schritten) an.

Grüße
bastla
ChrisM73
ChrisM73 03.07.2007 um 09:29:55 Uhr
Goto Top
super, hat geklappt Bastla, nochmals vielen Dank. face-wink
Mehr von ChrisM73ChrisM73IPv6 Gruppenrichtlinie Server 2003ChrisM73 - 4 KommentareChrisM73Automatisiert 2 Zeichen von Dateinamen löschenChrisM73 - 4 KommentareChrisM73Dateien nach Monaten in Ordner verschiebenChrisM73 - 20 KommentareChrisM73Archivierung in Outlook 2010ChrisM73 - 2 Kommentare
Heiß diskutiert
superfun2k24Sophos SFOS 20 DNAT funktioniert nichtsuperfun2k24 - 26 Kommentareuser217Kaufberatung Hardware - Hyper-V Cluster 3 Nodesuser217 - 25 KommentarePharaunIntel-E810 QSFP28 to Mikrotik QSPF+ mit 40Gbit VerbindungPharaun - 24 Kommentareprplemk2Testumgebung bauen (Grundlegend)prplemk2 - 19 KommentareaufdemmarsHP Z620 USB hat kein Strom beim Startenaufdemmars - 17 KommentareTJ.Hooker74Dom.Admin-Passwort ändern - Auswirkungen auf EX, HCW, AADCTJ.Hooker74 - 15 KommentaremaisenkaiserSwitch ohne STP ins Netzwerkmaisenkaiser - 13 KommentareUnluckyProccess1999Creo 4.0 Lizenz Server (LMTOOLS)UnluckyProccess1999 - 13 KommentareJudgelgZertifikate in die Exchange Online GAL hochladenJudgelg - 13 KommentareadmtechEntwicklertagebuch: Release 6.4 - Filteradmtech - 13 KommentareleberkaeseFB7590 ISDN Fax-Funktionleberkaese - 12 KommentareHemingwayWord Makro soll aktuelle Datei regelmäßig kopieren und speichernHemingway - 11 Kommentare