Seite 1 von 1

Autovervollständigung von Dateipfaden in einer Konsolenanwendung

Verfasst: 28.06.2024 06:52
von piccolo
Hallo Leute,

wie kann man in einer in PureBasic geschriebenen x86-Konsolenanwendung unter Win7 x64 die Eingabe eines Dateipfades z.B. mit

Code: Alles auswählen

Input()
so gestalten, dass die automatische Vervollständigung der Konsole aktiv bleibt, damit man innerhalb eines Verzeichnisses mit der Tabulatortaste einen Dateipfad nach dem anderen durch die alphabetisch sortierte Dateiliste gehen kann?

Geht das vielleicht mit

Code: Alles auswählen

ReadConsoleData()
Damit habe ich allerdings keine Erfahrung.

Meine Idee wäre in etwa

Code: Alles auswählen

ImportC "msvcrt.lib"
  System(cmd.p-ascii) As "_system"
EndImport
OpenConsole()
System("set /p " + #DQUOTE$ + "var=Dateipfad: " + #DQUOTE$)
CloseConsole()
Jedoch weiß ich nicht, wie ich hierbei den Wert der Batch-Variablen nach dem abschließenden Enter an PureBasic übergeben soll.

Gruß, piccolo

Re: Autovervollständigung von Dateipfaden in einer Konsolenanwendung

Verfasst: 28.06.2024 12:36
von Axolotl
Hallöchen,
ich glaube, dass du die auto. Vervollständigung nachbauen musst. Mir ist jetzt jedenfalls keine Funktion bekannt.

Für Environment Variablen gibt es diese Set/Get Kombi.

Code: Alles auswählen

; SetEnvironmentVariable() 
; GetEnvironmentVariable() 
Alternativ gibt es die Möglichkeit über eine TEMP-Datei zu gehen.
Wenn man Environment Variablen permanent haben möchte kann man das auch über die Registry machen.

Code: Alles auswählen

Computer\HKEY_CURRENT_USER\Environment 
Eine weitere Möglichkeit Kommandos in einer Console auszuführen.

Code: Alles auswählen

Global ConsoleExecutable$   ; full filename 
Global ConsoleNumber        ; running instance number 
Global Output$  ; helper 

ConsoleExecutable$ = GetEnvironmentVariable("COMSPEC") 
; Debug "Console = " + #DQUOTE$ + ConsoleExecutable$ + #DQUOTE$ 

ConsoleNumber = RunProgram(ConsoleExecutable$, "/D/Q/C dir c:\*.txt", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) 
Output$ = ""
If ConsoleNumber 
  While ProgramRunning(ConsoleNumber)
    If AvailableProgramOutput(ConsoleNumber)
      Output$ + ReadProgramString(ConsoleNumber) + #CR$
    EndIf
  Wend
  Output$ + #CR$ + #CR$
  Output$ + "Exitcode: " + Str(ProgramExitCode(ConsoleNumber))
  
  CloseProgram(ConsoleNumber) ; Close the connection to the program
EndIf

MessageRequester("Output", Output$)

Re: Autovervollständigung von Dateipfaden in einer Konsolenanwendung

Verfasst: 01.07.2024 02:07
von piccolo
Hallo @Axolotl,

erstmal Danke für deine Antwort.

Deinen ersten Vorschlag habe ich mir mal ergänzt:

Code: Alles auswählen

EnableExplicit
OpenConsole()
ImportC "msvcrt.lib"
  System(cmd.p-ascii) As "_system"
EndImport
Define Test.s = " "
SetEnvironmentVariable("var", Test)
System("set /p " + #DQUOTE$ + "var=Dateipfad: " + #DQUOTE$)
Test = GetEnvironmentVariable("var")
Debug Test
CloseConsole()
End
Leider bekomme ich damit nur eine leere Zeichenfolge zurück, wenn ich einen Pfad angegeben habe.

Deine zweiten Vorschläge (Temp-Datei, Registrierung) mag ich sehr ungern für eine popelige Abfrage in der Konsole umsetzen.

Bei deinem dritten Vorschlag schaffe ich es nicht, eine Abfrage zu formulieren, die auf meine Bestätigung durch Enter wartet und den eingegebenen Dateipfad statt des Promptes zurück gibt:

Code: Alles auswählen

Global Handle.i = 0 ; Running instance number
Global Prompt.s = GetEnvironmentVariable("ComSpec")
Global Output.s = "" ; Helper
; Debug "Console = " + #DQUOTE$ + Prompt + #DQUOTE$
Handle = RunProgram(Prompt, "/k setlocal & set /p " + #DQUOTE$ + "var=Dateipfad: " + #DQUOTE$, "", #PB_Program_Open | #PB_Program_Read)
If Handle
  While ProgramRunning(Handle)
    If AvailableProgramOutput(Handle)
      Output + ReadProgramString(Handle) + #LF$
    EndIf
  Wend
  Output + #LF$ + "-----------" + #LF$
  Output + "Exit Code: " + Str(ProgramExitCode(Handle))
  CloseProgram(Handle) ; Close program connection
  OemToChar_(@Output, @Output)
EndIf
MessageRequester("Output", Output)
Kennt jemand einen Ort, der alle möglichen Befehle des System-Imports (siehe meinen ersten Beitrag) auflistet?
Kann mir jemand erklären, wie der System-Befehl intern ausgeführt wird und warum PureBasic keine möglichen Rückgaben auslesen kann?
Lässt die Programmiersprache C oder C++ bei einer Dateipfadabfrage die automatische Vervollständigung zu oder müsste die dort auch nachprogrammiert werden?

Gruß, piccolo

Re: Autovervollständigung von Dateipfaden in einer Konsolenanwendung

Verfasst: 01.07.2024 11:46
von Axolotl
Irgendwo habe ich mal gelesen, dass PB keine "richtigen" consolen Programme erstellen kann. D.h. ich würde (wenn ich Consolen-Apps machen wollte) wohl eher auf C/C++ wechseln.
Nach meinerm Wissen wird das nur mit "nachprogrammieren" gehen.
Dann stellt sich natürlich die Frage ob eine andere Form der Eingabe (z.B. Dialog) nicht sinnvoller ist.

Eine Reihe von Consolen-Anwendungen bzw. Progrämmchen, die von oder mit der Console arbeiten gibt es hier:
http://www.horstmuc.de/

Ansonsten kennste wahrscheinlich das hier: https://learn.microsoft.com/de-de/windo ... onsole-i-o

Re: Autovervollständigung von Dateipfaden in einer Konsolenanwendung

Verfasst: 02.07.2024 05:03
von piccolo
Ich würde schon sagen, dass PB "richtige" Konsolenprogramme erstellen kann, jedenfalls im Vergleich zu AutoIt beispielsweise. Mit C/C++ muss die automatische Vervollständigung wohl auch nachprogrammiert werden, denn "getch" und ähnliche Befehle übernehmen bestimmt nicht das Handling des "set /p"-Befehls.

Ein Dialog wäre für mich nicht sinnvoll, denn sonst kann ich gleich eine GUI erstellen, zumindest im derzeitigen Fall.

Die Webseite von Horst kenne ich schon lange. Dann muss ich wohl endlich lernen, meine Batch-"Programme" nicht nach PB zu portieren, wenn ich bei einem CUI bleiben will, sondern an die verschiedenen Unteraufgaben angepasste PB-Teilprogramme schreiben, so wie es Horst macht.

Deinem MS-Link entsprechend starte ich noch jeweils einen Versuch mit "ReadConsole_" und "ReadConsoleData", habe aber keine Erwartung auf Erfolg.

Trotzdem danke ich dir für deine Bemühungen und wünsche dir einen schönen Tag.
Gruß, piccolo