Почему мои системные вызовы не работают в программе Perl, которую я обертываю с помощью pp? - PullRequest
2 голосов
/ 10 июля 2009

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

'..\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");

рассуждая, что pp поместил скрипт в каталог \ scripts \, но без радости. Какие-либо предложения?

Ответы [ 3 ]

3 голосов
/ 10 июля 2009

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

См. Обсуждение после репоста ОП для кода с использованием $ ENV {PAR_TEMP} , которое решает проблему ОП

ДЛЯ СПРАВКИ

pp docs говорят:

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

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

Используя system, вы просите 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

Использовать ( отредактировано после комментария ОП ниже ):

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__
2 голосов
/ 15 июля 2009

См. Окончательный вариант в посте "Где pp (PAR) распаковывает файлы add (-a)?"

0 голосов
/ 13 июля 2009

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

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

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

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

Я в тупике.

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

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

...