RunProgram mit mehreren Parametern

Anfängerfragen zum Programmieren mit PureBasic.
Klaus
Beiträge: 9
Registriert: 18.04.2005 15:11
Wohnort: 90537

RunProgram mit mehreren Parametern

Beitrag von Klaus »

Hallo,
ich will ein externes Programm aufrufen, daß eine gegebene Datei in eine andere konvertriert. Mit der Windows-Konsole funktioniert es auch:
ncdumps.exe signal01.cdf > signal01.data

In Purebasic müsste das doch so aussehen:

Code: Alles auswählen

RunProgram("ncdumps.exe", "signal01.cdf > signal01.data", "d:\projekte\chrom\", #PB_RunProgram_Wait)
Mit meinem Purebasic-Programm scheinte es aber das nur "ncdumps.exe signal01.cdf" an das Programm geliefert wird.

Irgendwelche Vorschläge?

Gruß
Klaus
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

So in etwa könnte es gehen:

Code: Alles auswählen

Procedure.s GetEnv(szVariable.s)
  Protected Length.l, Buffer.s
  Length = GetEnvironmentVariable_(@szVariable, @Buffer, 0)
  If Length
    Buffer = Space(Length)
    GetEnvironmentVariable_(@szVariable, @Buffer, Length)
    ProcedureReturn Buffer
  EndIf
  ProcedureReturn ""
EndProcedure

RunProgram(GetEnv("COMSPEC") + " /C", Chr(34) + "ncdumps.exe signal01.cdf > signal01.Data d:\projekte\chrom\" + Chr(34), "", 1)
Kanns aber nicht testen, da ich keine ncdumps.exe habe
Vielleicht den Pfad auch in den dritten Parameter legen?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

AFAIK wird bei RunProgram() jedes durch Leerzeichen getrennte Wort als eigener Parameter behandelt. Also müsstest du das > als einzelnen Parameter angeben. Bin aber jetzt zu faul, das zu probieren... :mrgreen: <)
Klaus
Beiträge: 9
Registriert: 18.04.2005 15:11
Wohnort: 90537

Beitrag von Klaus »

@Thomas:
Hat leider nicht funktioniert.

@hardfalcon:
Wie meinst du einzeln angeben?

Gruß
Klaus
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Re: RunProgram mit mehreren Parametern

Beitrag von Captn. Jinguji »

Klaus hat geschrieben:Hallo,
ich will ein externes Programm aufrufen, daß eine gegebene Datei in eine andere konvertriert. Mit der Windows-Konsole funktioniert es auch:
ncdumps.exe signal01.cdf > signal01.data

In Purebasic müsste das doch so aussehen:

Code: Alles auswählen

RunProgram("ncdumps.exe", "signal01.cdf > signal01.data", "d:\projekte\chrom", #PB_RunProgram_Wait)
Mit meinem Purebasic-Programm scheinte es aber das nur "ncdumps.exe signal01.cdf" an das Programm geliefert wird.

Irgendwelche Vorschläge?

Grußsignal01.cdf >
Klaus
Die Umlenkung ist AFAIK eine Leistung, die die shell cmd.exe erbringt.

insofern müsste der Aufruf so lauten:
result =RunProgram ("C:\WINDOWS\system32\cmd.exe", "/C ncdumps signal01.cdf > signal01.data","d:\projekte\chrom",1)

Eine Umlenkung der Ausgabe eines Programmes mit pipe in sort.exe funktioniert jedenfalls bei mir auf diese Art aus PB heraus.
Ist das Kunst hier, oder kann das weg ?
Klaus
Beiträge: 9
Registriert: 18.04.2005 15:11
Wohnort: 90537

Beitrag von Klaus »

Ja, daß ist die Lösung

Code: Alles auswählen

RunProgram ("E:\WINNT\system32\cmd.exe", "/C ncdumps signal01.cdf > signal01.data","d:\projekte\chrom\",1)
Vielen Dank an Euch!

Grüsse
Klaus

P.S.: War schon echt am verzweifeln, seit drei Tagen...
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Beitrag von Captn. Jinguji »

War uns ein Vergnügen!
Ist das Kunst hier, oder kann das weg ?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> RunProgram(GetEnv("COMSPEC") + " /C",
Was hab ich den hier gemacht, den Kommandeinterpreter des Systems aufgerufen, also cmd.exe ab w2k, bzw. command.com vorher.
Euer Aufruf läuft ja nur auf eurem Computer, bei mir würde das nie funzen. Hab kein Windows 2000
Also bei meinem nur die Parameter etwas korrigieren, dann stimmts. Hätte es ja selber gemacht, habe aber das Programm nicht.

//Nachtrag: korrigierter Code:

Code: Alles auswählen

Procedure.s GetEnv(szVariable.s)
  Protected Length.l, Buffer.s
  Length = GetEnvironmentVariable_(@szVariable, @Buffer, 0)
  If Length
    Buffer = Space(Length)
    GetEnvironmentVariable_(@szVariable, @Buffer, Length)
    ProcedureReturn Buffer
  EndIf
  ProcedureReturn ""
EndProcedure 

RunProgram (GetEnv("COMPSPEC"), "/C ncdumps signal01.cdf > signal01.Data","d:\projekte\chrom\",1)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Beitrag von Captn. Jinguji »

Hallo,Thomas
ts-soft hat geschrieben:>> RunProgram(GetEnv("COMSPEC") + " /C",
Was hab ich den hier gemacht, den Kommandeinterpreter des Systems aufgerufen, also cmd.exe ab w2k, bzw. command.com vorher.
Euer Aufruf läuft ja nur auf eurem Computer, bei mir würde das nie funzen. Hab kein Windows 2000
Also bei meinem nur die Parameter etwas korrigieren, dann stimmts. Hätte es ja selber gemacht, habe aber das Programm nicht.
Ja, neee. DEINE erste Version lief nicht, weil du "/C" stringmässig an den COMSPEC Wert gebunden und danach erst den Argumentstring gebaut und übergeben hattest. "/C" ist aber selbst schon ein Argument und gehört in den Argumentstring.
Das hast Du dann nachträglich ja auch korrigiert ;)

MIt der allgemeineren Benutzung von COMSPEC statt ".\CMD.EXE" haste sicherlich wahr ;), aber es ging ja hier um eine schnelle Lösung.

Und, naja, ICH habe sein EXE.Programm auch nicht, TESTEN kann man aber mit vergleichbaren Konstrukten, wie bei mir beschrieben.
Es ging ihm bei seiner Frage hier ja nicht um die fachlich korrekte Datenumsetzung, sondern um die Funktionalität eines Aufrufs von Programmen mit Argumenten aus RunProgram;)


Gruss Dirk
Ist das Kunst hier, oder kann das weg ?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Es ging ihm bei seiner Frage hier ja nicht um die fachlich korrekte Datenumsetzung, sondern um die Funktionalität eines Aufrufs von Programmen mit Argumenten aus RunProgram;)
Ich bemühe mich immer um eine fachlich korrekte Antwort, hab schon zuviele Programme getestet, die mit nicht vorhandenen Pfaden, Schaden angerichtet haben. Gerade bei Anfängern, sollte es Fachlich korrekt umgesetzt sein, auch wenn der Code dadurch schlechter verstanden wird. Er könnte dann ja anschließend fragen, was es mit "COMSPEC" auf sich hat. :)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten