Как объединить символ «|» в команде run () в powerbuilder, чтобы прочитать текстовый файл как вывод метаданных файла (pdf)?

Подскажите, пожалуйста, как использовать "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, заранее большое спасибо

4 голоса | спросил sgian76 31 MarpmWed, 31 Mar 2010 15:03:54 +04002010-03-31T15:03:54+04:0003 2010, 15:03:54

2 ответа


0

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(), верны (в конце концов).

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

ответил Colin Pickard 31 MarpmWed, 31 Mar 2010 15:45:02 +04002010-03-31T15:45:02+04:0003 2010, 15:45:02
0

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

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

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

ответил Doug Porter 1 PMpThu, 01 Apr 2010 20:26:18 +040026Thursday 2010, 20:26:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132