mayho33
Goto Top

Return von C-Sharp ConsoleApp direkt in VBS ausgeben

Hallo @ All

Ich weiß! VBS! Alter Hut! Trotzdem scheint es auf meine Frage irgendwie keine auffindbare Antwort zu geben.
Mein Problem ist folgendes und ich hoffe auf eure Unterstützung face-wink :

Ich habe eine kleine C-Sharp ConsoleApp geschrieben die einige OS- und hardwarespezifische Details ausgiebt.
z.B (Geräte Model ausgeben):
consout

Da wir noch verstärkt mit VBS arbeiten soll das Ganze natürlich auch via VB funktionieren. Tut es natürlich auch, aber nur über diesen Umweg:
Dim objShell : Set objShell = CreateObject("Wscript.Shell")  
Set exec = objShell.Exec("<Path>\SysInfo.exe -model")  
Dim Result : Result = exec.StdOut.ReadLine

Ich würde das Output der exe aber gerne direkt bekommen ala Functions-Aufruf. Z.B. so:
Dim Result : Result = "<Path>\SysInfo.exe -model"  

Ich gehe davon aus, dass ich in der C-Sharp-App etwas ändern muss. Nur was? Environment.Exit(myResult) funktioniert natürlich nicht, weil hier nur numerische Werte gültig sind).

hier noch ein Code-Snipped aus der C-Sharp-App:
//Main:
static void Main(string args)
        {
            foreach (var arg in args)
            {
                if (Regex.Match(arg, @"(-Mod|-mo|\/mod|\/mo)").Success)  
                    new Worker().GetSysInfo();
            }
        }

//exemplarisch die Methode zum auslesen:
public string GetSysInfo()
        {
            string toReturn = string.Empty;
            System.Management.SelectQuery query = new System.Management.SelectQuery(@"Select * from Win32_ComputerSystem");  

            using (System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(query))
            {
                foreach (System.Management.ManagementObject process in searcher.Get())
                {
                    process.Get();
                    try
                    {
                        toReturn = (process["Model"]).ToString().TrimStart().TrimEnd(); ;  
                    }
                    catch (Exception e)
                    {
                        toReturn = "can't read WMI. see: " + e.Message;  
                    }
                }
            }
            Console.WriteLine(toReturn);
            return toReturn;
        }

Vielen Dank für eure Hilfe!

Mayho

Content-Key: 372052

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

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

Mitglied: 136037
Solution 136037 Apr 24, 2018 updated at 11:37:22 (UTC)
Goto Top
Da wir noch verstärkt mit VBS arbeiten soll das Ganze natürlich auch via VB funktionieren. Tut es natürlich auch, aber nur über diesen Umweg:
Das ist der normale Weg den du gehen musst um Stdout deiner Konsolenanwendung zu capturen. Deinen gewünschter Weg gibt und gab es noch nie in VBS, nimm stattdessen die Powershell , die kann das by design face-wink.

Du könntest dir höchstens ein COM-Object programmieren von dem du dann mit CreateObject eine Instanz erstellst und dann deine Methoden in der DLL direkt ansprichst, damit ist dann die Rückgabe an die Variable direkt möglich.

Da VBS keine DLLs direkt ansprechen kann sehe ich das als einzigste Möglichkeit, und den Scripthost um Funktionen zu erweitern kommt wohl sicher nicht in Frage face-smile.
Member: mayho33
mayho33 Apr 24, 2018 at 11:44:51 (UTC)
Goto Top
Hi doulingo,

danke für deine Antwort. COM wäre eine Lösung face-smile. Das Problem bei COM ist halt wieder, dass man es erst registrieren muss um es verwenden zu können face-sad

Powershell hat den unangenehmen Nebeneffekt, dass es erst das Framework laden muss um arbeiten zu können. Im OSD kein gangbarer Weg für uns. Im normalen Deployment natürlich eine angenehme Sache. Danke!

Das ist der normale Weg den du gehen musst...

Ja eh. Da wir aber viele Köche haben die kaum kochen können face-wink suchen wir immer nach Wegen um den Einsatz unserer Tools so einfach wie möglich zu halten.
Mitglied: 136037
136037 Apr 24, 2018 updated at 11:51:46 (UTC)
Goto Top
Joa VBS war halt immer schon eine Krücke, VBA hat es besser gemacht und man konnte die Win32 API ansprechen.
Powershell hat den unangenehmen Nebeneffekt, dass es erst das Framework laden muss um arbeiten zu können.
Eine Sekunde ist dir zu viel face-smile? Nimm immer den -NoProfile Switch und lad alles was gebraucht wird in den AssemblyCache .. dann ist das ganze noch etwas schneller face-wink.