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

Posted

技术标签:

【中文标题】如何将 Windows 路径转换为文件:URL,在批处理文件中,适合 SVN 命令行使用【英文标题】:How to convert Windows path to file: URL, in a batch file, suitable for SVN command line use 【发布时间】:2015-03-05 05:44:55 【问题描述】:

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

现在的问题是:如何将 Windows 文件夹或文件名转换为 file: URL,以使该 URL 至少可以为 SVN 命令行工具所接受?

【问题讨论】:

【参考方案1】:

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

创建一个批处理文件,比如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 命令无法处理相对路径。为了解决这个问题,如果适用,我们可以添加一个将相对路径转换为绝对路径的命令,例如 the aforementioned other answer 中的第一行,但缺点是 "%%~fR%" 不能像宣传的那样工作以确保完全合格路径:它将%CD% 添加到以"//server/..." 开头的路径。

【讨论】:

【参考方案2】:

在批处理文件中,如果变量FILE_OR_FOLDER_NAME包含(绝对或相对,本地或UNC,带或不带空格,现有或不存在)Windows文件或目录名,则以下命令将对应的@987654322变量FILE_URL中的@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 命令行来说是可以接受的,并且可能也可以用于其他用途。

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

【讨论】:

以上是关于如何将 Windows 路径转换为文件:URL,在批处理文件中,适合 SVN 命令行使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将本地路径设置为媒体引擎 URL?

如何将url转换为文件名?

将文件路径转换为文件 url[NSUrl]

将Windows磁盘路径转换为注册表文件中的Uri路径

如何将 msys shell 脚本转换为 windows exe 文件

如何在批处理文件中将 DOS 路径转换为文件方案 URI