svn pre-lock hook ошибка обработки с амперсандом и пробелами в имени файла на окнах - PullRequest
0 голосов
/ 15 декабря 2010

Я пытаюсь создать ловушку предварительной блокировки Subversion для Windows.Однако у меня серьезные проблемы с амперсандом в именах файлов:

Кажется, svn поместит двойные кавычки (") вокруг моего файла, который нужно заблокировать, при моем вызове моего пакетного файла, если путь содержит пробелы. ОднакоЕсли мое имя файла содержит амперсанд (&) и пробелы отсутствуют, двойные кавычки отсутствуют, и окна считают, что это второй вызов, а мой сценарий не получает правильное имя файла.

Как вы можете видеть в файле журнала, я не могу обработатьАмперсанд правильно, потому что windows command.com интерпретирует экранированные кавычки так же, как не экранированные:

>perl pre-lock.pl repo \""one & two"\" name

всегда будет с ошибкой, «два» не распознается как внутренняя или внешняя команда, работающая программа или пакетфайл. "

Это ошибка в command.com?

Для справки и самостоятельной попытки, вот мои файлы:

@echo off
echo %1 %2 %3 >> c:\hooktest.txt
set SCRIPTS=c:/scripts
SET PERL=C:/Perl/bin/perl.exe
%PERL% -w -I%SCRIPTS% "%SCRIPTS%/pre-lock.pl" \"%1\" \"%2\" \"%\3\"
set err=%errorlevel%
exit %err% 

небольшой отладочный Perl-скрипт:

use Data::Dumper;
 print STDERR "This are the arguments:\n";
 print STDERR Dumper(@ARGV);
 exit 1;

В моем журнале Hook регистрируется следующее:

c:\repo /test/file_nospace.txt pparker 
c:\repo "/test/file with space" pparker 
c:\repo "/test/file with & ampersand.txt" pparker 
c:\repo /test/file_with_&_ampersand.txt pparker 

1 Ответ

1 голос
/ 18 декабря 2010

Прежде всего, это (надеюсь) не имеет ничего общего с command.com, поскольку cmd.exe выполняет командные файлы.

Тем не менее, да, оболочка цитирует по-разному.Это не оболочка Unix, и здесь не нужно придерживаться соглашений.

Интересно, зачем вам там два уровня кавычек?Помещение одного аргумента в кавычки вокруг аргумента с пробелами и амперсандом достаточно для отправки его в качестве одного аргумента в другую программу:

%PERL% -w -I%SCRIPTS% "%SCRIPTS"\pre-lock.pl" %1 %2 %3

Поскольку вы просто передаете аргументы пакету, нет необходимости ставитьбольше цитат там.Пакетные аргументы сохраняют кавычки.Другой способ был бы:

%PERL% -w -I%SCRIPTS% "%SCRIPTS"\pre-lock.pl" "%~1" "%~2" "%~3"

, который явно удаляет кавычки и затем добавляет их снова.

(Честно говоря, я не знаю, как передать аргумент, окруженный кавычками, другомузапрограммируйте так, чтобы программа видела "foo", а не foo. Но я вполне уверен, что это не проблема в этом случае.)

В любом случае, есть несколько ошибок и странностейа также в вашем пакетном файле:

  1. Попробуйте использовать привычку использовать обратную косую черту вместо прямой косой черты.cmd использует косую черту для параметров команды, и поэтому встроенные команды редко бывают рады их видеть.Windows API с радостью примет косую черту вместо обратной косой черты.Оболочка не очень-то рада этому.
  2. Последние две строчки делают ничто полезное.Я думаю, вы хотели

    exit /b %errorlevel%
    
...