0

我正在尝试检查一个包含路径的变量,以查看是否有斜杠,如果有,则将其删除。如果变量值没有被引号包围,我就可以工作,但即使存在引号,我也需要检查尾部斜杠。

我遇到的问题是试图让 If 语句检查双引号,这样我基本上可以检查它是否有双引号,然后检查尾部斜杠。If 语句以“(此时意外”失败。我确定这是一个逃避问题,但我已经尝试了所有我能想到的方法,但无法让它发挥作用。我一直在寻找在网络上几个小时没有运气。

到目前为止,这就是我所拥有的(我省略了没有引号的代码检查,基本上是相同的格式)。另外,如果有更好的方法来实现这一点,我会全力以赴。

set appRoot="C:\test\"

REM grab the last two characters
set lastChar=%appRoot:~-2%

if %lastChar% == \" (
    echo It works!
)
4

2 回答 2

1

这是一种稳健的方法

@echo off
set appRoot="C:\test\"
for %%a in (%approot%) do for %%b in ("%%~a\.") do echo "%%~fb"
pause

如果您可以更改 set 语句中引号的布局,那么这更简单:

@echo off
set "appRoot=C:\test\"
for %%a in ("%approot%\.") do echo "%%~fa"
pause
于 2013-11-12T07:42:49.637 回答
0

一旦该行if %lastChar% == \" (被扩展(变量替换为值),你得到的if \" == \" (是不是一个有效的条件,所以不需要括号。

使用分配给 appRoot 的值,您最好的选择是直接检查不是最后一个而是前一个字符

set "lastChar=%appRoot:~-2,1%"
if %lastChar% == \ 

或者,如果您可以更改 appRoot 的值

set "appRoot=C:\test\"

REM grab the last character
set lastChar=%appRoot:~-1%

if %lastChar% == \ (
    echo It works!
)

编辑以适应评论

由于 OP 无法控制如何将路径分配给变量,因此可能的情况是:形式为 、 或 的变量set var=(如果不存在特殊字符set var="path",我们可以假设最后两个是等效的)。带或不带尾随反斜杠。路径中有或没有空格。并且需要获得正确的路径(好看,存在与否,这将在稍后检查),没有尾随反斜杠和(不是在 OP 问题中,但应该是)以一致的方式有或没有引号。set var=pathset "var=path"

所以,我们走吧

@echo off

    setlocal enableextensions

    set "appRoot=c:\some where\"
    call :cleanToFullPath appRoot 
    echo %appRoot%

    set "appRoot=c:\some where"
    call :cleanToFullPath appRoot
    echo %appRoot%

    set appRoot="c:\some where\"
    call :cleanToFullPath appRoot
    echo %appRoot%

    set appRoot="c:\some where\a\"
    call :cleanToFullPath appRoot
    echo %appRoot%

    set appRoot=c:\some where\in a rare place
    call :cleanToFullPath appRoot
    echo %appRoot%

    set appRoot=""
    call :cleanToFullPath appRoot
    echo %appRoot%

    goto :EOF

:cleanToFullPath variableName
    rem Prepare environment
    setlocal enableextensions enabledelayedexpansion

    rem get variable name
    set "_varName=%~1"

    rem get value of variable
    set "_tmp=!%~1!"

    rem remove quotes from variable value
    set "_tmp=%_tmp:"=%" 

    rem handle empty variables. Default current folder
    if not defined _tmp set "_tmp=."

    rem prepare to process trailing bar if any
    if "%_tmp:~-1%"=="\" set "_tmp=%_tmp%."

    rem resolve to full path
    for %%# in ("%_tmp%") do set "_tmp=%%~f#"

    rem cleanup and update variable
    endlocal & set "%~1=%_tmp%"
    goto :eof
于 2013-11-12T07:03:18.490 回答