SVN Pre-Commit Hook в Perl в Windows

Я писал Perl-скрипт для предварительной проверки SVN на компьютере с Windows и использую VisualSVN Server.

Вот код:

pre-commit.bat

C:\Perl\bin\perl.exe D:\Repositories\iCP\hooks\pre-commit.pl %1 %2
exit %ERRORLEVEL%

pre-commit.pl

#!/usr/bin/perl

use strict;
use warnings;

my $repos = $ARGV[0];
my $txn = $ARGV[1];

my $svnlook = "D:\\svnlook.exe";
my $hooks = "D:\\Repositories\\iCP\\hooks";

if(system("$svnlook log -t $txn $repos >$hooks\\res.txt"))
{
  die "Unable to finish system(): $!\n";
}

....

По сути, я хочу, чтобы результат «журнала svnlook» был перенаправлен на res.txt, тогда я смогу читать из этого файла.

Но когда я делаю фиксацию из TortoiseSVN, сценарий perl умирает с сообщением «Невозможно завершить System(): несоответствующая операция управления вводом-выводом», я не знаю, что пошло не так.

Заранее благодарны за Вашу помощь.


person foolhunger    schedule 27.01.2013    source источник
comment
Это работает, если вы опускаете перенаправление вывода (>$hooks...)?   -  person harpun    schedule 27.01.2013
comment
@harpun, когда я пропускаю перенаправление, оно все равно не работает. Думаю проблема с системной командой, может с разрешением, не уверен.   -  person foolhunger    schedule 27.01.2013


Ответы (1)


Скорее всего, это проблема qoute. Perl использует \ как escape-последовательность, поэтому, когда вы включаете переменную с двойной \, она будет преобразована в простую \.

Попробуй это:

my $svnlook = "D:\\\\svnlook.exe";
my $hooks = "D:\\\\Repositories\\\\iCP\\\\hooks";

if(system("$svnlook log -t $txn $repos >$hooks\\res.txt"))
{
  die "Unable to finish system(): $!\n";
}
person user1126070    schedule 28.01.2013
comment
Или используйте ' вместо " для $svnlook и $hooks, потому что они не будут экранироваться. - person simbabque; 28.01.2013