我正在尝试在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
答案 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>
最后两行正在使用nohing。我想你想要
exit /b %errorlevel%