Board logo

标题: [文本处理] 批处理被困扰的路径中的特殊字符 [打印本页]

作者: lixiaoxiao    时间: 2022-2-23 21:57     标题: 批处理被困扰的路径中的特殊字符

大佬们好!我在使用批处理获取用户传给的路径时,有的路径带 () & 还有的是 空格 加了双引号,有的没有加,让我很是无奈,有什么方法处理吗?

就比如
  1. :start
  2. set /p path=请输入路径:
  3. if "%a%" =="" echo 路径为空,请重新输入 && goto start
复制代码
此时如果给定的路径是 带 双引号的,这里的判断就报错了

不过我倒是想着 使用 for %%~i 先把 双引号去除,在全程使用 path 变量时在前后加 双引号

但对于上述的 特殊符号怎么处理?是否还有其他需要注意的特殊符号呢?

因我之前是使用python的,对 bat 的语法总是不能适应,就像上面那个 if 判断, 变量内的双引号咋就影响到 if 判断呢?不知该怎么理解呢?
作者: Echo11    时间: 2022-2-24 11:07

本帖最后由 Echo11 于 2022-2-24 11:14 编辑
不过我倒是想着 使用 for %%~i 先把 双引号去除,在全程使用 path 变量时在前后加 双引号

就你说的这么做不就好了么?
1、如果你是从 命令行 传参进来的
  1. if "%~1"=="" echo 路径为空...pause>nul&exit
  2. ECHO.路径为:"%~1"
复制代码
我一般存储路径变量的时候不带""号,等实际使用时一律加"",避免有空格。

2、如果是用Set /P获得路径
  1. @ECHO off
  2. :start
  3. set "mypath="
  4. set /p mypath=请输入路径:
  5. set mypath=%mypath:"=%
  6. set mypath=%mypath:"=%
  7. REM 注意:以上替换就是要两遍,不要以为是多写了一行
  8. if "%mypath%"=="=" ECHO.路径为空,请重新输入 & goto :start
  9. ECHO.输入的路径为:%mypath%
  10. pause>nul
  11. EXIT
复制代码
我试验了这些数据都正常
  1. 正常输入
  2. C:\dir\my book\book1
  3. "C:\dir\my book\book1"
  4. 错误输入
  5. "C:\dir\my book\book1
  6. C:\dir\my book\book1"
  7. (直接敲回车)
复制代码

作者: 路过    时间: 2022-2-24 11:33

批处理的预处理机制作怪,开变量延迟解决
  1. setlocal enabledelayedexpansion
  2. :start
  3. set /p a=请输入路径:
  4. if "!a!" =="" echo 路径为空,请重新输入 && goto start
复制代码

作者: lixiaoxiao    时间: 2022-2-25 13:56

我测试 如果路径中包含 & 号,还是不能正常
作者: qixiaobin0715    时间: 2022-2-25 14:04

如何不正常?
作者: lixiaoxiao    时间: 2022-2-25 14:16

好吧,我测试出来了,echo 的时候 需要把 path 变量前后加上双引号 才能正常输出

是否可以总结为,得到一个路径时,第一,先把前后的 " 去除了。
之后使用时,在路径变量 前后加上 “ ,这样其他的 特殊字符也都正常了?
作者: qixiaobin0715    时间: 2022-2-25 14:34

我测试情况如下,没有问题啊:
  1. C:\Users\Administrator\Desktop\test1>type test.bat
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. :start
  5. set /p a=请输入路径:
  6. if "!a!" =="" echo 路径为空,请重新输入 && goto start
  7. echo,!a!
  8. pause>nul
  9. C:\Users\Administrator\Desktop\test1>test.bat
  10. 请输入路径:"C:\dir\my& book\book1"
  11. "C:\dir\my& book\book1"
  12. C:\Users\Administrator\Desktop\test1>
复制代码

作者: lixiaoxiao    时间: 2022-2-25 14:50

好吧,我没有使用 延时变量,因为我从 文档里获取内容时,会导致 ! 丢失,不清楚是否还有其它副作用。主要也是我初学批处理,水平太菜,不清楚到底都有那些特殊情况需要注意
作者: lixiaoxiao    时间: 2022-2-25 21:05

我又遇到一个问题,我想让批处理支持 拖放,但如果路径包含特殊字符,仍然不行啊,比如 路径带有 &
当 echo "%1" 就能看到在 & 处被截断了
作者: lixiaoxiao    时间: 2022-2-25 21:06

但是如果直接通过 set /p mypath=balabalabala  就能正常




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2