[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
原帖由 FOR 于 2010-4-5 22:15 发表
我的xp sp2 无法处理含&符号的文件名
@echo off
echo %*
pause
遇到 c:\a&b 这样的文件夹就只显示 c:\a

  当路径中同时出现空格和&的时候,这段代码能正确执行;当路径中存在&而没有空格的时候,将会出错,把echo语句写成 echo "%*" 也不行。也就是说,cmd窗口在获取拖曳到它上面的文件路径的时候,存在一个bug:当路径中存在&而没有空格的时候,它会把&前后的字符串当做两个参数来传递,而不是只作为一个参数来看待。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  绞尽脑汁写了一段代码,能兼容各种情况,唯有一种特殊情况解决不了:当文件的完整路径中存在&而没有空格的时候,无法正确获取文件路径。这可能是cmd窗口在获取or传递参数时的一个bug,有待各位给出合理的解释,并希望有高人能把它解决掉。

  代码如下:
  1. @echo off
  2. md d:\123 2>nul
  3. set str=%*
  4. set "str=%str:"=%"
  5. set "str= %str%"
  6. call set "str=%%str: %~d1=" "%~d1%%"
  7. for %%i in ("%str%") do (
  8.     move /y "%%~i" d:\123 2>nul||(
  9.         xcopy /e /s /k /o /q /y "%%~i" "d:\123\%%~nxi\" 2>nul&&rd /q /s "%%~i"
  10.     )
  11. )
  12. pause
复制代码
  这段代码最难处理的部分是如何获取文件的完整路径,总体思路是:先用 %* 来接收所有文件的完整路径(只带&而不带空格的不能正确接收),赋予变量str,把str中所有的引号去除,并以盘符作为分隔标志,在盘符前加上适当的引号对,最后,放到for语句中,这样,所有的路径最终会被在首尾加上引号对,从而避免for语句无法正确识别路径中的空格、&、括号等特殊字符的现象。

=============================
以上代码还有一种情况无法正确处理:
当文件路径中含有^符号的时候,^将会被直接丢弃。
                       ——20100411补充
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  1. @echo off
  2. call :loop %*
  3. echo %var%
  4. pause
  5. :loop
  6. set var=%var% "%~1"
  7. if not "%~2"=="" shift&goto loop
  8. goto :eof
复制代码

TOP

  33楼的代码不能兼容路径中存在逗号、分号、等号、有&而没有空格这几种情况,最好还是把所有的路径都放到引号对中来处理。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 34楼 的帖子

不对啊 我测试你的代码,是可以的
文件为a&dir.bat

重复某贴中那个代码
  1. @echo off
  2. :a
  3. if not "%~1"=="" (copy "%~1" "d:\123\" &shift /1 &goto :a)
  4. pause
复制代码
33楼的代码不能允许百分号是真的;

寂寞老大的代码,是复制了以后还是显示复制了0个……


可能主题还没看出来 吃完饭再看……

[ 本帖最后由 523066680 于 2010-4-11 18:04 编辑 ]

TOP

返回列表