标题: [文本处理] [已解决]批处理遇到带特殊符号的路径时遇到困难了 [打印本页]
作者: yiyu585 时间: 2020-10-4 12:54 标题: [已解决]批处理遇到带特殊符号的路径时遇到困难了
问题求教:
我使用promo ramdisk 创立了ramdisk内存盘转移了users文件,使用中新程序会在appdate文件夹中创立程序配置文件,固有转移配置文件夹并创立目录链接的需求。
自己捣鼓了个发送到的批处理,由于采用了for循环语句,在处理带有特殊符号如(),等符号时,批处理无法运行。代码已在管理员的帮助下更正,万分感谢!
更正:
1、1%--》~1%以去掉多余双引号
2、等式用双引号引来,如"patht=O:\Users\文档\AppData\%DirName%\%name%"
批处理如下所示:- @echo off&setlocal enabledelayedexpansion
- set patha=%~1
- for /f %%a in ("%patha%") do (
- set "pathb=%%~dpa")
- for %%a in ("%pathb:~,-1%") do set DirName=%%~nxa
- if "%DirName%"=="" set DirName=0\%patha:~,1%
- for %%a in ("%patha%") do set name=%%~nxa
- set "patht=O:\Users\文档\AppData\%DirName%\%name%"
- set "patht1=O:\Users\文档\AppData\%DirName%\"
- md "O:\Users\文档\AppData\%DirName%"
- if not exist "O:\Users\文档\AppData\%DirName%" md "O:\Users\文档\AppData\%DirName%"
- for %%z In ("%patha%") do if "%%~az" geq "d" (echo d|xcopy /s/e/h/y "%patha%\*" "%patht%\"
- rd /s /q "%patha%"
- mklink /j "%patha%" "%patht%") else If "%%~az" geq "-" (echo f|xcopy "%patha%" "%patht1%" /h /y
- del /a /f /s "%patha%"
- 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
请先测试一下这样是否可以成功提取上级目录名:- @echo off
- setlocal enabledelayedexpansion
- set "patha=%~1"
- for /f %%a in ("%patha%") do (
- set "pathb=%%~dpa"
- )
- if "%pathb%" equ "%patha:~,2%\" (
- set "DirName=0"
- ) else (
- for %%a in ("%pathb:~,-1%") do (
- set "DirName=%%~nxa"
- )
- )
- 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
代码已贴,遇到带有特殊符号的上级目录,报错代码为:- for %Z In ("%patha%") Do if "%~aZ" GEq "d" (echo d|xcopy /s/e/h/y "%patha%\*" "%patht%\"
- rd /s /q "%patha%"
- mklink /j "%patha%" "%patht%") else If "%~aZ" GEq "-" (echo f|xcopy "%patha%" "%patht1%" /h /y
- del /a /f /s "%patha%"
- mklink "%patha%" "%patht%")
复制代码
作者: Batcher 时间: 2020-10-5 23:02
回复 11# yiyu585
用2楼方法执行这个代码试试能否解决语法报错的问题:- @echo off
- setlocal enabledelayedexpansion
- set "DirName=(123)"
- set "patha=D:\Test\123).txt"
- for %%a in ("%patha%") do (
- set "name=%%~nxa"
- )
- set "patht=O:\Users\文档\AppData\%DirName%\%name%"
- set "patht1=O:\Users\文档\AppData\%DirName%\"
- for %%z in ("%patha%") do (
- echo %%~az
- if "%%~az" geq "d" (
- echo xcopy /s /e /h /y "%patha%\*" "%patht%\"
- ) else if "%%~az" geq "-" (
- echo xcopy /h /y "%patha%" "%patht1%"
- )
- )
复制代码
作者: yiyu585 时间: 2020-10-6 12:56
回复 12# Batcher
感谢!问题已解决。双引号将整个等式全引起来就没问题了。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |