如何将 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 命令行使用的主要内容,如果未能解决你的问题,请参考以下文章