windows 如何在批处理脚本中连接两个文件路径,而不会出现尾随的“\”歧义?

np8igboo  于 2023-05-19  发布在  Windows
关注(0)|答案(3)|浏览(293)

对于下面的代码,我从props文件中获取LIBDIR。

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

Call :UnZipFile %strDestPath% %strPythonZipSourcePath%

如果props文件中的LIBDIR为'D:\WinLibraryes',那么我最终得到的 strDestPath

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

然后UnZipFile尝试访问该位置时失败。
props文件的LIBDIR可以带或不带结尾''。
我如何连接这些路径以获得像下面这样的正确路径?

D:\WinLibraryes\Libraries\python\win\
gxwragnw

gxwragnw1#

我想你可以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%"
b4wnujal

b4wnujal2#

我将把您的 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后添加\,否则条件不添加。

pprl5pva

pprl5pva3#

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

@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_%

相关问题