找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: watermark

[文件操作] 其实CMD原生支持操作含有多种形式特殊字符的文件和目录!

[复制链接]
发表于 2012-1-31 21:20:44 | 显示全部楼层
回复 30# CrLf
我也很好奇楼主怎么绕过这个限制的
我所能想到的方式是
把文件放到名称带空格的目录中
然后再往批处理上拖动
依靠固有的空格给文件完整路径加上引号对
 楼主| 发表于 2012-2-1 18:27:01 | 显示全部楼层
我的系统是NT6, "文档"的实际路径没有任何空格, 图片没作修改的, 如下:
C:\Users\Administrator\Documents\A&=^,;%()@~$'{}B\

引号是后面echo时添加的.

大家能根据28楼的两行代码想到什么没?
 楼主| 发表于 2012-2-14 19:22:22 | 显示全部楼层
本帖最后由 watermark 于 2012-2-14 19:27 编辑

忙呀, 差点忘记了!

贴一份能证明标题的代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set tsr=!*
  4. if defined tsr (
  5.         for /f "tokens=*" %%i in ("!tsr!") do  (
  6.             for  %%a in (%%i) do (
  7.                         cd /d "%~dp0"
  8.                         set filea=%%~a
  9.                         set exta=%%~xa
  10.                         set name=%%~na
  11.                         set patha=%%~dpa
  12.                         set folder=!name!_!exta:~1!
  13.                         set pathb=!patha!!folder!
  14.                         call :action
  15.                         pause>nul
  16.                 )
  17.         )
  18. )

  19. :action
  20. echo "%filea%"
  21. echo "%exta%"
  22. echo "%folder%"
  23. md "%folder%"
  24. echo "%cd%"
  25. cd "%pathb%"
  26. echo on
  27. echo "%cd%"
  28. @echo off
  29. goto eof

  30. :eof
复制代码
这份代码不能直接绕过(abc)&(xyz)形式的限制, 但拖入别的文件能枚举同目录下任何含特殊字符的文件.
发表于 2012-2-15 00:12:36 | 显示全部楼层
我想看可以绕过(abc)&(xyz)形式的代码
发表于 2012-2-15 10:46:04 | 显示全部楼层
回复 33# watermark


    晕倒...
    这效果的实现并不源于 !*,而是 * 在 for 中作为通配符匹配文件,所以生效的实际上是这句:
  1. for  %%a in (%%i) do ...
复制代码
因此直接写成
  1. for  %%a in (*) do md %%~ni
复制代码
的运行结果也是一样的,仅受所拖动文件的目录影响,不受文件影响。

    变量解释和参数扩展是两码事,! 虽然和 % 一样能用来解释变量,但是并不被承认用于扩展参数,这个概念区别要分清。
发表于 2012-2-15 10:54:01 | 显示全部楼层
回复 34# powerbat


    理论上应该还有一大把,比如 if=.cmd  for;.bat  &&&.txt,各种非法语法,各种恶心文件名
发表于 2012-2-17 22:52:01 | 显示全部楼层
回复 33# watermark
老实说
我也为楼主的这种避实击虚的思路雷到了
很想收回在23楼所做的预测
代码就不再分析了
发表于 2012-2-22 21:36:29 | 显示全部楼层
本帖最后由 garyng 于 2012-2-22 21:40 编辑

还记得 这编帖子么?
[未彻底解决]多个文件拖到cmd窗口后,如何获取每一文件的完整路径
qzwqzw大大(在我楼上呢~)在第7楼写着:

用批处理的办法基本无解

这个问题源于Explorer的拖放扩展程序shell32.dll
注册表路径位于HKEY_CLASSES_ROOT\CLSID\{86C86720-42A0-1069-A2E8-08002B30309D}
因为它没有将“&"视为转义符号
所以不会用引号对将其扩起取消转义

所以对于这个问题无非以下几个方案:
1、修改拖放扩展程序shell32.dll,让它可以处理"&"的情况;
2、新建拖放扩展程序,专门处理cmd之类程序的路径过滤;
3、在处理前告知用户使用"&"的情况可能出错,交由用户处理发生的异常;


楼主说:
把含有任意 =,;&^~@#$%()' 字符的文件拖放至批处理的图标上, 生成一个新的文件夹



在图片看到了“&” 字符

因为它没有将“&"视为转义符号
所以不会用引号对将其扩起取消转义



难道 楼主 写了个第3方? 还是 修改了 shell32.dll?!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:42 , Processed in 0.019196 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表