Почему мои системные вызовы не работают в программе Perl, которую я обертываю с помощью pp?

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

'..\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 ответа

Решение

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

См. Обсуждение после репоста OP для кода, использующего $ENV{PAR_TEMP}, который решает проблему OP

Для справки

PP документы говорят:

-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__

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

Я понял, что еще один вызов исполняемого файла в коде работает. Я посмотрел и обнаружил, что работающий вызов использовал 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`;

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

Другие вопросы по тегам