中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]FOR语句读取文件所在路径带有空格问题
作者:
标题: [讨论]FOR语句读取文件所在路径带有空格问题 上一主题 | 下一主题
tom
新手上路





积分 2
发帖 2
注册 2009-10-17
状态 离线
『楼 主』:  [讨论]FOR语句读取文件所在路径带有空格问题

我想做的这个批处理,是想要读取某个通过提示输入的路径,并查找该文件夹下的 test.txt 文件,如果存在该文件就读取每一行的内容(除了含有“I will delete this line”字符的那一行),并将读取到的内容写入temp.txt,最后通过 move 的方式覆盖原文件。本来没有空格的路径工作很正常,但是只要带有空格,就出问题:

1. 不加双引号的话就就无法指定带空格的路径
2. 如果变量加双引号,For 语句读取的路径居然会多一个半边引号,这一点我是感到莫名其妙。比如说一个路径为 D:\Hello World 的文件夹,如果加双引号的话,系统就会返回错误提示:系统找不到文件 D:\Hello World"\test.txt ——多了半边引号。

小弟刚接触批处理,还请高手指导一下,代码如下:
@echo off
:enterpath
cls
echo 请输入文件夹路径
set p=
set /p p="如果是当前文件夹请按回车键:"
if "%p%" == "" set p=%cd%
call:confirm "%p%"

:confirm
if not exist "%p%"\test.txt echo Test.txt文件不存在,请确认! & pause & goto enterpath
echo 您要修改的文件所在的路径是:%~f1
echo.
set c=
set /p c="确认请按[Enter]继续,重设请按任意键:"
if "%c%" == "" set p=%~f1
if not "%c%" == "" goto enterpath
if exist "%p%"\test goto modify

:modify
for /f "usebackq" %%i in ("%p%"\test.txt) do (
  ::上面这一行的变量 p 如果去掉双引号能正常运作,但不支持带空格文件夹
  echo %%i | findstr /i "I will delete this line"
  if errorlevel 1 echo %%i >> "%p%\temp.txt")
move /y "%p%"\temp.txt "%p%\test.txt"
pause
exit
这个批处理还有个缺点就是会删除空行,还不知道怎么弄,批处理的知识我还要再多家了解才行。

[ Last edited by tom on 2009-10-18 at 13:52 ]

2009-10-18 13:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
newxso
初级用户

l i u s s


积分 73
发帖 101
注册 2008-9-17
来自 GZ
状态 离线
『第 2 楼』:  

"%p%"\test.txt  ----> "%p%\test.txt"

2009-10-18 16:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
mwm5
初级用户





积分 40
发帖 23
注册 2009-10-15
状态 离线
『第 3 楼』:  

顶楼上的~~呵呵

2009-10-18 16:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tom
新手上路





积分 2
发帖 2
注册 2009-10-17
状态 离线
『第 4 楼』:  

这我可真的纳闷了!

谢谢两位兄弟指正。用引号括主整个文件的地址这个方法我也试过了,这也是我陷入了这个怪题的一部分原因。

下午出去逛了一圈,回来看到解答一开始觉得不可能啊,我用这个方法怎么就不行。于时我试了一下这个简单版的 test.bat,没错,怎么这个批处理就没问题?

如果是这样,那就是跟我所要修改的文件有关系了。我要修改的是系统隐藏文件 desktop.ini,其实我取消了该文件的系统属性和隐藏属性结果也一样,For语句在读取这个文件时,好像是直接略过了一样,它根本就没有读取desktop.ini这个文件的每一行!

For怎么会这样?加个双引号,它就不读了(而且必须是系统隐藏文件),不加双引号它就能读,这么怪?不信你们试试看(随便临时建立一个desktop.ini文件)。

[ Last edited by tom on 2009-10-18 at 19:47 ]

2009-10-18 19:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: