Могу ли я предотвратить запуск системы cmd.exe, если поставляемая программа не найдена? - PullRequest
0 голосов
/ 22 июля 2011

В Windows (с AcitveState perl 5.8 ...), когда я использую system для вызова другой программы из моего сценария perl, например:

my $command="tool.exe"; # or 'C:\fullpath\tool.exe'
my $param = '...';
my $err = system($command, $param);
die("tool not found!") if $err == -1; # never used!
my $errno = $err>>8;
print "Command executed with error code: $errno\n";

Я никогда не смогуправильно определите, может ли tool.exe быть найден системой, потому что если он не найден (не находится по пути или не указан полный путь), system, очевидно, автоматически передаст команду cmd.exe, который затем завершится ошибкой с либо path-not-found (код выхода 3) или с командой-not-found код выхода 1!

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

Также обратите внимание, что я проверил (с помощью ProcessExplorer), что когда tool.exeв пути no cmd.exe будет задействован, то есть perl.exe будет прямым родительским процессом tool.exe.

Обходной путь: (??)

Следующее по крайней мере даст мне код выхода 255, если команда не существует, хотя она появляетсябыть немного хакером, так как он напечатает Can't spawn "cmd.exe": No such file or directory at ... в STDERR.

my $command="tool.exe"; # or 'C:\fullpath\tool.exe'
my @args = ($command, '...');
my $err = system {$command} @args;
# die("tool not found!") if $err == -1; # never used!
my $errno = $err>>8;
die("tool not found!") if $errno == 255;
print "Command executed with error code: $errno\n";

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

Лучше всего будет использовать File::Which

use File::Which;
my $exe_path = which('tool.exe');
print "tool.exe not in path" unless $exe_path;
1 голос
/ 22 июля 2011

Почему вы не используете проверку существования файла perl?

if( -e $file_path)  
{  
  #invoke the command  
}  
...