Системный вызов perl не распознает пути

Я пытаюсь выполнить системную команду из программы Perl.

Он работает нормально, если я не укажу путь, когда он говорит: «Система не может найти указанный путь».

Я получаю те же результаты с exec (), system () или обратными кавычками.

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

Если я скопирую нерабочую команду из сценария perl и вставлю ее в поле DOS, она будет работать, и наоборот.

Например,

print `cd`;

работает нормально, но

print `cd \`;

и

print `cd ..`;

дайте мне такое же сообщение об ошибке.

$cmd = 'foo.htm'; $ret=`$cmd`

запускает браузер, но

$cmd = '\foo.htm'; $ret=`$cmd`;

не.

Есть ли у кого-нибудь предложения относительно того, в чем может быть проблема?


person user1533198    schedule 17.07.2012    source источник


Ответы (1)


Было бы полезно, если бы вы дали нам свою системную команду и то, что вы получаете. Сложно сказать, в чем ваша ошибка. Тем не менее, я угадаю ...

Если вы работаете в Windows и выполняете \, вы должны понимать, что символ обратной косой черты - это специальный символ цитирования на Perl. Чтобы использовать настоящую обратную косую черту, вам нужно увеличить ее вдвое:

 system ("C:\\Program Files (x86)"\\Microsoft Office\\Word.exe");

Или, что еще лучше, используйте модуль File :: Spec, который поставляется с Perl. Это гарантирует, что вы создадите правильную структуру пути:

use File::Spec::Functions;

my $executable = catfile("C:", "Program Files (X86)",
      "Microsoft Office", "Word.exe");
system ($executable);

Конечно, вы должны попытаться захватить вывод команды system, чтобы увидеть, есть ли ошибка:

my $error = system($executable);
if ($error) {
      if ($? == -1) {
          print "Program failed to execute\n";
      }
      else {
          my $signal = ($? & 127);
          my $exit_code = ($? >> 8);
          print "Error: Signal = $signal  Exit Code = $exit_code\n";
      }
}
person David W.    schedule 18.07.2012