svn预锁定钩子处理带有&符号的缺陷和窗口中文件名中的空格

时间:2010-12-15 09:28:09

标签: svn escaping quotes cmd ampersand

我正在尝试在Windows上创建一个subversion预锁定钩子。但是我在文件名中的&符号存在严重问题:

如果路径包含空格,似乎svn会在我的批处理文件调用中将双引号(“)放在我要锁定的文件周围。但是如果我的文件名包含&符号(&)而没有空格那里没有双引号,窗口认为这是第二次调用,我的脚本没有得到正确的文件名。

正如你在logfile中看到的那样,我无法正确处理&符号,因为windows command.com正在解释与非转义相同的转义引号:

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

将始终失败,“'two'未被识别为内部或外部命令, 可操作的程序或批处理文件。“

这是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 个答案:

答案 0 :(得分:1)

首先,这有点(希望)与command.com无关,因为cmd.exe正在执行批处理文件。

然而,是的,shell引用的方式不同。它不是Unix shell,也不必遵守惯例。

我不知道,为什么你需要两个级别的引号。在带有空格和符号的参数周围添加单个引号,以将其作为一个参数发送到另一个程序:

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

由于您只是将参数传递给批处理,因此无需在其中添加更多引号。批处理参数保留引号。另一种方式是:

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

明确地删除引号然后再添加它们。

(老实说,虽然,我不知道如何将引号包围的参数传递给另一个程序,以便程序看到"foo"而不是foo。但我很确定这不是在这种情况下不是问题。)

无论如何,批处理文件中也存在一些错误和奇怪之处:<​​/ p>

  1. 尝试使用反斜杠代替正斜杠。 cmd使用斜杠作为命令选项,因此内置命令很少看到它们。 Windows API将很乐意接受斜杠代替反斜杠。不过,shell并不是那么开心。
  2. 最后两行正在使用nohing。我想你想要

    exit /b %errorlevel%