Seite 1 von 1

Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 28.05.2021 01:37
von Plenz
Ich möchte unter Linux Mint die Positionen der Bildschirm-Icons speichern.

Auf der Konsole sieht das so aus:

Code: Alles auswählen

user@ThinkPad-T410 ~/Desktop $ gio info -a 'metadata::caja-icon-position' Icon1
uri: file:///home/user/Desktop/Icon1
attributes:
  metadata::caja-icon-position: 1303,659
 
Folgender Code

Code: Alles auswählen

  c.s = "/usr/bin/gio"
  f.s = "info -a 'metadata::caja-icon-position' Icon1"
  cmd = RunProgram(c, f, DesktopDir, #PB_Program_Open | #PB_Program_Read)
  c = "Fehler!"
  If cmd
    c = ""
    While ProgramRunning(cmd)
      If AvailableProgramOutput(cmd)
        c = c + ReadProgramString(cmd) + Chr(13)
      EndIf
    Wend
    c = c + Chr(13) + 
    CloseProgram(cmd)
  EndIf
  MessageRequester("Ergebnis", c)
gibt das selbe aus wie auf der Konsole, aber nur bis "attributes". Die Zeile mit den Koordinaten wird nicht ausgegeben. Ich habe den String auch schon mal mit right(c, 12) verkürzt, aber da ist wirklich nichts.
Woran könnte das liegen?

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 28.05.2021 19:09
von NicTheQuick
Zwei Dinge:
Es kann sein, dass noch Daten zum Lesen verfügbar sind, obwohl das Programm schon beendet ist. Deswegen ändere die While-Bedingung mal in das hier:

Code: Alles auswählen

While ProgramRunning(cmd) Or AvailableProgramOutput(cmd)
Zweitens ist Chr(13) kein gängiger Zeilentrenner. Unter Linux und Mac solltest du Chr(10) oder gleich #LF$ nutzen und unter Windows Chr(13) + Chr(10) oder gleich #CRLF$.

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 28.05.2021 22:30
von Plenz
Danke für den Tip, das hat aber leider nicht geholfen.
Ich habe auch mal versucht, die Ausgabe in eine Datei umzuleiten, indem ich " > log.txt" ganz hinten anfüge. Ebenfalls ohne Resultat.

Das mit chr(13) habe ich aus der Hilfe zum Befehl RunProgram(), die sollte vielleicht mal überarbeitet werden. Für mich ist das aber irrelevant, weil ich die Textausgabe nur zum Testen benötige.

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 28.05.2021 22:49
von Plenz
Das einzige, was (bisher) funktioniert: ich schreibe den ganzen Befehl samt Umleitung der Ausgabe in eine Batch-Datei und rufe diese mit RunProgram() auf.

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 29.05.2021 02:20
von NicTheQuick
Die Umleitung mit > gehört auch zur Syntax von Bash. Du kannst das nicht innerhalb RunProgram benutzen.
Leider kann ich dein Beispiel bzw. dein Problem nicht nachstellen. Ich habe auch schon andere Befehle wie "ls" probiert und deren Ausgaben abgefangen und es hat immer funktionert. Ich weiß also nicht genau, warum bei dir die letzte Zeile fehlt. Kannst du testweise auch mal etwas anderes als "gio" probieren?

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 29.05.2021 09:27
von helpy
Is it possible that the gio command returns the result as ascii?
In this case you have to call RunProgram with the additional flag #PB_Program_Ascii:

Code: Alles auswählen

cmd = RunProgram(c, f, DesktopDir, #PB_Program_Open | #PB_Program_Read | #PB_Program_Ascii)

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 29.05.2021 11:48
von Plenz
Leider kann ich dein Beispiel bzw. dein Problem nicht nachstellen.
Ich habe es mit "ls -als" versucht, das funktioniert.

Versuch mal den Befehl "gvfs-info" (der wurde durch "gio" ersetzt) und einfach mit einem Stern "gvfs-info *", der gibt auf der Konsole jede Menge aus, aber mit RunProgram() kommt nichts.
#PB_Program_Ascii
does not help. Also "ReadProgramString(cmd, #PB_Ascii)" does not help.

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 29.05.2021 12:39
von Sicro
Am einfachsten ist es, wenn du die Ausgabe in eine Datei ausgibst und diese Ausgabedatei danach einliest:

Code: Alles auswählen

Define programFile$ = "sh"
Define gioOutputFile$ = GetTemporaryDirectory() + "gio_output.txt"
Define desktopDir$ = GetUserDirectory(#PB_Directory_Desktop)
Define file$ = desktopDir$ + "Icon1"
Define fileAttribute$ = "metadata::caja-icon-position"
Define programCommands$ = "-c " + #DQUOTE$ +
                          "gio info -a '" + fileAttribute$ + "' " +
                          "'" + file$ + "' " +
                          "> '" + gioOutputFile$ + "'" + #DQUOTE$

If Not RunProgram(programFile$, programCommands$, "", #PB_Program_Wait)
  Debug "Fehler!"
  End
EndIf

Define file = ReadFile(#PB_Any, gioOutputFile$)
If file
  Define gioOutput$ = ReadString(file, #PB_File_IgnoreEOL)
  MessageRequester("", gioOutput$)
  CloseFile(file)
Else
  Debug "Fehler!"
EndIf

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 29.05.2021 12:47
von Plenz
Noch seltsamer: meine Idee mit dem Batchfile funktioniert doch nicht.

Code: Alles auswählen

Global DesktopDir.s = "/home/username/Desktop"
Global BatchFile.s = "/home/username/icon_batch"
Global TempFile.s = "/home/username/icon_temp.txt"

OpenFile(17, BatchFile)
WriteStringN(17, "cd " + DesktopDir)
WriteString(17, "/usr/bin/gio info -a 'metadata::caja-icon-position' *")
WriteStringN(17, " > " + TempFile)
WriteStringN(17, "cd ..")
CloseFile(17)
cmd = RunProgram(BatchFile, "", DesktopDir, #PB_Program_Wait)
Dieser Code erzeugt zwar eine Datei icon_temp.txt, aber sie ist völlig leer.
Dann öffne ich eine Konsole, starte die oben erzeugte Batchdatei per Hand, und die Datei icon_temp.txt ist korrekt mit den gewünschten Daten gefüllt.

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Verfasst: 29.05.2021 13:27
von Plenz
#DQUOTE$
DAS war wohl der Trick, damit funktioniert wenigstens die Ausgabe, vielen Dank!