如何将Windows路径转换为文件:URL,在批处理文件中,适合SVN命令行使用

How to convert Windows path to file: URL, in a batch file, suitable for SVN command line use

在基于 Windows 的 SVN 安装中(使用 CollabNet Subversion Edge),我有一个提交后挂钩批处理文件,我在其中构建了一个存储库文件夹名称,我需要调用 svnsync file: URL 指向那个 Windows 文件夹。

现在的问题是:如何将 Windows 文件夹或文件名转换为 file: URL,使 URL 位于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 行前置 file:///;第 3 行处理 UNC 路径的特殊情况;第 4 行确保我们只使用正斜杠。

合起来,这些将 \remotehost\share\folder 转换为 file://remotehost/share/folder,将 d:\folder 转换为 file:///d:/folder

就我的测试而言,上述命令总是导致 file: URL SVN 命令行可以接受,也可能用于其他用途。

唯一不正确的地方是空格和其他特殊字符,如 # 没有正确地 URL-encoded 在生成的 file: URL 中: D:/my test#repo 变成 file:///D:/my test#repo,这在技术上是不正确的。但是,在我的特定用例中,这没有问题,因为 SVN 命令行解析器无论如何都会找到存储库。

是一个好的开始,但如前所述,它不处理特殊字符。下面的内容弥补了这个缺点。

创建一个批处理文件,例如 unc2url.bat 内容如下:

powershell -Command "write-host ([System.Uri]""%1"").AbsoluteUri"

然后从 Windows 命令提示符:

> unc2url.bat "\serverX\a long\and tedious\yet unexciting\path to\some Random #64# file.txt"
file://serverx/a%20long/and%20tedious/yet%20unexciting/path%20to/some%20Random%20%2364%23%20file.txt

要将结果放入可在批处理文件的其余部分中使用的变量中,您可以使用 FOR syntax:

SET UNC2URL_CMD=powershell -Command "write-host ([System.Uri]""%CONDA_CHANNEL_PATH%"").AbsoluteUri"
FOR /f "delims=" %%X IN ('%UNC2URL_CMD%') do set "FILE_URL=%%X"

REM Now use it for whatever
ECHO %FILE_URL%

缺点:此 powershell 命令无法处理相对路径。为了解决这个问题,我们可以添加一个将相对路径转换为绝对路径的命令(如果适用),例如 中的第一行,但缺点是 "%%~fR%" 并不像宣传的那样有效确保完全限定的路径:它将 %CD% 添加到以 "//server/..." 开头的路径之前。