Как совместить "|" символ в команде run () в powerbuilder, чтобы прочитать текстовый файл как вывод метаданных файла (pdf)? - PullRequest
4 голосов
/ 31 марта 2010

Не могли бы вы сказать мне, как использовать "pdftk mypdf.pdf data dump | findstr NumberOfPages в команде запуска powerbuilder и сохранить эти метаданные в файл, используя следующий код, подобный этому:

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 ]

3 голосов
/ 31 марта 2010

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)

(пример кода взято с сайта Стюарта Далби ).

Если вы все еще не можете заставить его работать, лучше всего разбить его и убедиться, что вы можете сначала выполнить FileOpen для уже существующего файла, а затем внешне проверить, что вывод процесса, вызванного Run() правильно (в конце концов).

Просто для справки, символ | не является специальным символом и не нуждается в экранировании в строке.

1 голос
/ 01 апреля 2010

У Роланда Смита есть библиотека и пример для выполнения «Беги и жди» на своем веб-сайте, который может делать то, что тебе нужно:

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

Существуют и другие варианты, которые делают подобные вещи(мы получили объект с именем uo_syncproc откуда-то, который использует различные функции Windows для этого (CreateProcessA, WaitForSingleObject, CloseHandle).

...