CMD Befehle in VB

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    CMD Befehle in VB

    Hallo allerseits! :)

    Ich habe schon mal ein wenig recherchiert, da ich gerne Befehle für die Eingabeaufforderung in bzw. mit VB ausführen würde (z.B. REG, DEL etc.). Ich habe gelesen man könnte einfach die cmd.exe mit Process aufrufen und Argumente hinterherschicken, aber bei mir klappts nicht so recht. Ist das überhaupt möglich oder muss ich doch eine batch Datei erstellen?

    Danke schonmal im Voraus :D
    Zurück zu MD-DOS. :D
    Dann bau Dir lieber einen eigenen Interpreter und führe .NET-Befehle aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja schon, aber das Problem ist, dass dann der Befehl nicht erkannt wird der in den "" anführungszeichen steht. Und ich habe ehrlich keine Lust jeden Befehl als String zu deklarieren und dann einzufügen :/ außerdem soll das Fenster bzw. die Konsole auch unsichtbar sein. Ich dachte mich ich erstelle jetzt doch eine batch, denn ich kann die Befehle ganz easy immer wieder nehmen, und rufe die dann in VB auf und verstecke sie dementsprechend, da während des Batchvorgangs etliche Daten transferiert werden, und da soll der Benutzer nicht einfach was ändern...

    Xylon schrieb:

    außerdem soll das Fenster bzw. die Konsole auch unsichtbar sein.

    Guck dir das mal an, insbesondere die Eigenschaft "CreateNoWindow"

    EDIT: Hatte im Vorpost nur Batchdatei gelesen, sorry... Wurde ja schon gesagt.
    Mfg
    Vincent

    @Artentus:

    Hab ich auch schon gelesen, aber wäre das nicht umständlicher? Die Beispiele die ich dafür gefunden habe waren extrem lang. Es geht auch nicht nur um das REG sondern auch um kopieren von Verzeichnissen und Dateine, unabhängig davon ob sie schreibgeschützt, systemdateien oder versteckt sind.

    @VincentTB: Ja, ich hab ja auch schon gesagt das ich einfach die Batch versteckt als mit Process aufrufen wollte ;)

    Xylon schrieb:

    kopieren von Verzeichnissen und Dateine, unabhängig davon ob sie schreibgeschützt, systemdateien oder versteckt sind

    Schreibgeschützte Dateien kannst du doch eig. immer kopieren?! Systemdateien meines Wissens nach auch (mit Adminrechten) und versteckt sind sie ja nicht vor Programmen sondern nur vorm Explorer. Poste doch mal den Code, der in deiner Batch-Datei stehen soll, dann könnten wir dir am besten helfen. Verzeichnisse kannst du mit dem My-Namespace kopieren (My.Computer.FileSystem.CopyDirectory) (auch wenn Artentus etwas dagegen hat, aber wieso selbst was schreiben, wenn es das schon gibt?)

    EDIT: Das sollte dich, Artentus, natürlich nicht angreifen oder so :) Aber wenn ich jetzt gesagt hätte, dass man fürs Kopieren von Verzeichnissen 100+ Zeilen Code braucht, würde das mit Sicherheit nicht dazu beitragen, dass er VB-Mittel nutzt (mal ganz abgesehen davon, dass ich My-Namspace Verfechter bin). Aber das soll jeder selbst entscheiden können...
    Mfg
    Vincent

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VincentTB“ ()

    Xylon schrieb:

    Hab ich auch schon gelesen, aber wäre das nicht umständlicher?

    Nicht wirklich. Außerdem sind die einzelnen Namespaces im Framework nicht umsonst da. Mal ein kleines Beispiel: Du willst den Ping zu google.com rausfinden. Über CMD kannst du das beispielsweise so machen:

    VB.NET-Quellcode

    1. Dim matches As System.Text.RegularExpressions.MatchCollection = System.Text.RegularExpressions.Regex.Matches(StartCMD("ping google.com"), "\w+(?<IpAddress>(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})).*=.*=(?<RoundtripTime>(\d+))ms")
    2. Dim Result As Long = matches.OfType(Of System.Text.RegularExpressions.Match).Select(Function(m) Convert.ToInt64(m.Groups("RoundtripTime").Value))(0)

    Wie du siehst, ist der Code ziemlich lang, außerdem habe ich noch ne Funktion erstellt, welche die CMD startet und den Output auswertet:

    VB.NET-Quellcode

    1. Public Function StartCMD(arguments As String) As String
    2. Dim Output As String
    3. Using cmd As New System.Diagnostics.Process() With {.StartInfo = New System.Diagnostics.ProcessStartInfo("cmd.exe", String.Format("/c {0}", arguments)) With {.CreateNoWindow = True, .UseShellExecute = False, .RedirectStandardOutput = True}}
    4. cmd.Start()
    5. Output = cmd.StandardOutput.ReadToEnd()
    6. cmd.WaitForExit()
    7. End Using
    8. Return Output
    9. End Function

    Insgesamt also 11 Zeilen Code für nen mickrigen Ping. Nun die Variante über den im Framework integrierten System.Net.NetworkInformation-Namespace:

    VB.NET-Quellcode

    1. Dim p As New System.Net.NetworkInformation.Ping()
    2. Dim Result As Long = p.Send("google.com").RoundtripTime

    Das lässt sich übrigens sogar noch übersichtlich verkürzen:

    VB.NET-Quellcode

    1. Dim Result As Long = (New System.Net.NetworkInformation.Ping()).Send("google.com").RoundtripTime

    Verstehst du jetzt, weswegen es unsinnig ist, die cmd zu nutzen, wenn man das .NET-Framework hat?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nafets3646“ ()

    @VincentTB
    Grundsätzlich hab ich nichts gegen den My-Namespace, nur sind die meisten Funktionen darin (zumindest für mich) nutzlos, da sie praktisch nur schlechtere Varianten der richtigen Funktionen sind. In manchen Fällen sind sie aber auch zu was gut, hier zum Beispiel. Allerdings kann man sich mit System.IO auch hier was wesentlich besseres erstellen:
    [VB.NET] CopyTo-Erweiterung für DirectoryInfo
    Den Code hab ich einmal geschrieben und jetzt kann ich Verzeichnisse aus dem Programm heraus so kopieren, wie es der Explorer macht.