首页 > 解决方案 > 批处理文件(cmd):删除目录名称中的最后一个“\”

问题描述

我写了一些 .bat 文件。在它们中,我需要获取当前目录而没有剩余的“\”。我使用这种脚本:

@ECHO OFF
SET ROOT_DIR=%~dp0
@ECHO ROOT_DIR IS "%ROOT_DIR%"
REM Remove last "\"
if "%ROOT_DIR:~-1%" == "\" (
  SET ROOT_DIR=%ROOT_DIR:~0,-1%
)
@ECHO ADAPTED ROOT_DIR IS "%ROOT_DIR%"
PAUSE

它通常有效。例如,如果我将这样的文件放在 D:\test 中,结果是:

ROOT_DIR IS "D:\test\"
ADAPTED ROOT_DIR IS "D:\test"
Appuyez sur une touche pour continuer...

但是,由于某种我不明白的原因,当文件夹名称以“)”结尾时会出现问题,例如“C:\ Program Files(x86)”。在该文件夹中,它也删除了最后一个“)”,这是我不想要的行为:

ROOT_DIR IS "C:\Program Files (x86)\"
ADAPTED ROOT_DIR IS "C:\Program Files (x86"
Appuyez sur une touche pour continuer...

有没有人知道如何解决这个问题,即只删除文件夹名称中的最后一个“\”,无论文件夹名称是什么,而不删除括号?

预先感谢您的回答。

标签: batch-file

解决方案


@Mofi 有正确的答案:我应该在 SET ROOT_DIR 指令周围使用引号。这样,括号被保留(没有解释)。我在各种文件夹上进行了测试,它确实有效。所以非常感谢@Mofi 的解决方案。

感谢@phuclv 关于“DOS 批处理文件”,我会记住这一点(我更新了标题)。

- 编辑 -

所以正确的代码变成

@ECHO OFF
SET "ROOT_DIR=%~dp0"
@ECHO ROOT_DIR IS "%ROOT_DIR%"
REM Remove last "\"
if "%ROOT_DIR:~-1%" == "\" (
  SET "ROOT_DIR=%ROOT_DIR:~0,-1%"
)
@ECHO ADAPTED ROOT_DIR IS "%ROOT_DIR%"
PAUSE

这种代码是使用递归算法的基础,该算法将通过添加“\”然后子目录名称进入子目录(子子目录等),并在任何所需的深度执行此操作。因此,就我而言,即使父目录直接是驱动器号本身,它也很有用。


推荐阅读