4

powerbuilder run コマンドで "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 を返すことです。run が "|" を認識できないのかもしれません。キャラクター?適切なコードを書くために何を提案すればよいですか? 私は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は、彼のWebサイトでRun and Waitを実行するためのライブラリと例を持っており、必要なことを実行できます。

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

同様のことを行う他のバリエーションがあります(これを行うためにさまざまなWindows関数(CreateProcessA、WaitForSingleObject、CloseHandle)を使用する場所からuo_syncprocというオブジェクトを取得しました)。

于 2010-04-01T16:26:18.357 に答える