Board logo

标题: [文本处理] [已解决]批处理遇到带特殊符号的路径时遇到困难了 [打印本页]

作者: yiyu585    时间: 2020-10-4 12:54     标题: [已解决]批处理遇到带特殊符号的路径时遇到困难了

问题求教:
  我使用promo ramdisk 创立了ramdisk内存盘转移了users文件,使用中新程序会在appdate文件夹中创立程序配置文件,固有转移配置文件夹并创立目录链接的需求。
自己捣鼓了个发送到的批处理,由于采用了for循环语句,在处理带有特殊符号如(),等符号时,批处理无法运行。代码已在管理员的帮助下更正,万分感谢!
更正:
1、1%--》~1%以去掉多余双引号
2、等式用双引号引来,如"patht=O:\Users\文档\AppData\%DirName%\%name%"
批处理如下所示:
  1. @echo off&setlocal enabledelayedexpansion
  2. set patha=%~1
  3. for /f %%a in ("%patha%") do (
  4. set "pathb=%%~dpa")
  5. for %%a in ("%pathb:~,-1%") do set DirName=%%~nxa
  6. if "%DirName%"=="" set DirName=0\%patha:~,1%
  7. for %%a in ("%patha%") do set name=%%~nxa
  8. set "patht=O:\Users\文档\AppData\%DirName%\%name%"
  9. set "patht1=O:\Users\文档\AppData\%DirName%\"
  10. md "O:\Users\文档\AppData\%DirName%"
  11. if not exist "O:\Users\文档\AppData\%DirName%" md "O:\Users\文档\AppData\%DirName%"
  12. for %%z In ("%patha%") do if "%%~az" geq "d" (echo d|xcopy /s/e/h/y "%patha%\*" "%patht%\"
  13. rd /s /q  "%patha%"
  14. mklink /j "%patha%" "%patht%") else If "%%~az" geq "-" (echo f|xcopy "%patha%" "%patht1%"  /h /y
  15. del /a /f /s "%patha%"
  16. mklink "%patha%" "%patht%")
复制代码

作者: Batcher    时间: 2020-10-4 14:35

回复 1# yiyu585


请举例说明一下空格会导致哪行代码出错?

请参考Q-01观察一下在哪一步出错的:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
作者: wujunkai    时间: 2020-10-4 14:58

引号括起来吧,一般这样就可以了
作者: yiyu585    时间: 2020-10-4 17:05

回复 2# Batcher


我这个批处理是希望通过for语句获取程序的配置文件(夹)名,以及目标文件(夹)上级目录名,在O盘appdate文件夹里以上级目录名创建文件夹,然后再复制目标文件(夹)到该文件夹,之后删除原始文件,根据是文件还是文件夹创建目录链接和软链接。
现在遇到空格等特殊符号后会直接退出,退出位置就是在for语句处理地址获取上级文件夹名及目标文件(夹)名的地方。
作者: yiyu585    时间: 2020-10-4 17:06

回复 3# wujunkai


    现在都是扩起来的,还是不行。出错位置是for语句提取上级目录名,目标文件(夹)名的地方
作者: Batcher    时间: 2020-10-4 21:57

回复 4# yiyu585


请先测试一下这样是否可以成功提取上级目录名:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "patha=%~1"
  4. for /f %%a in ("%patha%") do (
  5.     set "pathb=%%~dpa"
  6. )
  7. if "%pathb%" equ "%patha:~,2%\" (
  8.     set "DirName=0"
  9. ) else (
  10.     for %%a in ("%pathb:~,-1%") do (
  11.         set "DirName=%%~nxa"
  12.     )
  13. )
  14. echo,%DirName%
复制代码

作者: yiyu585    时间: 2020-10-5 00:53

回复 6# Batcher


   谢谢,测试没有通过。在论坛翻了下,找到个改名的,凑合也实现了需要的功能,代码贴上帖子了。
作者: Batcher    时间: 2020-10-5 08:25

回复 7# yiyu585


    能解决问题就好。纯属好奇问一下,6楼的代码,你用的什么测试数据得到了什么结果?
作者: yiyu585    时间: 2020-10-5 12:22

本帖最后由 yiyu585 于 2020-10-5 13:15 编辑

回复 8# Batcher


    就是右键发送到闪一下就没了,非根目录,路径无空格也是不行,还怀疑是编码问题,结果转成ANSI一样不行。不过在我自己的bat中修改%1为%~1后,已经能处理上级目录带有空格的文件夹了(上级目录名带空格的与目标文件(夹)处于根目录等同处理,DirName设置为0),感谢!现在将获取的name在拼接时额外加上双引号,成功解决了空格引发的问题,但还是无法处理带(),等特殊符号的路径,当然这种情况很少。
作者: Batcher    时间: 2020-10-5 15:58

回复 9# yiyu585


    把你最新的代码更新到顶楼,然后再次使用2楼的方法查看一下带括号的文件名是哪行代码在报错。
作者: yiyu585    时间: 2020-10-5 18:30

回复 10# Batcher


    代码已贴,遇到带有特殊符号的上级目录,报错代码为:
  1. for %Z In ("%patha%") Do if "%~aZ" GEq "d" (echo d|xcopy /s/e/h/y "%patha%\*" "%patht%\"
  2. rd /s /q  "%patha%"
  3. mklink /j "%patha%" "%patht%") else If "%~aZ" GEq "-" (echo f|xcopy "%patha%" "%patht1%"  /h /y
  4. del /a /f /s "%patha%"
  5. mklink "%patha%" "%patht%")
复制代码

作者: Batcher    时间: 2020-10-5 23:02

回复 11# yiyu585


用2楼方法执行这个代码试试能否解决语法报错的问题:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "DirName=(123)"
  4. set "patha=D:\Test\123).txt"
  5. for %%a in ("%patha%") do (
  6.     set "name=%%~nxa"
  7. )
  8. set "patht=O:\Users\文档\AppData\%DirName%\%name%"
  9. set "patht1=O:\Users\文档\AppData\%DirName%\"
  10. for %%z in ("%patha%") do (
  11.     echo %%~az
  12.     if "%%~az" geq "d" (
  13.         echo xcopy /s /e /h /y "%patha%\*" "%patht%\"
  14.     ) else if "%%~az" geq "-" (
  15.         echo xcopy /h /y "%patha%" "%patht1%"
  16.     )
  17. )
复制代码

作者: yiyu585    时间: 2020-10-6 12:56

回复 12# Batcher


    感谢!问题已解决。双引号将整个等式全引起来就没问题了。




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