中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 菜鸟看,带空格问题请看这里!
作者:
标题: 菜鸟看,带空格问题请看这里! 上一主题 | 下一主题
15935643331
初级用户





积分 42
发帖 37
注册 2008-12-5
状态 离线
『楼 主』:  菜鸟看,带空格问题请看这里!

来DOS联盟论坛时间不长,进步非常快,学到不少东西。
搜索让人进步很快,发问之前最好在论坛搜索相关主题,当然象我一样经常不知道搜索什么关键字的就不好办了,发帖求助吧,哈哈!
看到时不时有许多像我一样的新手发帖求助“带(含)空格”的问题,特意搜索整理一下相关主题。

1.双引号""
(1)普通带空格路径
Examples:
@echo off
C:\Program Files\WinRAR\WinRAR.exe
exit

错误提示:
'C:\Program' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

解决办法:
@echo off
"C:\Program Files\WinRAR\WinRAR.exe"
exit

(示例中的C:\Program Files也可以用环境变量%ProgramFiles%或者短名C:\Progra~1代替)

(2)设置变量获取带空格路径
Examples:
@echo off
for /r %%a in ("*.txt") do (
  set str=%%a
)

错误提示:
其中%%a无法正确获取*.txt中含有空格文件名的值

解决办法:
@echo off
for /r %%a in ("*.txt") do (
  set "str=%%a"
)
Examples:
@echo off
for /f "tokens=*" %%a in ('dir /a /b /s d:\test') do (
  rd /s /q %%a
  del /q /f %%a
)

错误提示:
无法删除带空格文件及文件夹

解决办法:
@echo off
for /f "tokens=*" %%a in ('dir /a /b /s d:\test') do (
  rd /s /q "%%a"
  del /q /f "%%a"
)

2.start的问题
Examples:
@echo off
start "C:\Program Files\WinRAR\WinRAR.exe"
exit

错误提示:
你会发现批处理不是运行指定程序,而是调了另外一个CMD出来,郁闷!

解决办法:
@echo off
start "" "C:\Program Files\WinRAR\WinRAR.exe"
exit

(至于为什么,start/?得到相关信息。START ["title"] [/Dpath]

"title"在窗口标题栏中显示的标题。路径带引号,因此title设置为空. )

3.FOR语句中带空格路径的问题
Examples:
FOR /F %%i IN ('DIR "C:\program files\WinRAR\*.rar" /s/b')

错误提示:
%%i 只能获取 c:\program

解决办法:使用扩展参数usebackq后给路径加双引号就行了
FOR /F "usebackq delims=" %%i IN (`DIR "C:\program files\WinRAR\*.rar" /s/b`)

4.findstr查找带空格字符串的问题
Examples:
set drive=d:
for /f "delims=" %%i in ('dir /b %drive%^|findstr /e " "') do (rd "%drive%\%%i\")
错误提示:
findstr命令语法不正确
解决办法:
findstr /e /c:" "'

[ Last edited by 15935643331 on 2008-12-17 at 03:47 ]

   此帖被 +5 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2008-12-17 10:09
评分人:【 moniuming 分数: +3  时间:2008-12-17 14:15


2008-12-17 03:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 2 楼』:  

有两个地方我觉得解释有误。

1、

  Quote:
(2)设置变量获取带空格路径
Examples:
@echo off
for /r %%a in ("*.txt") do (
  set str=%%a
)

错误提示:
其中%%a无法正确获取*.txt中含有空格文件名的值

解决办法:
@echo off
for /r %%a in ("*.txt") do (
  set "str=%%a"
)

不会出现错误吧?用 set 设置变量,我知道有两点好处:

① 防止不小心修改了代码。如清空变量:

    set "str="

② 如果要设置变量 str 的值为 a,并用连接符(&)再执行一个命令,以下是错误的:

    set str=a & goto next

这样设置的 str 的值为“a ”(后面还有一个空格)。加上双引号就没事了:

    set "str=a" & goto next

或者紧凑一点:

    set str=a&goto next

这样不是很好看。

2、

  Quote:
3.FOR语句中带空格路径的问题
Examples:
FOR /F %%i IN ('DIR "C:\program files\WinRAR\*.rar" /s/b')

错误提示:
%%i 只能获取 c:\program

解决办法:使用扩展参数usebackq后给路径加双引号就行了
FOR /F "usebackq delims=" %%i IN (`DIR "C:\program files\WinRAR\*.rar" /s/b`)

避免了错误的原因并不是 usebackq 吧,而是 "delims="。

usebackq 的三个用法:

① 字符串
    for /f "usebackq" %a in ('a b') do @echo %a

② 带空格路径
    for /f "usebackq" %a in ("C:\a b.txt") do @echo %a


③ 命令
    for /f "usebackq" %a in (`path`) do @echo %a

2008-12-17 09:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 3 楼』:  

Q: 为方便他人复制,如何给代码加code标签?
A: http://www.cn-dos.net/forum/viewthread.php?tid=43735#pid304733
参考:http://www.cn-dos.net/forum/faq.php?page=misc#1




2008-12-17 10:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
evilnight
新手上路





积分 4
发帖 3
注册 2008-12-10
状态 离线
『第 4 楼』:  

原来如此,我还以为usebackq这个什么用呢,学习了

2008-12-17 11:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
15935643331
初级用户





积分 42
发帖 37
注册 2008-12-5
状态 离线
『第 5 楼』:  

恩。我体会的也不是很深,只是在本坛搜索总结的,慢慢体会吧

2008-12-17 13:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: