batch-file - 批处理文件(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...
有没有人知道如何解决这个问题,即只删除文件夹名称中的最后一个“\”,无论文件夹名称是什么,而不删除括号?
预先感谢您的回答。
解决方案
@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
这种代码是使用递归算法的基础,该算法将通过添加“\”然后子目录名称进入子目录(子子目录等),并在任何所需的深度执行此操作。因此,就我而言,即使父目录直接是驱动器号本身,它也很有用。
推荐阅读
- acumatica - 获取 RowPersisted 事件中的修改字段
- ruby-on-rails - 为什么我不断收到此 ActiveRecord::AssociationTypeMismatch 错误?
- javascript - 在 jQuery UI Selectable 中为 div 元素启用 Shift-Multiselect
- python - 导入数学在 PyCharm 或 Spyder 中都不起作用
- c# - 如果列表为空,linq 将返回 null 异常
- android - 无法生成新的签名 apk 密码验证失败
- react-admin - react-admin 中资源路由的自定义路径
- javascript - Odoo javascript更改值
- angular - 无法从 angular 调用的 web api 操作中获取结果
- merge - BigQuery 合并 - 查询大小随 DELETE 子句扩展