vbsnoobdlu
Goto Top

TXT zeilenweise per VBS auslesen

So Servus ich habe folgende txt Datei

Systeme.txt

in dieser Datei stehen PC-Namen drinne ...

PC1
PC2
PC3

nun sollen die Namen per VB-Script ausgelesen werden und in Variablen gespeichert werden, die aller dings auch dynamisch angelegt werden sollen, dass heißt sind in der txt 10 Namen 10 Variablen anlegen und soweiter...

habe noch kein Code würde mich aber freuen wenn mir das jemand schreiben könnte face-smile

Mit freundlichem Gruß
Daniel


und Danke schonmal

Content-ID: 65403

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

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

AndreasHoster
AndreasHoster 03.08.2007 um 14:25:16 Uhr
Goto Top
Nö, kann niemand, weil Variablen dynamisch anlegen geht nicht. Macht auch keinen Sinn, weil wie willst Du danach Programmiertechnisch drauf zugreifen, wenn man den Namen nicht kennt?
Schon mal was von einem Array oder Variablenfeld gehört?
Ein Array ist ein Konstrukt, welches man unter einem Namen ansprechen kann und mittels Index mehrere Werte reinschreiben kann und wieder auslesen. Sozusagen Strassenname mit Hausnummern der verschiedenen Lager.

Set fso = CreateObject("Scripting.FileSystemObject")
Set oFile = fso.OpenTextFile("C:\Systeme.txt")
i=0
' Erstmal zählen wieviele Einträge
while not oFile.AtEndOfStream
i=i+1
oFile.ReadLine
Wend
oFile.Close
' Array definieren
REDIM sEingabe(i)
Set oFile = fso.OpenTextFile("C:\Systeme.txt")
i=0
' Jetzt Werte ins Array übernehmen
while not oFile.AtEndOfStream
sEingabe(i)=oFile.ReadLine
i=i+1
Wend
oFile.Close
' Beispiel für Zugriff
MsgBox "Wert an Index 0: " & sEingabe(0)
MsgBox "Wert an Index 3: " & sEingabe(3)

Kein schönes Beispiel, tut aber und in VB-Script würde ich auch eher ein Dictionary Objekt verwenden (Arrays gibts halt in praktisch jeder Sprache):

Set fso = CreateObject("Scripting.FileSystemObject")
Set oDict = CreateObject("Scripting.Dictionary")
Set oFile = fso.OpenTextFile("C:\Systeme.txt")
'Direktes Einlesen, Dictionary Objekt darf nämlich beliebig wachsen
i=0
while not oFile.AtEndOfStream
oDict.add i,oFile.ReadLine
i=i+1
Wend
oFile.Close
' Beispiel für Zugriff
MsgBox "Wert an Index 0: " & oDict.Item(0)
MsgBox "Wert an Index 3: " & oDict.Item(3)


EDIT: Wenn ich die Code-Beispiel mit < code > versuche zu formatieren, sieht man nichts mehr von meinem Text. Deswegen ohne Code Formatierung.
bastla
bastla 05.08.2007 um 17:50:42 Uhr
Goto Top
Hallo VBSnoobDlu und AndreasHoster!

Auch ich würde als "dynamische" Variable nur ein Array für sinnvoll halten, und dann (ewas knapper formuliert) zB so vorgehen (um gleich das obige Beispiel zu übernehmen):
Const sInFile = "C:\Systeme.txt"  
aEingabe = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(sInFile, 1).ReadAll, vbCrLF)  
MsgBox "Wert an Index 0: " & aEingabe(0)  
MsgBox "Wert an Index 2: " & aEingabe(2)  

Grüße
bastla
VBSnoobDlu
VBSnoobDlu 06.08.2007 um 06:45:25 Uhr
Goto Top
Danke für eure antworten hat mir sehr weiter geholfen face-smile
habe mich für ein 2 D array entschieden da ich da noch ein paar mehr möglichkeiten habe die ich gebrauchen kann face-smile

Nur wie lege ich es in VBS an ???
kann mir das noch jemand sagen ???
in java weiß ich es nur in VBS net ...
VBSnoobDlu
VBSnoobDlu 06.08.2007 um 07:30:33 Uhr
Goto Top
Ok ich muss die Frage nochmal umstellen :P

Also meine TextDatei sieht wie folgt aus...

PC-Name
c;d;e
Zielpfad

PC-Name2
c;d
Zielpfad2

Nun soll er die Daten auslesen und in einem 2D-Array abspeichern ....
PC-Name c d e Zielpfad
PC-Name2 c d Zielpfad2


Wie bekomme ich das hin ???
habe keine Ahnung wie ich in VBS eine TXT einlese und Zeilen nach einem Zeichen Trenne ...
desweiteren ein 2 D Array öffnen.
AndreasHoster
AndreasHoster 06.08.2007 um 08:30:19 Uhr
Goto Top
@bastla:
An Split hatte ich gar nicht gedacht, guter Hinweis.
AndreasHoster
AndreasHoster 06.08.2007 um 09:07:39 Uhr
Goto Top
Na ja, TXT einlesen sollte man anhand der Beispiele ja schon machen können.
Wenn man sich das Skript von Bastla anschaut, kriegt man das Trennen nach Zeichen: Split
Split(Text,Trennzeichen) gibt ein Array zurück mit entsprechend vielen Elementen je nach Trennzeichen.
Also Split("C;D;E",";") ergibt ein Array mit a(0)="C", a(1)="D" und a(2)="E"
Ein mehrdimensionaler Array geht praktisch wie ein eindimensionaler, nur hat man mehrere Indizes:
REDIM a(10,10,10) wäre ein 3D Array. Es sollten bis 60 Dimensionen gehen, habe das aber noch nicht ausprobiert.

Und insgesamt solltest Du Dir ein paar Gedanken über Deine Datenstruktur machen.
Ein 2D Array mit sagen wir 10x5 Elementen ist bei:
Name1_c_d_e_Pfad
Name2_c_d___Pfad
ungeeignet, weil es wohl verschiedene Anzahl von c,d,e ... gibt und irgendwann kommt f und dann reichen 5 nicht. Und vorsorglich mal 1000 reservieren ist auch kein schöner Programmierstil und auch nicht ressourcenschonend.
VBSnoobDlu
VBSnoobDlu 06.08.2007 um 09:33:41 Uhr
Goto Top
So ich danke euch noch einmal face-smile
und habe nur noch eine frage ...
gibt es in VBS einen Sprung befehl sowie in VB ?
bastla
bastla 06.08.2007 um 10:01:51 Uhr
Goto Top
Hallo VBSnoobDlu!

gibt es in VBS einen Sprung befehl sowie in VB ?
Was es alles in VBS gibt, findest Du zB in der Doku scd56.chm oder scd56de.chm (Download siehe etwa http://dieseyer.de/dse-downloads.html) ...

Ansonsten: Was verstehst Du konkret unter "Sprung" und wozu würdest Du ihn brauchen?
Zum Einlesen der Textdatei mit Datensätzen über 3 (oder, falls die in Deinem Beispiel dargestellte Leerzeile auch in der Datei steht, 4) Zeilen mit zum Teil unterschiedlicher Feldanzahl könntest Du auf Basis der "Dictionary"-Variante von AndreasHoster etwa so vorgehen:
Set fso = CreateObject("Scripting.FileSystemObject")  
Set oDict = CreateObject("Scripting.Dictionary")  
Set oFile = fso.OpenTextFile("Z:\Systeme.txt")  

i = 0
iMaxField = 0
Do While Not oFile.AtEndOfStream
	sLine1 = oFile.ReadLine 'PC-Name  
	sLine2 = oFile.ReadLine 'c;d;e  
	sLine3 = oFile.ReadLine 'Zielpfad  
	sLine4 = oFile.ReadLine 'Leerzeile  
	oDict.Add i, sLine1 & ";" & sLine3 & ";" & sLine2  
	aTemp = Split(sLine2, ";")  
	If UBound(aTemp) > iMaxField Then iMaxField = UBound(aTemp)
	i = i + 1
Loop
oFile.Close

iMaxRec = i 'Höchster Datensatzindex  
iMaxField = iMaxField + 2 'Höchster Feldindex (zusätzlich zu iMaxField aufgrund "c;d;e" Felder für PC-Name und Zielpfad)  
ReDim aSysteme(iMaxRec, iMaxField)
For i = 0 To iMaxRec
	aTemp = Split(oDict.Item(i), ";")  
	For j = 0 To UBound(aTemp)
		aSysteme(i, j) = aTemp(j)
	Next
Next
'Dictionary löschen  
Set oDict = Nothing

'Beispiel für Zugriff  
MsgBox "Wert 'e' aus Satz 0: " & aSysteme(0, 4)  
MsgBox "Wert 'e' aus Satz 1: " & aSysteme(1, 4)  
Ablauf:
Zunächst werden alle (4, da Leerzeile berücksichtigt) zu einem Satz gehörigen Zeilen eingelesen und in umgestellter Reihenfolge (PC-Name; Zielpfad; c; d; e; f; ...) durch ";" getrennt als zusammengehöriger Eintrag in einem Dictionary-Element gespeichert. Dabei wird auch die benötigte Feldanzahl für (c; d; ...) ermittelt.

Im zweiten Schritt kann ein passendes Array deklariert und aus den einzelnen Dictionary-Einträgen befüllt werden, wobei zunächst aus jedem Datensatz über Split() ein temporäres (eindimensionales) Array erstellt wird, dessen Elemente dann in das Ergebnis-Array übertragen werden können.

Hat in einem Datensatz ein Feld keinen Inhalt (zB fehlendes "e" beim Satz für "PC-Name2"), bleibt das Array-Feld (siehe zweite MsgBox-Ausgabe) leer.

Grüße
bastla
VBSnoobDlu
VBSnoobDlu 06.08.2007 um 10:04:47 Uhr
Goto Top
Danke ... :P

ich verstehe und einem Sprung befehl folgendes ....
wenn eine bestimmte bedingung eintritt gehe zu folgendem Punkt...

unter VBA gibt es GoTo methode
unter Assembler LJMP

unter Java und c gibt es keinen,
wie sieht es in VBS aus
bastla
bastla 06.08.2007 um 10:12:07 Uhr
Goto Top
Hallo VBSnoobDlu!

Da Du ewähntest, in java zu programmieren, war ich etwas verwundert - daher die Nachfrage wegen des Sprunges ...

"GoTo" gibt es in VBS eigentlich nur in Zusammenhang mit dem Errorhandling (On Error GoTo 0), es stehen Dir aber Kontrollstrukturen wie "If-Then-Else(If)-End If" oder "Select Case" zur Verfügung.

Grüße
bastla
VBSnoobDlu
VBSnoobDlu 06.08.2007 um 14:23:01 Uhr
Goto Top
gibt es ne möglich keit abzufragen ob ein System online ist ???

also das script für ne Datensicherung durch und wenn das System nicht da ist quasi abgeschaltet ist soll er mir was in eine log schreiben ....
das ist alles soweit fertig nur weiss nicht wie ich überprüfe ob ein System online ist ...
kann mir da nochmal wer helfen

nochmal danke im vorraus
bastla
bastla 06.08.2007 um 14:31:56 Uhr
Goto Top
Hallo VBSnoobDlu!

Mittlerweile sind wir schon ziemlich OT, daher beim nächsten Mal bitte einen neuen Beitrag ...
Du könntest den Zielrechner einfach anpingen, etwa wie hier gezeigt: http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept04/he ...

Anstelle der IP-Adresse kannst Du auch den Computernamen einsetzen.

Grüße
bastla
VBSnoobDlu
VBSnoobDlu 06.08.2007 um 15:43:30 Uhr
Goto Top
Danke für den link allerdings bekomme ich es net hin ....
habe es ein wenig umgeschrieben auch nicht die erste XP Version sondern die beiden andern ...
und trotzdem bekomme ich keine connectivität ....

kann mir das mal jemand erläutern ?
bastla
bastla 06.08.2007 um 15:50:06 Uhr
Goto Top
Hallo VBSnoobDlu!

Das wäre jetzt wirklich der Moment, einen neuen Beitrag mit einem Thema wie "Ping mit VBScript" zu eröffnen und dort Dein Script reinzustellen ...

Grüße
bastla
VBSnoobDlu
VBSnoobDlu 29.11.2007 um 09:04:06 Uhr
Goto Top
Hat auch ohne weitere Probleme Funktioniert,
ich danke allen hilfsbereiten.

Gruß