Top-Themen

Aktuelle Themen (A bis Z)

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

Frage Entwicklung Batch & Shell

GELÖST

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

Mitglied: AlbertMinrich

AlbertMinrich (Level 2) - Jetzt verbinden

26.07.2011 um 10:22 Uhr, 5702 Aufrufe, 8 Kommentare

Hallo,

vbsdatei1.vbs hat diesen Inhalt
01.
set wshshell = CreateObject("WScript.Shell") 
02.
redim testarr(2) 
03.
testarr(0) = "eins" 
04.
wshshell.run "vbsdatei2.vbs " & testarr
vbsdatei2.vbs hat diesen Inhalt
01.
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:
01.
set wshshell = CreateObject("WScript.Shell") 
02.
myvari = "eins" 
03.
wshshell.run "vbsdatei2.vbs " & myvari
oder ein Array an eine Sub übergeben:
01.
set wshshell = CreateObject("WScript.Shell") 
02.
redim testarr(2) 
03.
testarr(0) = "eins" 
04.
mysub testarr 
05.
 
06.
sub mysub(uebergebenesarray) 
07.
   wscript.echo ubound(uebergebenesarray) 
08.
end sub


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

Danke
Martin
Mitglied: AndreasHoster
26.07.2011 um 11:09 Uhr
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.
Bitte warten ..
Mitglied: AlbertMinrich
26.07.2011 um 12:08 Uhr
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:
01.
set wshshell = CreateObject("WScript.Shell") 
02.
myvari = "eins" 
03.
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
Bitte warten ..
Mitglied: TsukiSan
26.07.2011 um 14:08 Uhr
Ich müsste also das ganze Array in eine Variable schreiben und in der zweiten Datei wieder auseinanderpfriemeln.
durch JOIN zum Beispiel:
01.
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
Bitte warten ..
Mitglied: AndreasHoster
26.07.2011 um 14:30 Uhr
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?
Bitte warten ..
Mitglied: AlbertMinrich
26.07.2011 um 16:58 Uhr
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

01.
   set erg = wshshell.exec("query user /server:meinserver") 
02.
   do while not erg.stdout.atendofstream 
03.
      line1 = erg.stdout.readline 
04.
      wscript.echo line1 
05.
   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
Bitte warten ..
Mitglied: AlbertMinrich
26.07.2011 um 17:53 Uhr
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

01.
>    set erg = wshshell.exec("query user /server:meinserver") 
02.
>    do while not erg.stdout.atendofstream 
03.
>       line1 = erg.stdout.readline 
04.
>       wscript.echo line1 
05.
>    loop 
06.
> 
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
Bitte warten ..
Mitglied: AndreasHoster
27.07.2011 um 08:02 Uhr
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:
01.
sBefehl = "cmd /c ""query user /server:meinserver"" > " & sTempFile 
02.
Set oExec = wshell.Exec(sBefehl) 
03.
' Zähler falls Programm abgebrochen werden muß, 200*100ms = 20 Sekunden Maximallaufzeit 
04.
i=0 
05.
While oExec.Status = WshRunning And i<200 
06.
	WScript.Sleep 100 
07.
	i=i+1 
08.
Wend 
09.
If oExec.Status = WshRunning Then 
10.
	'Maximale Laufzeit überschritten 
11.
	oExec.Terminate 
12.
                     ' Fehlerbehandlung machen 
13.
End If 
14.
' Jetzt Datei sTempFile einlesen und Prüfen, falls nicht abgebrochen
Bitte warten ..
Mitglied: AlbertMinrich
29.07.2011 um 20:28 Uhr
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
Bitte warten ..
Ähnliche Inhalte
VB for Applications
VBS Script kann Prgramm nicht starten
gelöst Frage von C.BoernerVB for Applications15 Kommentare

Hallo ihr Admins, Ich habe folgendes Scenarios ein Programm läuft im Hintergrund (Drivve-Image) das übergibt Werte an ein VBS ...

Batch & Shell
VBS: mehrere ClickBox Objekte automatsch füllen (ohne Array)
gelöst Frage von mobby83Batch & Shell5 Kommentare

Hallo Forum, ich bin "neu" hier, auch wenn ich hier schon oft anwesend war und hilfreiche Tipps fand. Heute ...

VB for Applications
VB-Script in VB-Script starten und Parameter übergeben
gelöst Frage von denkisVB for Applications7 Kommentare

Hallo liebe Scriptgemeinde, ich muss mehrere Rechner für den Übergang in eine neue Domäne vorbereiten. Dafür sind drei wesentliche ...

Batch & Shell
VBS-Script reagiert bei Start über Task anders als sonst
gelöst Frage von LarzBatch & Shell4 Kommentare

Hallo zusammen, ich habe hier eine Batch-Datei die ein Programm mit verschiedenen Parametern aufrufen muss: Ein Parameter ist dabei ...

Neue Wissensbeiträge
Datenschutz

Teamviewer kommt für IoT-Geräte wie den Raspberry Pi

Information von magicteddy vor 25 MinutenDatenschutz

Moin, jetzt werden IoT Geräte endgültig zur Wanze? Ich stelle mir gerade eine Leitwarte auf Cloudbasis vor wo eine ...

Microsoft

Letzte Updates für Win10 und Server2016 müssen bei Bedarf über den Update catalogue in den WSUS importiert werden!

Tipp von DerWoWusste vor 5 StundenMicrosoft1 Kommentar

automatisch kommt da nichts an im WSUS und auch nicht im SCCM. Siehe Hinweise zum Bezug der jeweils neuesten ...

Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 3 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 3 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Heiß diskutierte Inhalte
Netzwerkgrundlagen
IPv6 Inter-VLAN Routing
gelöst Frage von clSchakNetzwerkgrundlagen10 Kommentare

Hi ich befasse mich gerade mit der Implementierung von IPv6 was bisher (in einem VLAN) korrekt funktioniert inkl. DNS ...

Windows Netzwerk
Ist ein Portforwarding auf einen PC ohne lauschendes Programm ein (großes) Sicherheitsproblem?
Frage von PluwimWindows Netzwerk10 Kommentare

Hallo zusammen, zur Fernwartung eines Rechners an einem anderen Ort nutze ich VNC. Da dieser Rechner einfach nur eine ...

SAN, NAS, DAS
Wer kennt sich mit QNAP und CISCO aus ?
gelöst Frage von MachelloSAN, NAS, DAS10 Kommentare

Hallo Zusammen hier im Forum, Ich habe ein QNas 451+ und dieses NAS hat zwei GBit Lan Adapter die ...

Netzwerkmanagement
Preis für Wartungsvertrag ok?
Frage von a-za-zNetzwerkmanagement8 Kommentare

Hallo! Mal ne Frage, weil ich mich mit dem akzeptablen Preis für einen Reaktionszeitvertrag nicht auskenne. Meine Firma hat ...