如何在批处理脚本中连接两个文件路径而不用尾随' \'歧义?

时间:2018-01-15 10:13:26

标签: windows batch-file path concatenation

对于以下代码,我从道具文件中获取LIBDIR。

set strDestPath=%LIBDIR%"\Libraries\python\win\"
set strPythonZipSourcePath=%CTEDIR%"\Libraries\python\win\Python27.zip"

Call :UnZipFile %strDestPath% %strPythonZipSourcePath%

如果道具文件的LIBDIR为“D:\ WinLibraryes”,那么我最终将 strDestPath 作为

D:\WinLibraryes\\Libraries\python\win\
/*With double slash in the path*/

然后UnZipFile无法尝试访问该位置。

道具文件可能有LIBDIR,有或没有尾随'。

如何连接这些路径以获得如下所示的正确路径?

D:\WinLibraryes\Libraries\python\win\

3 个答案:

答案 0 :(得分:0)

我将模仿你的 LIBDIR 作为 TMPLIBDIR 进行演示。 我们测试TMPLIBDIR的最后一个字符,看看它是否是\。我们不是从TMPLIBDIR中删除任何东西,而是决定我们之后是否放置第一个\。要查看不同的结果,请在脚本中\之后添加Path

@echo off
setlocal enabledelayedexpansion
set "TMPLIBDIR=D:\WinLibraryes"
    if not "!TMPLIBDIR:~-1!"=="\" (
        set "strDestPath=%TMPLIBDIR%\Libraries\python\win\"
        ) else (
        set "strDestPath=%TMPLIBDIR%Libraries\python\win\"
 )

第一个条件在TMPLIBDIR之后添加\,否则条件不添加。{/ p>

答案 1 :(得分:0)

我想你可以Set新变量,同时检查来自props文件的那些是否存在。 (毕竟如果它们不存在,脚本也可能不运行)

SetLocal EnableExtensions
PushD "%CD%"
CD /D "%LIBDIR%" 2>Nul || Exit /B
If Not Exist "%CD%\Libraries\python\win\" Exit /B
Set "strDestPath=%CD%\Libraries\python\win"
CD /D "%CTEDIR%" 2>Nul || Exit /B
If Not Exist "%CD%\Libraries\python\win\Python27.zip" Exit /B
Set "strPythonZipSourcePath=%CD%\Libraries\python\win\Python27.zip"
PopD

Call :UnZipFile "%strDestPath%" "%strPythonZipSourcePath%"

答案 2 :(得分:0)

我使用一个方便的子程序来构建路径:

@setlocal ENABLEEXTENSIONS
@set prompt=$G

set _var1=\Dir1\\\\Dir2\
set _var2=\Dir3\Dir4
set _var3=Relative\\\\Path
set _var4="QuotedPath\\\\Path%"

call :SetFQDP _var5 %_var1%\%_var2%
set _var5

call :SetFQDP _var5 %_var3%
set _var5

call :SetFQDP _var5 %_var4%
set _var5

@exit /b 0

@rem Set specified variable to a fully qualified drive\path name with no
@rem redundant backslashes. Convert all forward slashes to backslashes.
@rem Removes quotes.
:SetFQDP
@set %1=%~f2
@exit /b %_ERROR_SUCCESS_%

产地:

> test

>set _var1=\Dir1\\\\Dir2\

>set _var2=\Dir3\Dir4

>set _var3=Relative\\\\Path

>set _var4="QuotedPath\\\\Path"

>call :SetFQDP _var5 \Dir1\\\\Dir2\\\Dir3\Dir4

>set _var5
_var5=D:\Dir1\Dir2\Dir3\Dir4

>call :SetFQDP _var5 Relative\\\\Path

>set _var5
_var5=D:\TMP\Joseph\Relative\Path

>call :SetFQDP _var5 "QuotedPath\\\\Path"

>set _var5
_var5=D:\TMP\Joseph\QuotedPath\Path

请注意,如果未提供驱动器号,则使用当前驱动器。如果传入最后的尾部斜杠,则会保留它。当前目录的完全限定路径始终以任何相对路径为前缀(不以' /'或' \'开头)。生成的路径不一定存在,因此您必须创建它或测试它的存在。

一起为你拉扯:

@call :SetFQDP strDestPath=%LIBDIR%"\Libraries\python\win\"
@call :SetFQDP strPythonZipSourcePath=%CTEDIR%"\Libraries\python\win\Python27.zip

Call :UnZipFile %strDestPath% %strPythonZipSourcePath%
exit /b

@rem Set specified variable to a fully qualified drive\path name with no
@rem redundant backslashes. Convert all forward slashes to backslashes.
@rem Removes quotes.
:SetFQDP
@set %1=%~f2
@exit /b %_ERROR_SUCCESS_%