2010-03-31 2 views
4

Pourriez-vous s'il vous plaît me dire comment utiliser « données de vidage pdftk de mypdf.pdf | findstr NumberOfPages dans PowerBuilder ordre de marche et enregistrer ces métadonnées dans un fichier en utilisant le code suivant comme ceci:Comment combiner "|" caractère dans la commande run() dans powerbuilder afin de lire un fichier txt en tant que sortie de métadonnées d'un fichier (pdf)?

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!) 

Le problème est que Exécuter la commande est exécutée, le fichier est créé, mais fileopen renvoient -1? Est-il peut-être que l'exécution ne peut pas reconnaître le caractère "|"? Que devez-vous me proposer pour écrire le bon code? Iam using powerbuilder 10.5.2, Merci beaucoup d'avance

+0

Pourquoi votre fichier de sortie a une extension .exe? Il semble que ce devrait être un fichier texte quelconque –

+0

Oui Colin c'était une erreur de ma part, je l'ai corrigé – sgian76

Répondre

3

Powerbuilder n'attend pas le processus appelé par Run() pour terminer. Les valeurs de retour de Run() sont basées uniquement sur l'appel du processus externe, et non sur ce que le processus externe a fait ensuite.

Cela signifie que pdftk a probablement terminé correctement, mais vous avez essayé d'accéder à la sortie trop tôt. Vous devrez trouver un moyen de travailler quand il a terminé. Peut-être appelez-le à partir d'un fichier batch qui crée un autre fichier avant qu'il ne se termine, puis dans Powerbuilder vérifier l'existence de ce fichier.

Vous pouvez également utiliser une méthode différente pour appeler votre processus externe. Ceci est un exemple d'appeler un processus externe via 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) 

(exemple de code de Stuart Dalby's site chipé).

Si vous ne pouvez toujours pas le faire fonctionner, votre meilleur bit est de diviser dehors, et vérifiez que vous pouvez faire un FileOpen sur fichier pré-existant, puis vérifier que la sortie externe du processus appelé par Run() est correct (éventuellement). Juste pour référence, le caractère | n'est pas un caractère spécial et n'a pas besoin d'échapper dans une chaîne.

1

Roland Smith possède une bibliothèque et un exemple pour faire Run et attendre sur son site Web qui peut faire ce que vous avez besoin:

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

Il existe d'autres variantes là-bas qui font des choses semblables (nous avons acquis un objet appelé uo_syncproc de quelque part qui utilise diverses fonctions de fenêtres pour le faire (CreateProcessA, WaitForSingleObject, CloseHandle)

Questions connexes