Ergebnis der Kommandozeile in neuen Befehl übernehmen

  • Hallo Leute,

    kann mir jemand einen Ansatz nennen, wie ich das Ergebnis eines Kommandozeilenbefehls in einen neuen übernehmen und damit übergeben kann?

    Es geht um folgendes: Ich habe drei Befehl die nacheinander aufbauen. Die jeweilig gleichfarbig dargestellten Nummern sind Ergebnis des vorangegangenen Befehls und müssen als Variable in den nächsten Befehl. Ziel ist es die letzte Zahl (grün) zu eruieren. Diese Zahl sollte dann, wenn möglich, noch in folgendes Format gebracht werden:
    xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    {8} {4} {4} {4} {12}


    Das sind die Befehle:

    1. Befehl C:\Documents and Settings\sop>rsm view /tphysical_media /b /cg178081F3FCB7424290
    7808DC711B1CF1

    F738A5BA21974A0589A3A5691BDA951C

    2. Befehl C:\Documents and Settings\sop>rsm view /tpartition /b /cgF738A5BA21974A0589A3A56
    91BDA951C

    DD43A1C6B0DD4F3DBBF28D083DC85043

    3. Befehl
    C:\Documents and Settings\sop>rsm view /tlogical_media /b /cgDD43A1C6B0DD4F3DBBF
    28D083DC85043

    32B134DD62D64B36958DC331800128E1


    Würde mich sehr freuen, wenn mir jemand helfen könnte dies in einem Script zu bewerkstelligen.

  • Hi,

    wo ist denn dein Problem?

    Absetzen der Befehle? Erstellen des Formats?

    Mega


    Das ich die Befehle mit "run" absetze ist mir klar aber ich weiß nicht wie ich die jeweiligen Ergebnisse in die neue Befehlszeile überführe. Die farbig markierten Nummern sind ja nicht statisch, sondern werden ausgelesen und müssen in drei Schritten an den jeweils nächsten befehl übergeben werden, um am Ende die korrekte Nummer zu ermitteln.

    Wie ich das Format am Ende erstelle ist mir auch noch unklar.

  • Hi,

    was führst du aus?

    1) Wie kommst du an die Nr? Manuell ...
    2) Nummer weiterreichen
    3) Format

    Der erste Befehl den ich absetze lautet:

    rsm view /tphysical_media /b /cg178081F3FCB74242907808DC711B1CF1

    dessen Ergebnis ist: F738A5BA21974A0589A3A5691BDA951C

    Das Ergebnis übergebe ich bisher manuell in folgenden Befehl:

    rsm view /tpartition /b /cgF738A5BA21974A0589A3A5691BDA951C

    dessen Ergebnis folgendes ist: DD43A1C6B0DD4F3DBBF28D083DC85043

    und das Ergebnis übergebe ich manuell in den letzten Befehl:

    rsm view /tlogical_media /b /cgDD43A1C6B0DD4F3DBBF28D083DC85043

    um am Ende an die korrekte Nummer zu gelangen: 32B134DD62D64B36958DC331800128E1


    Die Nummern sind nur beispielhaft und werden aus verschiedenen Exabyte Mammothtapes ausgelesen, nur die erste Nummer aus dem ersten Befehl ist statisch. Die Nummer die mit dem dritten Befehl rauskommt ist der "GUID-name" des Bandes.

    Das Format der Nummer sollte dem entsprechen:

    xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    {8} {4} {4} {4} {12}

    In diesem Beispiel würde sie dann also so aussehen: "32B134DD-62D6-4B36-958D-C331800128E1"

  • Das Ergebnis wird immer auf der Kommandozeile ausgegeben. Letzten Endes muß die aus den Schritten resultierende Nummer nur aus der DOS-Box kopiet werden, da ich sie dann in einem Backup-Script einsetzen will.
    Schön wäre es natürlich, wenn ich mir die Nummer dann in einerm grafischen Fenster anzeigen lassen könnte und eventuell noch durch einen Button "In Zwischenablage kopieren" schneller zugänglich machen könnte.

  • Schau dir doch mal StdOutRead an. Bei Run muss dazu nur ein zusätzlicher Parameter gesetzt werden.

  • Schau dir doch mal StdOutRead an. Bei Run muss dazu nur ein zusätzlicher Parameter gesetzt werden.


    Ich habe mir die Funktion schon mal angeschaut, allerdings weiß ich nicht, wie ich da nur einen Teil aus der CMD auslesen soll. Schließlich wird da mehr ausgegeben als mir lieb ist.

    • Offizieller Beitrag

    Hi,

    also die letzte Nr könntest du so erstellen:

    [autoit]

    Global $str = "32B134DD62D64B36958DC331800128E1"
    ;~ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    ;~ {8} {4} {4} {4} {12}
    ConsoleWrite(_createSerial($str) & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Func _createSerial($str)
    Return StringLeft($str, 8) & '-' & StringMid($str, 9, 4) & '-' & StringMid($str, 14, 4) & '-' & StringMid($str, 19, 4) & '-' & StringRight($str, 12)
    EndFunc ;==>_createSerial

    [/autoit]

    Du musst jetzt eigentlich nur noch rausfinden wie du die Nummer bekommst.

    Das könntest du mal so probieren:

    [autoit]

    MsgBox(64, 'DOS', _getDOSOutput('set'))

    [/autoit][autoit][/autoit][autoit]

    Func _getDOSOutput($command)
    Local $text = '', $Pid = Run(@ComSpec & ' /c ' & $command, '', @SW_HIDE, 2 + 4)
    While 1
    $text &= StdoutRead($Pid, False, False)
    If @error Then ExitLoop
    Sleep(10)
    WEnd
    Return $text
    EndFunc ;==>_getDOSOutput

    [/autoit]

    Einfach set durch deinen Befehl ersetzen.

    Mega

  • Zitat


    Ich habe mir die Funktion schon mal angeschaut, allerdings weiß ich nicht, wie ich da nur einen Teil aus der CMD auslesen soll. Schließlich wird da mehr ausgegeben als mir lieb ist.


    Warum wird da mehr ausgegeben? probier einfach mal:
    $Pid = Run($command, '', @SW_HIDE, 2 + 4)
    in der Func von Xeno :)

  • Ich hab das mal in ein Script eingebaut udn gestartet aber es passiert nichts. Das Script pausiert im Tray nach dem Start und ich kann es dann nur beenden.
    Die Sache ist ja auch die, dass ich mehrere Befehle absetzen muß und in diese immer die Ergebnisse vom vorherigen übernehmen muß.


    Warum wird da mehr ausgegeben? probier einfach mal:
    $Pid = Run($command, '', @SW_HIDE, 2 + 4)
    in der Func von Xeno :)

    Auf der Kommandozeile stehen schließlich mehrere Zeilen mit Zeichen, z.B. allein der Befehlsaufruf und dann das Ergebnis.

    Ich habe übrigens mal deine Zeile in das Script eingebaut aber da passiert auch nichts.

  • ähhm, ja :P Man muss Leerzeichen in @ComSpec berücksichtige, dann kann man es verwenden :). Da wird dann nur die Ausgabe gezeigt, keine zusätzlichen Zeilen:

    Spoiler anzeigen
    [autoit]

    MsgBox(64, 'DOS', _getDOSOutput('set'))

    [/autoit] [autoit][/autoit] [autoit]

    ; By Xeno, hat aber " " um ComSpec gefehlt :)
    Func _getDOSOutput($command)
    Local $text = '', $Pid = Run('"' & @ComSpec & '" /c ' & $command, '', @SW_HIDE, 2 + 4)
    While 1
    $text &= StdoutRead($Pid);, False, False)
    If @error Then ExitLoop
    Sleep(10)
    WEnd
    Return $text
    EndFunc ;==>_getDOSOutput

    [/autoit]
  • Probiere doch zuerst mal auf der Kommandozeile, ob Du durch Verkettung der Befehle das ganze in eine Kommandozeile bekommst.
    Schau Dir in der Windows-Hilfe die Infos zu Pipe-Symbolen, Verkettung von Befehlen ("Verbinden von Befehlen mit Umleitungssymbolen") an.
    Die Kommandozeie ist mächtig - und dann kannst Du mit autoIT den Rest erledigen..

  • Ok, das funktioniert, mir wird die Nummer ausgegeben.
    Wenn ich die gleiche Funktion dann aber nochmal aufrufe, wie übergebe ich dann das Ergebnis?


    Probiere doch zuerst mal auf der Kommandozeile, ob Du durch Verkettung der Befehle das ganze in eine Kommandozeile bekommst.
    Schau Dir in der Windows-Hilfe die Infos zu Pipe-Symbolen, Verkettung von Befehlen ("Verbinden von Befehlen mit Umleitungssymbolen") an.
    Die Kommandozeie ist mächtig - und dann kannst Du mit autoIT den Rest erledigen..

    Ich habe es mal mit einem Pipe Symbol probiert, finde aber auch da keine Lösung das Ergebnis an den nächsten Befehl zu übergeben.
    Es sah so aus:

    rsm view /tphysical_media /b /cg178081F3FCB74242907808DC711B1CF1 | rsm view /tpartition /b /cg"{}"

    Da kommt immer die Meldung, dass die Nummer, die ja direkt nach dem "cg" folgen sollte, falsch sei. Wie kann man das denn übergeben?

  • Ist doch einfach :) :

    [autoit]

    $n = _getDOSOutput('rsm view /tphysical_media /b /cg178081F3FCB74242907808DC711B1CF1')
    $n2 = _getDOSOutput('rsm view /tpartition /b /cg' & $n)
    $nummer = _getDOSOutput('rsm view /tlogical_media /b /cg' & $n2)

    [/autoit]
    • Offizieller Beitrag

    Ist doch einfach :) :

    [autoit]

    $n = _getDOSOutput('rsm view /tphysical_media /b /cg178081F3FCB74242907808DC711B1CF1')
    $n2 = _getDOSOutput('rsm view /tpartition /b /cg' & $n)
    $nummer = _getDOSOutput('rsm view /tlogical_media /b /cg' & $n2)

    [/autoit]

    Genau so habe ich mir das gedacht. Warum du Probleme mit dem " " hattest weiß ich allerdings nicht. Wenn ich die Beta nutze, dann funzt die Func auch so.

    Mega

  • Könnt ihr mir mal die Funktion etwas erklären, ich komme nämlich überhaupt nicht vorwärts.

    Muß ich die Funktion drei mal aufrufen bzw. wo setze ich $n, $n2 und $nummer ein?