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-Key: 61719

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

Printed on: April 25, 2024 at 16:04 o'clock

Member: bastla
bastla Jun 19, 2007 at 08:11:37 (UTC)
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]
Member: miniversum
miniversum Jun 19, 2007 at 08:56:37 (UTC)
Goto Top
@bastla
ich glaube in die Zeile
solltest du noch ein goto:eof packen wenn das Verzeichnis nicht existieren sollte, also so:

miniversum
Member: bastla
bastla Jun 19, 2007 at 08:59:32 (UTC)
Goto Top
@miniversum

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

Grüße
bastla
Member: ChrisM73
ChrisM73 Jun 19, 2007 at 13:01:46 (UTC)
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.
Member: bastla
bastla Jun 19, 2007 at 13:35:04 (UTC)
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
Member: ChrisM73
ChrisM73 Jun 19, 2007 at 14:08:07 (UTC)
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!!!!
Member: ChrisM73
ChrisM73 Jun 19, 2007 at 14:50:28 (UTC)
Goto Top
komischerweise hat er mir jetzt doch in die Datei VerzeichnisFehlt PCs reingeschrieben in denen das Verzeichnis vorhanden ist. Woran kann dies liegen?
Member: bastla
bastla Jun 19, 2007 at 15:09:28 (UTC)
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
Member: ChrisM73
ChrisM73 Jun 19, 2007 at 15:19:33 (UTC)
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?
Member: bastla
bastla Jun 19, 2007 at 15:31:26 (UTC)
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
Member: ChrisM73
ChrisM73 Jun 20, 2007 at 06:49:28 (UTC)
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.
Member: ChrisM73
ChrisM73 Jul 02, 2007 at 07:38:46 (UTC)
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?
Member: bastla
bastla Jul 02, 2007 at 09:29:28 (UTC)
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
Member: ChrisM73
ChrisM73 Jul 03, 2007 at 07:29:55 (UTC)
Goto Top
super, hat geklappt Bastla, nochmals vielen Dank. face-wink
Hotly discussed
gleixnerdCheck of ZFW Firewallgleixnerd - 5 CommentsjstrickerWireguard VPN on UDM Pro behind Fritzbox - Handshake did not completejstricker - 3 Comments