Почему мои системные вызовы не работают в программе 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 ".\\". Та же ошибка в любом случае.