lukyluky
Goto Top

VBS Script: Rechner Namen aus TXT mit VBS verknüpfen

Hallo zusammen,

ich hoffe Ihr könnt mir helfen.

Habe ein kleines Script geschrieben.
set wshell = CreateObject("Wscript.shell")  
Set oFSO = CreateObject ("Scripting.FileSystemObject")   
Dim fso, destfolder,sourcefolder, f
Set WshShell = CreateObject("WScript.Shell")  
Set FSO = CreateObject("Scripting.FileSystemObject")  
Sourcefolder = "\\abc\defl$\test3"  
Destfolder = "\\Rechner" & "\C$\temp"  
On Error resume next 
If (FSO.FolderExists("\\Rechner" & "\C$\test")) THEN  
msgbox "test vorhanden"  
ELSE
If (FSO.FolderExists("\\Rechner" & "\C$\test2")) THEN  
msgbox "test2 vorhanden"  
ELSE
FSO.CopyFolder Sourcefolder, Destfolder, True
WshShell.run ("\\Rechner" & " > " & File ),0,true  
 
linefeed = CHR(10)
careturn = CHR(13)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
	f.Write "\\Rechner\temp"  
	f.Close
end If
end if

Momentan wird im Script ein Rechner direkt angesprochen. Das Script soll überprüfen ob entweder der Ordner Test oder Test2 vorhanden sind. Falls beide nicht vorhanden sind soll dann vom Server \\abc der Inhalt des Ordners Test3 auf den Client kopiert werden.

Gibt es eine möglichkeit das Script so umzuschreiben das er sich die Rechner Namen aus einer TXT Datei nimmt?


Ich Danke euch schon mal für eure Hilfe.

Content-ID: 212898

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

Ausgedruckt am: 15.11.2024 um 07:11 Uhr

bastla
bastla 30.07.2013 aktualisiert um 17:01:52 Uhr
Goto Top
Hallo lukyluky!

Dein Scriptansatz hat noch Potenzial (nicht nur hinsichtlich der Formatierung als "Code" - bitte nachholen) - ungetestet eher so:
Sourcefolder = "\\abc\defl$\test3"  
Destfolder = "\C$\temp"  
Computers = "\\abc\def1$\CompList.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  

Comps = Split(fso.OpenTextFile(Computers).ReadAll, vbNewline) 'Computernamen aus Textdatei in Array einlesen  
For Each Comp In Comps
    If Trim(Comp) <> "" Then 'leere Zeilen nicht verarbeiten  
        'On Error Resume Next 'während der Testphase nicht sinnvoll, da so keine Fehlermeldungen angezeigt werden  
        If fso.FolderExists("\\" & Comp & "\C$\test") Then  
            WScript.Echo Comp & ": test vorhanden"  
        Else
            If fso.FolderExists("\\" & Comp & "\C$\test2") Then  
                WScript.Echo Comp & ": test2 vorhanden"  
            Else
                fso.CopyFolder Sourcefolder, "\\" & Comp & Destfolder, True  
            End If
        End If
    End If
Next
Annahme hinsichtlich der "CompList.txt": In jeder Zeile steht ein Computername ohne "\\" davor.

Noch als Anmerkung: Mit "WScript.Echo" anstatt "MsgBox" kannst Du das Script über "cscript" starten und musst nicht jede MessageBox wegklicken - wenn Du trotzdem über "wscript" startest, erhältst Du weiterhin mit "WScript.Echo" eine Standard-MessageBox angezeigt ...

Grüße
bastla
lukyluky
lukyluky 31.07.2013 um 07:07:22 Uhr
Goto Top
Super vielen Dank.
Die Formatierung holle ich gleich noch nach. face-smile

Einen Punkt habe ich leider vergessen.
Es müsste noch eine Ausgabe in eine Data entstehen in welcher die Information ersiehtlich sind ob bei Rechner1,2,3,4,5 einer dieser Ordner vorhanden war oder nicht.
Biber
Biber 31.07.2013 aktualisiert um 10:19:44 Uhr
Goto Top
Moin lukyluky,


Zitat von @lukyluky:
Super vielen Dank.
Die Formatierung holle ich gleich noch nach. face-smile

Einen Punkt habe ich leider vergessen.
Es müsste noch eine Ausgabe in eine Data entstehen in welcher die Information ersiehtlich sind ob bei Rechner1,2,3,4,5 einer
dieser Ordner vorhanden war oder nicht.
Befrage mal eine Suchmaschine nach dem Stichwort "Logfile".

Um es vorwegzunehmen: Bei den meisten so genannten Logfiles hat sich vor deren Entstehung jemand überlegt,
a) wo die entstehen sollen
b) was denn der Inhalt sein soll.

Hast du da schon etwas weniger abstrakte Vorstellungen?

Wir könnten naürlich in irgendeine Textdatei reinschreiben "Einer dieser Ordner war vorhanden", wie du es oben spezifiziert hast.

Grüße
Biber
[Edit] @bastla
Okay, dann lass doch mal einem Handwerker mit den paar Informationen freie Hand.
Sag zum Beispiel "Ich hätte gern meine Wohnung in anderen Farben" zu einem Maler oder zu einem Arbeitsvermittler "Ich hätte gern einen anderen Job."
[/Edit]
bastla
bastla 31.07.2013 aktualisiert um 10:34:44 Uhr
Goto Top
Hallo lukyluky!

Dann (weiterhin ungetestet) etwa so:
Sourcefolder = "\\abc\defl$\test3"  
Destfolder = "\C$\temp"  
Computers = "\\abc\def1$\CompList.txt"  
Report = "\\abc\def1$\CompVorhanden.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  

Comps = Split(fso.OpenTextFile(Computers).ReadAll, vbNewline) 'Computernamen aus Textdatei in Array einlesen  
For Each Comp In Comps
    If Trim(Comp) <> "" Then 'leere Zeilen nicht verarbeiten  
        Existing = False 'Schalter "Vorhanden" für jeden Computer zunächst rücksetzen  
        'On Error Resume Next 'während der Testphase nicht sinnvoll, da so keine Fehlermeldungen angezeigt werden  
        If fso.FolderExists("\\" & Comp & "\C$\test") Then  
            WScript.Echo Comp & ": test vorhanden"  
            Existing = True 'Schalter "Vorhanden" setzen  
        Else
            If fso.FolderExists("\\" & Comp & "\C$\test2") Then  
                WScript.Echo Comp & ": test2 vorhanden"  
                Existing = True 'Schalter "Vorhanden" setzen  
            Else
                fso.CopyFolder Sourcefolder, "\\" & Comp & Destfolder, True  
            End If
        End If
        If Existing Then Rep = Rep & vbNewline & Comp 'Wenn vorhanden, Eintragung in Liste (mit Zeilenschaltung)  
    End If
Next
'Wenn Liste "Vorhanden" nicht leer ist, in Datei schreiben (und dabei die erste Zeilenschaltung überspringen)  
If Rep <> "" Then fso.CreateTextFile(Report).Write Mid(Rep, 3)  
Grüße
bastla

[Edit] @ Biber
Es geht hier doch eher vorrangig um das Handwerkszeug (obwohl natürlich Deine Hinweise völlig berechtigt sind) ...
[/Edit]

[Edit2] @ Biber
Ist doch aber seine Wohnung (oder vermutlich eher eine Ecke im Keller face-wink) ...

... wobei ich natürlich zugebe, dass mich das Szenario "Wenn's gar keinen Ordner gibt, na dann kopieren wir eben einen." auch überrascht hat - aber gelegentlich bekomme sogar ich meine angeborene Neugier in den Griff face-wink ...
[/Edit2]
lukyluky
lukyluky 31.07.2013 um 10:57:24 Uhr
Goto Top
Hallo Bastla,

vielen Dank für dein geschriebenes Script. Es funktioniert schon fast perfekt. Leider wird nichts in die CompVerhanden.txt geschrieben.
27.'Wenn Liste "Vorhanden" nicht leer ist, in Datei schreiben (und dabei die erste Zeilenschaltung überspringen)   
Leider verstehe ich nicht was du damit meinst. Sorry.

@Biber: Ich habe meine Ausgabe Wünsch sehr oberflächlich gehalten da ich diese selbst anpassen wollte. Möchte ja auch noch etwas lernen.
Bin halt ein VBS Anfänger.
Hätte gerne eine Ausgabe die im optimalem Fall so aussieht:
Rechner1 Ordner vorhanden Datei nicht kopiert
Rechner2 Ordner nicht vorhanden Datei kopiert
Rechner3 Rechner nicht erreichbar

Es würde aber auch reichen wenn nur ein Punkt drin stehen würde:
Rechner1 Ordner nicht vorhanden oder Datei nicht kopiert

Wichtig wäre nur das ich im nachhinein ersehen kann bei welchen Rechnern die Ordnern nicht vorhanden sind oder die Dateien nicht kopiert wurden.
bastla
bastla 31.07.2013 aktualisiert um 16:45:25 Uhr
Goto Top
Hallo lukyluky!

Versuch es damit (ungetestet):
SourceFolder = "\\abc\defl$\test3"  
DestFolder = "temp"  
Computers = "\\abc\def1$\CompList.txt"  
Report = "\\abc\def1$\CompVorhanden.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  

Comps = Split(fso.OpenTextFile(Computers).ReadAll, vbNewline) 'Computernamen aus Textdatei in Array einlesen  
For Each Comp In Comps
    If Trim(Comp) <> "" Then 'leere Zeilen nicht verarbeiten  
        Existing = False 'Schalter "Vorhanden" rücksetzen  
        Rep = Rep & vbNewline & Comp 'Ausgabezeile für Computer erzeugen  
        DestDrive = "\\" & Comp & "\C$\" 'Zielpfad festlegen ("\\Server\Share" ist für VBS ein "Drive")  
        If fso.DriveExists(DestDrive) Then 'Ziel erreichbar?  
            If fso.FolderExists(DestDrive & "test") Then   
                WScript.Echo Comp & ": test vorhanden"  
                Existing = True 'Schalter "Vorhanden" setzen  
                Rep = Rep & ";test vorhanden" 'Hinweis in Ausgabezeile schreiben  
            End If
            If fso.FolderExists(DestDrive & "test2") Then  
                WScript.Echo Comp & ": test2 vorhanden"  
                Existing = True 'Schalter "Vorhanden" setzen  
                Rep = Rep & ";test2 vorhanden" 'Hinweis in Ausgabezeile schreiben  
            End If
            If Not Existing Then
                fso.CopyFolder SourceFolder, DestDrive & DestFolder, True
                Rep = Rep & ";kopiert" 'Hinweis in Ausgabezeile schreiben  
            End If
        Else 'Ziel nicht gefunden  
            Rep = Rep & ";nicht erreicht" 'Hinweis in Ausgabezeile schreiben  
        End If
    End If
Next
fso.CreateTextFile(Report).Write Mid(Rep, 3) 'gesamte Ausgabe schreiben  
Grüße
bastla
lukyluky
lukyluky 01.08.2013 um 16:26:17 Uhr
Goto Top
Hallo Bastla,

das Script funktioniert super!!
Vielen Dank

Habe versucht das Script alleine etwas zu erweitern, aber ohne eure Hilfe kriege ich das leider nicht hin.
Hintergrund meines Scripts:
Wenn Test oder Test2 nicht vorhanden sind wird eine Installationsdatei in den Ordner c:\Temp kopiert und diese sollte im Anschluss ausgeführt werden.

Habe meine Erweiterung zwischen deinen Code geschoben.

Bekomme immer die Meldung das er die Installationsdatei nicht finden kann.

If Not Existing Then 
fso.CopyFolder SourceFolder, DestDrive & DestFolder, True 
Rep = Rep & ";kopiert" 'Hinweis in Ausgabezeile schreiben   
End If 
Else 'Ziel nicht gefunden   
Rep = Rep & ";nicht erreicht" 'Hinweis in Ausgabezeile schreiben   
End If 
End If 

Next
'Script erweiterung  
set wshell = CreateObject("Wscript.shell")  
filespec = "\\" & Comp & "\c$\temp\1.exe"  
WScript.Echo ReportFileStatus(filespec)

Function ReportFileStatus(filespec)
 
Dim fso, msg
 Set fso = CreateObject("Scripting.FileSystemObject")  
 If (fso.FileExists(filespec)) Then
 wshell.run "c:\temp\psexec \\ & Comp c:\temp\1.exe"  
 Else
WScript.Echo Comp & ": doesn't exist"    

 End If
 ReportFileStatus = WScript.Echo
 End Function
' Script erweiterung ende  

fso.CreateTextFile(Report).Write Mid(Rep, 3) 'gesamte Ausgabe schreiben  

Ich hoffe das Ihr mir hierbei auch helfen könnt.

Danke
Biber
Biber 01.08.2013 um 17:25:22 Uhr
Goto Top
Moin lukyluky,

ich will bastla da nicht vorgreifen, aber siehst du einen Unterschied zwischen Zeile 13 und Zeile 21?
In beiden Zeilen werden die vier Buchstaben "Comp" verwendet.
Einmal ist damit eine Variable gemeint, einmal ein beliebiger Test.

Grüße
Biber
bastla
bastla 01.08.2013 aktualisiert um 22:26:13 Uhr
Goto Top
Hallo lukyluky!

Wie schon von Biber angesprochen kann Deine Zeile 21 so nicht funktionieren - versuch es damit:
'Script erweiterung  
Set WShell = CreateObject("WScript.Shell")  
filespec = "\\" & Comp & "\c$\temp\1.exe"  
If fso.FileExists(filespec) Then
    WShell.Run "c:\temp\psexec \\" & Comp & " c:\temp\1.exe"  
Else
    WScript.Echo Comp & ": doesn't exist"    
End If
' Script erweiterung ende  
Die Option "-c" von "psexec" könnte vielleicht hilfreich sein, und vermutlich wirst du auch noch jeweils eine Ausgabezeile für die Log-Datei ergänzen wollen ...

Grüße
bastla