如何结合“|” powerbuilder中run()命令中的字符,以便将文本文件读取为文件的元数据输出(pdf)?

时间:2010-03-31 11:03:54

标签: pipe powerbuilder

您能告诉我如何在powerbuilder运行命令中使用“pdftk mypdf.pdf dump data | findstr NumberOfPages”并使用以下代码将此元数据保存在文件中:

string ls_runinput, ls_outputfile

ls_outputfile = "c:\test.txt"
ls_runinput = "c:\pdftk\pdftk.exe mypdf.pdf dump_data | findstr NumberOfPages >"+ls_outputfile 
Run(ls_runinput,Minimized!)

li_fileopen = FileOpen(ls_outputfile ,TextMode!, Read!, Shared!)

问题是执行了Run命令,创建了文件,但fileopen返回-1? 可能是运行无法识别“|”字符? 你应该建议我写出正确的代码? 我使用powerbuilder 10.5.2,非常感谢提前

2 个答案:

答案 0 :(得分:3)

Powerbuilder不会等待Run()调用的进程完成。 Run()的返回值完全取决于它是否成功调用了外部进程,而不是外部进程接下来做了什么。

这意味着pdftk很可能已正确完成,但您尝试过早访问输出。完成后你必须找到一些解决方法。也许从批处理文件中调用它,在完成之前创建另一个文件,然后在Powerbuilder中检查该文件是否存在。

或者,您可以使用其他方法调用外部进程。这是通过Windows Scripting Host调用外部进程的示例:

OleObject wsh

CONSTANT integer MAXIMIZED = 3
CONSTANT integer MINIMIZED = 2
CONSTANT integer NORMAL = 1
CONSTANT integer HIDE = 0
CONSTANT boolean WAIT = TRUE
CONSTANT boolean NOWAIT = FALSE

wsh = CREATE OleObject
li_rc = wsh.ConnectToNewObject( "WScript.Shell" )
li_rc = wsh.Run(ls_runinput, HIDE, TRUE)

(代码示例来自Stuart Dalby's site)。

如果仍然无法使其正常工作,最好将其拆分,并验证您是否可以先对预先存在的文件执行FileOpen,然后从外部验证该进程的输出由Run()调用是正确的(最终)。

仅供参考,|字符不是特殊字符,不需要在字符串中转义。

答案 1 :(得分:1)

罗兰史密斯有一个图书馆和他在网站上做“跑步与等待”的例子可以做你需要的事情:

http://www.topwizprogramming.com/freecode_runandwait.html

还有其他类似的东西(我们从某个地方获得了一个名为uo_syncproc的对象,它使用各种windows函数来执行此操作(CreateProcessA,WaitForSingleObject,CloseHandle)。