Недостаток обработки хука предварительной блокировки svn с амперсандом и пробелами в имени файла в Windows

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

Кажется, что 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 

person Peter Parker    schedule 15.12.2010    source источник


Ответы (1)


Прежде всего, это не имеет (надеюсь) ничего общего с 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%
    
person Joey    schedule 18.12.2010
comment
Привет, Джоуи, точный ответ, который я ищу, % ~ 2 сделает эту работу! Партия была написана не мной .. Я только столкнулся со странным поведением - person Peter Parker; 18.12.2010