如何将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/..."
开头的路径之前。
在基于 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/..."
开头的路径之前。