在基于Windows的SVN安装中(使用CollabNet Subversion Edge),我有一个post-commit的挂钩文件,在这里我构build了一个存储库文件夹名,我需要用指向该文件夹的file:
URL调用svnsync
。
现在的问题是:如何将Windows文件夹或文件名转换为file:
URL,以便该URL至less可以被SVN命令行工具接受?
在批处理文件中,如果变量FILE_OR_FOLDER_NAME
包含(绝对或相对,本地或UNC,有或没有空格,现有或不存在的)Windows文件或目录名称,则以下命令将相应的file:
URL放入变量FILE_URL
:
for /f "delims=" %%R in ("%FILE_OR_FOLDER_NAME%") do set FILE_URL=%%~fR% set FILE_URL=file:///%FILE_URL% set FILE_URL=%FILE_URL:///\\=//% set FILE_URL=%FILE_URL:\=/%
第1行将相对文件名扩展为绝对的文件名; 第2行prepends file:///
; 第3行处理UNC路径的特殊情况; 第4行确保我们只使用正斜杠。
综合起来,这些将\\remotehost\share\folder
为file://remotehost/share/folder
和d:\folder
到file:///d:/folder
。
至于我的测试,上述命令总是导致一个file:
URL是可以接受的SVN命令行,也可能还用于其他用途。
唯一不正确的是空格和其他特殊字符(例如#
在结果file:
中没有被正确的URL编码file:
URL: D:/my test#repo
成为file:///D:/my test#repo
,这在技术上是不正确的。 不过,在我的具体使用情况下,这不构成问题,因为SVN命令行解析器无论如何都会找到存储库。