4

您能否告诉我如何在 powerbuilder 运行命令中使用“pdftk mypdf.pdf 转储数据 | 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 ,非常感谢提前

4

2 回答 2

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 网站的代码示例)。

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

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

于 2010-03-31T11:45:02.167 回答
1

Roland Smith 在他的网站上有一个运行和等待的库和示例,可以满足您的需要:

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

还有其他变体可以做类似的事情(我们从某个地方获得了一个名为 uo_syncproc 的对象,该对象使用各种 Windows 函数来执行此操作(CreateProcessA、WaitForSingleObject、CloseHandle)。

于 2010-04-01T16:26:18.357 回答