2009-07-10 2 views
2

У меня есть скрипт Perl/POE/Tk, работающий на Win32 ActivePerl, который вызывает исполняемые файлы, используя system. Я создал exe скрипта, используя pp. Я могу распаковать exe и увидеть исполняемые файлы из корневого каталога «zip», но когда я запускаю exe и пытаюсь использовать функциональность системных вызовов, я получаю ошибку типа «файл не найден»;Почему мои системные вызовы не работают в программе Perl, которую я обертываю pp?

'..\cpau' is not recognized as an internal or external command, 
operable program or batch file. 

cpau.exe является одним из включенных в список файлов.

pp называется так:

pp -i alias3.ico -g -a add_event.job -a add_rec.job -a CPAU.exe -a del_event.job -a del_rec.job -a dnscmd.exe -a eventcreate.exe -o alias_v_3-0.exe alias_poe_V-3_0_par.pl 

Я предполагаю, что мне нужно настроить путь к system вызовов. В настоящее время я пытаюсь использовать путь по умолчанию;

system("cpau -dec -file add_rec.job -nowarn -wait"); 

Я попытался это:

system("..\cpau -dec -file ..\add_rec.job -nowarn -wait"); 

рассуждения, что П.П. положить скрипт в папке \ Scripts \ директории, но не радость. Какие-либо предложения?

+0

CPAU.exe представляет собой отдельный файл, как указано ниже; pp -i alias3.ico -g -a CPAU.exe -a add_event.job -a add_rec.job -a del_event.job -a del_rec.job -a dnscmd.exe -a eventcreate.exe -o alias_v_3-0 .exe alias_poe_V-3_0_par.pl fork может получить немного собачку, поскольку все это работает внутри POE. – jpolache

ответ

3

Обновление: Мои предложения ниже не работают. Тем не менее, я собираюсь оставить их на случай, если у кого-то есть аналогичный вопрос. Этот ответ показывает много вещей, которые могут звучать разумно, но не работают.

Смотрите discussion following the OP's repost для кода using $ENV{PAR_TEMP}, что решает проблема в OP в

ДЛЯ ВЕДЕНИЯ

pp docs говорят:

-a, --addfile = FILE | DIR . ..

По умолчанию файлы помещаются под/внутри пакета с их оригинальными именами.

С помощью системы вы просите cmd.exe найти файл, и теперь я понимаю, что, вероятно, это проигранная битва, если у вас есть отдельный исполняемый файл под названием cpau.exe. У меня нет времени, чтобы попробовать это прямо сейчас, но вам, возможно, придется делать fork и exec самостоятельно вместо того, чтобы полагаться на system.Как и в:

exec 'CPAU.exe', @args 

Предыдущий ответ:

Строка вы передаете system не содержит то, что вы думаете, он делает:

use strict; 
use warnings; 

my $x= "..\cpau -dec -file ..\add_rec.job -nowarn -wait"; 

print $x, "\n"; 
__END__ 

C:\Temp> fgh 
..►au -dec -file ..dd_rec.job -nowarn -wait 

Использование (отредактирован следующий комментарий OP в поле ниже):

system "..\\cpau -dec -file ../add_rec.job -nowarn -wait"; 

Я также рекомендовал бы использовать форму список system:

system '..\\cpau', qw(-dec -file ../add_rec.job -nowarn -wait); 

Кроме того, вы можете найти FindBin удобно, если вы хотите, чтобы указать путь к cpau относительно директории текущего скрипта.

Например:

#!/usr/bin/perl 

use strict; 
use warnings; 

use FindBin qw($Bin); 
use File::Spec::Functions qw(catfile); 

my $program = catfile $Bin, '..', 'cpau'; 

system $program, qw(-dec -file ../add_rec.job -nowarn -wait); 

__END__ 
+1

Или '' .. \\ .. "' или '' .. \ .. '', если команда сломана и обрабатывается/специально (в отличие от простого прохождения через API Win32, который в глобальном масштабе понимает как /, так и \ в качестве ограничителей маршрута). – ephemient

+0

Пробная система '../cpau', qw (-dec -file ../add_rec.job -nowarn -wait); Отправлено; '..'не распознается как внутренняя или внешняя команда, операционная программа или командный файл. – jpolache

+0

system '. \\ cpau', qw (-dec -file. \\ add_rec.job -nowarn -wait); работает, если каталог, в котором exe имеет другие файлы, уже есть в нем, но не если exe находится в каталоге сам по себе. – jpolache

0

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

`. \ \ cpau -dec -file. \ \ del_rec.job -nowarn -wait `;

Итак, это устраняет проблему, покупайте почему? В чем разница между system() и backtic в оболочке win32?

Говорил слишком рано. Это работает в каталоге, где cpau уже существует. Когда я попробовал его в c: \ temp, я получил «cpau», который не распознается как внутренняя или внешняя команда, операционная программа или командный файл ». ошибка. Очень расстраивает.

Я в тупике.

` cpau -dec -file del_rec.job -nowarn -wait `;

Я пробовал его с и без рычага ". \\". Такая же ошибка в любом случае.