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

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

CMD原生就支持解析多种特殊字符,只要是合法的文件(夹)名称,批处理都能正确处理,无需修改系统文件和注册表,不必投机取巧和钻漏洞。

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

代码迟一些再公布。

祝大家新年快乐!

本帖最后由 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?!

TOP

回复 33# watermark
老实说
我也为楼主的这种避实击虚的思路雷到了
很想收回在23楼所做的预测
代码就不再分析了
天的白色影子

TOP

回复 34# powerbat


    理论上应该还有一大把,比如 if=.cmd  for;.bat  &&&.txt,各种非法语法,各种恶心文件名

TOP

回复 33# watermark


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

    变量解释和参数扩展是两码事,! 虽然和 % 一样能用来解释变量,但是并不被承认用于扩展参数,这个概念区别要分清。

TOP

我想看可以绕过(abc)&(xyz)形式的代码

TOP

本帖最后由 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)形式的限制, 但拖入别的文件能枚举同目录下任何含特殊字符的文件.

TOP

我的系统是NT6, "文档"的实际路径没有任何空格, 图片没作修改的, 如下:
C:\Users\Administrator\Documents\A&=^,;%()@~$'{}B\

引号是后面echo时添加的.

大家能根据28楼的两行代码想到什么没?

TOP

回复 30# CrLf
我也很好奇楼主怎么绕过这个限制的
我所能想到的方式是
把文件放到名称带空格的目录中
然后再往批处理上拖动
依靠固有的空格给文件完整路径加上引号对
天的白色影子

TOP

本帖最后由 CrLf 于 2012-1-30 20:28 编辑

汗,还是不懂...
话说参数为“(abc)&(xyz).txt”时,应该会出现语法错误,连 cmd 都打不开的啊,为什么楼主能正常运行...
好奇,静待答案揭晓。

TOP

回复 26# watermark


    都想不出来了,楼主真是人才了

TOP

这么夸张? 我没有意识到哦...

好吧, 先贴开头两行代码:
  1. SetLocal EnableDelayedExpansion
  2. Set tsr=!*
复制代码

TOP

回复 26# watermark


    贴 100 张图不如贴出代码...

TOP

回复 25# yue
不是啦, 原生就是不需要借助任何第三方工具, 像平常那样编写和执行批处理.
还有, 我并没有指定后缀, 拖入任意后缀的文件都OK.

回复 23# qzwqzw

等的就是你, 呵呵~

首先, 跟"CrLf"版主说一声 Sorry, 让你受委屈了!

(abc)&(xyz) 这类文件名我开始时就测试通过的, 觉得还不够特殊, 才上1楼的图. 只要是合法的文件名, 都能通过测试.
下面这样的文件(夹)名称包含了几乎全部合法的特殊字符, 够复杂了吧?! 嗯, 抱歉, 我还得再贴两张图, 感觉比较直观. 俗话说, 有图有真相.

TOP

  1. set "ddrx=%*"
  2. set "vbrx=%ddrx:"=%"
  3. if "%vbrx:~-4%"==".txt" set "vbrx=%vbrx:~0,-4%_txt"
  4. md "%vbrx%"
  5. pause
复制代码
把上面几段代码用"Quick Batch File Compiler“软件包装一下成EXE文件
然后把txt文件拖到这个EXE文件上即可实现
楼主是这样吗?

TOP

返回列表