CMD Tool + Parameter > output.txt ?

  • VBScript

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Netfreak.

    CMD Tool + Parameter > output.txt ?

    Ich spiele mich jetzt schon seit ner Ewigkeit mit dem Problem herum, ein CMD-Tool mittels Variablen aufzurufen und dessen Ausgabe in eine Text-Datei zu schreiben. Aber was auch immer ich mache, es funktioniert einfach nicht. Irgendwie scheint es wohl an den Quotas zu liegen, aber ich seh den Fehler einfach nicht.

    Da ich unnzählige Versuche mit unzähligen Quotas-Varianten hinter mir habe, möchte ich diese nun einfach weglassen und nur den theroetischen Ansatz pasten, in der Hoffnung, jemand könnte mir die Codezeile "Set objExec ... " funktionstüchtig machen.

    Quellcode

    1. Dim EACLogCheckerPath
    2. EACLogCheckerPath = "C:\Program Files (x86)\Exact Audio Copy\CheckLog.exe"
    3. Function checkLog (cLOG)
    4. Set objShell = CreateObject("WScript.Shell")
    5. Set objExec = objShell.Exec("%comspec% /c " & EACLogCheckerPath & " " & cLOG & " > C:\output.txt")
    6. Set objShell = Nothing
    7. End Function

    Aus einer Sub Routine heraus wird dann die Function checkLog(objfile.Path) aufgerufen.

    Ich bin für jeden Ansatz dankbar, der mir hier irgendwie weiterhelfen könnte.

    LG, Netfreak
    Entweder du machst es mit .run und leitest es um, oder du verwendest Exec, da erhältst du ein WshScriptExec zurück mit StdIn und Stdout usw:
    msdn.microsoft.com/en-us/library/cbxxzwb5(v=vs.84).aspx
    Das ist meine Signatur und sie wird wunderbar sein!
    Jep, ich hatte das zuvor eh als run umgeleitet, aber dann mit allen möglichen Alternativen rumgespielt, eben weil ich das mit den Quotas nicht zum Laufen bekommen habe. Ich habe den Code mal umgeschrieben, aber das Problem bleibt weiterhin bestehen, nämlich dass das Tool "Logchecker.exe" nicht korrekt mit dem Parameter in der Variable cLOG gestartet wird. Die Variable EACLogCheckerPath enthält Leerzeichen im Pfad, muss also irgendwie mit Quotas an CMD gegeben werden, so ja auch die Variable cLOG (die den Pfad zur Log-Datei enthält).

    Als Beispiel hier mal die Kommandozeile, wie ich sie im CMD-Fenster direkt eingeben würde:

    Quellcode

    1. C:\>"C:\Program Files (x86)\Exact Audio Copy\CheckLog.exe" "S:\_2del\_vbs test\Peter Fox - Stadtaffe\Stadtaffe.log"

    Und hier der abgeänderte Code, aber eben immer noch mit dem Problem des korrekten Aufrufes:

    Quellcode

    1. EACLogCheckerPath = "C:\Program Files (x86)\Exact Audio Copy\CheckLog.exe"
    2. Function checkLog (cLOG)
    3. Set objShell = CreateObject("WScript.Shell")
    4. Set objExec = objShell.Exec("%comspec% /k " & EACLogCheckerPath & " " & cLOG)
    5. Do
    6. strFromLC = objExec.StdOut.ReadLine()
    7. WScript.Echo "Output: " & strFromLC
    8. Loop While Not objExec.Stdout.atEndOfStream
    9. Set objShell = Nothing
    10. End Function
    Nachdem ich nun mehrere CL-Tools in den verschiedensten Varianten durchprobiert habe, bin ich zu der Erkenntnis gelangt, dass es anscheinend 2 Versionen von CL-Tools gibt: die einen, welche problemlos ihre Ausgabe in eine Datei umleiten bzw mit exec direkt zurückgeben können, und andere, die das nicht tun.

    Gibt es für diese Tools eventuell eine andere Möglichkeit, die Ausgabe auszulesen oder in eine Datei zu schreiben?
    Ich habe EAC nicht. Ein funktionierendes Beispiel hänge ich an. Evtl. kannst Du es anpassen. Wichtig sind dabei die Häkchen und Nichthäkchen. Es ist noch bissel Ballast für andere Subs drin drin, funzt aber trotzdem.

    Visual Basic-Quellcode

    1. option Explicit
    2. dim fSO, Arg, ws, s, anzahl,Ordnerignorieren, Ziel
    3. Dim sNeuerTitel
    4. set ws = CreateObject("Wscript.shell")
    5. Set fSO = CreateObject("Scripting.FileSystemObject")
    6. const Titelleer=1
    7. anzahl=0
    8. Ordnerignorieren=0
    9. if WScript.Arguments.Count > 0 then
    10. For Each Arg in Wscript.Arguments
    11. if fso.FolderExists(Arg) then
    12. mkZiel Arg,1
    13. Auslesen Arg
    14. elseif fso.FileExists(Arg) then
    15. mkZiel Arg,0
    16. Auslesen Arg
    17. end if
    18. next
    19. msgbox "Infos erstellt." & vblf & ziel, vbokonly+vbInformation,"Fertig"
    20. end if
    21. sub mkZiel(byval Ordner, byval IsOrdner)
    22. if IsOrdner=1 then
    23. if right(Ordner,1)<>"\" then
    24. Ziel = chr(34) & Ordner & "\00_Info.txt" & chr(34)
    25. else
    26. Ziel = chr(34) & Ordner & "00_Info.txt" & chr(34)
    27. end if
    28. if fso.FileExists(replace(Ziel,chr(34),"")) then
    29. fSO.DeleteFile replace(Ziel,chr(34),""), true
    30. end if
    31. Ziel = " >> " & Ziel
    32. else
    33. Ziel = " > " & chr(34) & left(Ordner,instrrev(Ordner,".")) & "txt" & chr(34)
    34. end if
    35. end sub
    36. sub Auslesen(byval Pfad)
    37. dim name, objShell, objFolder, Folder, SubFolder
    38. if fSO.FolderExists(Pfad) then
    39. Set Folder=FSO.GetFolder(Pfad)
    40. if right(Pfad,1) <> "\" then
    41. Pfad = Pfad & "\"
    42. end if
    43. 'I:\Videobearbeitung\MediaInfo>mediainfo --Output=file://template.txt "Y:\Filme\0\*.mkv" > Y:\Filme\0\Info.txt
    44. s="%comspec% /c I:\Videobearbeitung\MediaInfo\mediainfo --Output=file://I:\Videobearbeitung\MediaInfo\template.txt " & chr(34) & Pfad & "*.mkv" & chr(34) & ziel
    45. ' msgbox s
    46. ws.run s,0,true
    47. For Each SubFolder in Folder.SubFolders
    48. Auslesen SubFolder.Path
    49. Next
    50. elseif fSO.FileExists(Pfad) then
    51. s= "%comspec% /c I:\Videobearbeitung\MediaInfo\mediainfo --Output=file://I:\Videobearbeitung\MediaInfo\template.txt " & chr(34) & Pfad & chr(34) & ziel
    52. ws.run s,0,true
    53. ' msgbox s
    54. end if
    55. end sub
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    @peterfido: danke für dein Script.

    So wie es aussieht, hab ich mir wohl gerade die Tools ausgesucht, welche nicht über StdOut zu kommunizieren in der Lage sind. Es scheint auch, dass es bereits mehrere User gibt, die selbiges Problem haben. Ein etwas umständlicher Workaround wäre die Verwendung von Powershell anstelle der klassischen Console und eines Powershell-scriptes, welches Char für Char das Powershell-Fenster ausliest - aber das kann ja nicht die Lösung sein, auch weil hierfür die Powershell-Script Restrictionen gelockert werden müssen.

    Egal, ich hab mal im EAC Forum nen Post gemacht - mal schaun, ob sich wer meldet und ob's vllt schon eine vernünftige Methode gibt doch irgendwie ohne Akrobatik an den Output ranzukommen.