Unvollständige Rückgabe eines aufgerufenen Programms

Für allgemeine Fragen zur Programmierung mit PureBasic.
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag 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?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag 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$.
Bild
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag 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.
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag 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?
Bild
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag 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)
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag 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.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag 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
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag 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.
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Unvollständige Rückgabe eines aufgerufenen Programms

Beitrag von Plenz »

#DQUOTE$
DAS war wohl der Trick, damit funktioniert wenigstens die Ausgabe, vielen Dank!
Antworten