albertminrich
Goto Top

Aus einer vbs eine zweite vbs starten und ein Array übergeben?

Hallo,

vbsdatei1.vbs hat diesen Inhalt
set wshshell = CreateObject("WScript.Shell")  
redim testarr(2)
testarr(0) = "eins"  
wshshell.run "vbsdatei2.vbs " & testarr  

vbsdatei2.vbs hat diesen Inhalt
wscript.echo ubound(wscript.arguments(0))

Führt man vbsdatei1.vbs aus, kommt als Fehler in Zeile 4 "Typen unverträglich"

Ich kann aber z.B. eine Variable übergeben, also:
set wshshell = CreateObject("WScript.Shell")  
myvari = "eins"  
wshshell.run "vbsdatei2.vbs " & myvari  

oder ein Array an eine Sub übergeben:
set wshshell = CreateObject("WScript.Shell")  
redim testarr(2)
testarr(0) = "eins"  
mysub testarr

sub mysub(uebergebenesarray)
   wscript.echo ubound(uebergebenesarray)
end sub



Wie übergibt man ein Array an eine neue vbs-Datei?

Danke
Martin

Content-Key: 170417

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

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

Member: AndreasHoster
AndreasHoster Jul 26, 2011 at 09:09:51 (UTC)
Goto Top
Gar nicht.
Was Du machst ist die zweite VBS über die Kommandozeile aufzurufen. Die Kommandozeile erlaubt nur Text als Übergabeparameter.
Du kannst nicht einfach interne Objekte über die Kommandozeile weitergeben.
Member: AlbertMinrich
AlbertMinrich Jul 26, 2011 at 10:08:25 (UTC)
Goto Top
Zitat von @AndreasHoster:
Gar nicht.
Was Du machst ist die zweite VBS über die Kommandozeile aufzurufen. Die Kommandozeile erlaubt nur Text als
Übergabeparameter.
Du kannst nicht einfach interne Objekte über die Kommandozeile weitergeben.


Aber wenn ich eine Variable übergebe, also diese Variante:
set wshshell = CreateObject("WScript.Shell")  
myvari = "eins"  
wshshell.run "vbsdatei2.vbs " & myvari  

dann kann ich in der vbsdatei2.vbs mit dem Inhalt der Variablen myvari weiterarbeiten.

Sorry, jetzt versteh ich. Der Inhalt der Variablen wird einfach als Text übergeben.
Ich müsste also das ganze Array in eine Variable schreiben und in der zweiten Datei wieder auseinanderpfriemeln.

Danke und Gruß
Martin
Member: TsukiSan
TsukiSan Jul 26, 2011 at 12:08:58 (UTC)
Goto Top
Ich müsste also das ganze Array in eine Variable schreiben und in der zweiten Datei wieder auseinanderpfriemeln.
durch JOIN zum Beispiel:
UebergabeVariable = Join(testarr, ";" )  
dann müßte deine 2te VBS das Argument NULL nur wieder "zerlegen" in ein Array mittels Split

das wäre eine Möglichkeit.

Gruss
Tsuki
Member: AndreasHoster
AndreasHoster Jul 26, 2011 at 12:30:08 (UTC)
Goto Top
Aber Vorsicht:
Die Kommandozeile mag keine Leerzeichen, bestimmte Sonderzeichen z.B. & machen auch Probleme.
Außerdem sollte das Trennzeichen nicht im Array vorkommen. Und die Kommandozeile hat eine bestimmte Begrenzung, wie lange die gesamte Kommandozeile werden darf.

Was spricht eigentlich gegen ein einziges Programm?
Member: AlbertMinrich
AlbertMinrich Jul 26, 2011 at 14:58:32 (UTC)
Goto Top
Zitat von @AndreasHoster:
Aber Vorsicht:
Die Kommandozeile mag keine Leerzeichen, bestimmte Sonderzeichen z.B. & machen auch Probleme.
Außerdem sollte das Trennzeichen nicht im Array vorkommen. Und die Kommandozeile hat eine bestimmte Begrenzung, wie lange
die gesamte Kommandozeile werden darf.

Was spricht eigentlich gegen ein einziges Programm?

Ich erklärs mal. Vielleicht gibt´s ja eine andere Lösung.
Ich starte aus vbsdatei1.vbs per wshshell.exec einen Befehl und werte den sofort aus. Sieht so aus

   set erg = wshshell.exec("query user /server:meinserver")  
   do while not erg.stdout.atendofstream
      line1 = erg.stdout.readline
      wscript.echo line1
   loop

Jetzt hatte ich es schon öfters, dass dieser query Befehl bei manchen Servern hängen bleibt. Hat nichts mit dem vb-Script zu tun, der hängt dann auch, wenn ich ihn aus der Eingabeaufforderung starte. Weil der aber bis in alle Ewigkeit hängt, macht das vb-Script nicht mehr weiter. Ich dachte mir, ich ermittle unmittelbar vor der wshshell.exec Zeile alle laufenden Prozesse, speichere sie in einem Array, starte vbsdatei2.vbs und übergebe das Array. Diese vbsdatei2.vbs würde dann erstmal 20 Sekunden gar nichts machen und dann erneut alle laufenden Prozesse ermitteln. vbsdatei1.vbs ist ja inzwischen weitergelaufen und hat den query-Befehl gestartet. Wenn der nach 20 Sekunden immer noch läuft, wird er von vbsdatei2.vbs gekillt und somit läuft vbsdatei1.vbs weiter.
Im Normalfall hängt ja der query-Befehl nicht, sondern ist nach einer Sekunde fertig. In diesem Fall wird unmittelbar danach vbsdatei2.vbs gekillt (weil´s ja nicht mehr gebraucht wird).

So war meine Idee. Wenn´s anders geht... immer her damit.

Gruß
Martin
Member: AlbertMinrich
AlbertMinrich Jul 26, 2011 at 15:53:43 (UTC)
Goto Top
Zitat von @AlbertMinrich:
> Zitat von @AndreasHoster:
> ----
> Aber Vorsicht:
> Die Kommandozeile mag keine Leerzeichen, bestimmte Sonderzeichen z.B. & machen auch Probleme.
> Außerdem sollte das Trennzeichen nicht im Array vorkommen. Und die Kommandozeile hat eine bestimmte Begrenzung, wie
lange
> die gesamte Kommandozeile werden darf.
>
> Was spricht eigentlich gegen ein einziges Programm?

Ich erklärs mal. Vielleicht gibt´s ja eine andere Lösung.
Ich starte aus vbsdatei1.vbs per wshshell.exec einen Befehl und werte den sofort aus. Sieht so aus

>    set erg = wshshell.exec("query user /server:meinserver")  
>    do while not erg.stdout.atendofstream
>       line1 = erg.stdout.readline
>       wscript.echo line1
>    loop
> 

Jetzt hatte ich es schon öfters, dass dieser query Befehl bei manchen Servern hängen bleibt. Hat nichts mit dem
vb-Script zu tun, der hängt dann auch, wenn ich ihn aus der Eingabeaufforderung starte. Weil der aber bis in alle Ewigkeit
hängt, macht das vb-Script nicht mehr weiter. Ich dachte mir, ich ermittle unmittelbar vor der wshshell.exec Zeile alle
laufenden Prozesse, speichere sie in einem Array, starte vbsdatei2.vbs und übergebe das Array.

Wenn ich´s mir nochmal überlege, ich brauch ja nicht die ganze Prozessliste. Es reichen ja die PID´s eventuell laufender query-Prozesse (damit ich nach 20 Sekunden nicht den falschen kille). Die kann ich einfach als Text übergeben und wenn´s nach 20 Sekunden einen mehr als die bereits vorher laufenden gibt, wird der gekillt.

Trotzdem, wenn´s anders gehen sollte, wär´s auch gut. Kann man evtl. einem per wshshell.exec gestarteten Befehl einen timeout mitgeben?

Danke
Martin
Member: AndreasHoster
AndreasHoster Jul 27, 2011 at 06:02:43 (UTC)
Goto Top
Direkt Timeout mitgeben nicht, aber mit ein bischen Programmierung kann man sowas ähnliches machen.
Allerdings kann man dann das Ergebnis nicht direkt einlesen, sondern muß es in eine Datei schreiben und später von dort einlesen:
sBefehl = "cmd /c ""query user /server:meinserver"" > " & sTempFile  
Set oExec = wshell.Exec(sBefehl)
' Zähler falls Programm abgebrochen werden muß, 200*100ms = 20 Sekunden Maximallaufzeit  
i=0
While oExec.Status = WshRunning And i<200
	WScript.Sleep 100
	i=i+1
Wend
If oExec.Status = WshRunning Then
	'Maximale Laufzeit überschritten  
	oExec.Terminate
                     ' Fehlerbehandlung machen  
End If
' Jetzt Datei sTempFile einlesen und Prüfen, falls nicht abgebrochen  
Member: AlbertMinrich
AlbertMinrich Jul 29, 2011 at 18:28:06 (UTC)
Goto Top
Zitat von @AndreasHoster:
Direkt Timeout mitgeben nicht, aber mit ein bischen Programmierung kann man sowas ähnliches machen.
Allerdings kann man dann das Ergebnis nicht direkt einlesen, sondern muß es in eine Datei schreiben und später von dort
einlesen:

Ja, danke. Diese Möglichkeit war mir bekannt. Bis vor kurzem hab ich externe Befehle immer über den Umweg Textdatei ausgewertet.
Nachdem ich aber auf die Möglichkeit gestossen bin, sie direkt im vb-Script auszuwerten und mir das sehr gut gefällt, will ich eigentlich nicht wieder "einen Schritt zurück".

Ausserdem werd ich es jetzt sowieso ein wenig anders machen müssen. Es ist durchaus möglich, dass vbsdatei1.vbs noch an anderen Stellen hängenbleiben kann bzw. ganz abstürzt. Deshalb werd ich es so machen, dass ich vbsdatei2.vbs ganz am Anfang starte. Wenn vbsdatei1.vbs korrekt durchläuft, wird vbsdatei2.vbs am Ende gekillt. Falls nicht, wird vbsdatei2.vbs, nach einer gewissen Wartezeit, aktiv (Email, net send Nachricht, vbsdatei1.vbs neustarten, je nachdem).

Problem ist somit gelöst.

Danke an alle.
Gruß
Martin