Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Dateien im Netzwerk per Skript kopieren

Frage Entwicklung Batch & Shell

Mitglied: ChrisM73

ChrisM73 (Level 1) - Jetzt verbinden

19.06.2007, aktualisiert 03.07.2007, 4391 Aufrufe, 14 Kommentare

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?
Mitglied: bastla
19.06.2007 um 10:11 Uhr
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):
01.
@echo off & setlocal 
02.
set "V=Verzeichnisname" 
03.
set "D=blabla.ext" 
04.
set "Hostnames=hostnames.txt" 
05.
::Logfiles 
06.
set "Offline=Offline.txt" 
07.
set "NoDir=VerzeichnisFehlt.txt" 
08.
set "NoCopy=NichtKopiert.txt" 
09.
if exist "%Offline%" del "%Offline%" 
10.
if exist "%NoDir%" del "%NoDir%" 
11.
if exist "%NoCopy%" del "%NoCopy%" 
12.
for /f "usebackq eol=; delims=" %%i in ("%Hostnames%") do call :ProcessHost "%%i" 
13.
goto :eof 
14.
:ProcessHost 
15.
ping %~1 >nul || (echo %~1>>"%Offline%" & goto :eof) 
16.
echo %~1 
17.
dir /ad "\\%~1\c$\Programme\%V%\" >nul 2>nul || echo %~1>>"%NoDir%" 
18.
if exist "\\%~1\c$\Windows\" copy /y "%D%" "\\%~1\c$\Windows\" >nul 2>nul || echo %~1>>"%NoCopy%" 
19.
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]
Bitte warten ..
Mitglied: miniversum
19.06.2007 um 10:56 Uhr
@bastla
ich glaube in die Zeile
dir /ad "\\%~1\c$\Programme\%V%\" >nul 2>nul || echo %~1>>"%NoDir%"
solltest du noch ein goto:eof packen wenn das Verzeichnis nicht existieren sollte, also so:
dir /ad "\\%~1\c$\Programme\%V%\" >nul 2>nul || (echo %~1>>"%NoDir%" & goto:eof)

miniversum
Bitte warten ..
Mitglied: bastla
19.06.2007 um 10:59 Uhr
@miniversum

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

Grüße
bastla
Bitte warten ..
Mitglied: ChrisM73
19.06.2007 um 15:01 Uhr
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.
Bitte warten ..
Mitglied: bastla
19.06.2007 um 15:35 Uhr
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
Bitte warten ..
Mitglied: ChrisM73
19.06.2007 um 16:08 Uhr
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!!!!
Bitte warten ..
Mitglied: ChrisM73
19.06.2007 um 16:50 Uhr
komischerweise hat er mir jetzt doch in die Datei VerzeichnisFehlt PCs reingeschrieben in denen das Verzeichnis vorhanden ist. Woran kann dies liegen?
Bitte warten ..
Mitglied: bastla
19.06.2007 um 17:09 Uhr
Hallo ChrisM73!

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

Zum Testen könntest Du übrigens den Programmteil unter ":ProcessHost" auf diese Zeile
01.
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
Bitte warten ..
Mitglied: ChrisM73
19.06.2007 um 17:19 Uhr
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?
Bitte warten ..
Mitglied: bastla
19.06.2007 um 17:31 Uhr
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
Bitte warten ..
Mitglied: ChrisM73
20.06.2007 um 08:49 Uhr
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.
Bitte warten ..
Mitglied: ChrisM73
02.07.2007 um 09:38 Uhr
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?
Bitte warten ..
Mitglied: bastla
02.07.2007 um 11:29 Uhr
Hallo ChrisM73!

Du könntest die Zeile
01.
<i>for /f "usebackq eol=; delims=" %%i in ("%Hostnames%") do call :ProcessHost "%%i"</i>
ersetzen durch etwas in der Art:
01.
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
Bitte warten ..
Mitglied: ChrisM73
03.07.2007 um 09:29 Uhr
super, hat geklappt Bastla, nochmals vielen Dank.
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Batch & Shell
Dateien trotz Verwendung kopieren (2)

Frage von 112Timo zum Thema Batch & Shell ...

Batch & Shell
gelöst Ordner anhand von Dateinamen erstellen und Dateien in Ordner kopieren (3)

Frage von getmoving zum Thema Batch & Shell ...

Batch & Shell
gelöst PowerShell Ordnergröße Skript ignoriert versteckte Dateien (3)

Frage von Giffas zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...