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

TOP

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

引号是后面echo时添加的.

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

TOP

本帖最后由 watermark 于 2012-2-14 19:27 编辑

忙呀, 差点忘记了!

贴一份能证明标题的代码:
@echo off
setlocal enabledelayedexpansion
set tsr=!*
if defined tsr (
for /f "tokens=*" %%i in ("!tsr!") do  (
    for  %%a in (%%i) do (
cd /d "%~dp0"
set filea=%%~a
set exta=%%~xa
set name=%%~na
set patha=%%~dpa
set folder=!name!_!exta:~1!
set pathb=!patha!!folder!
call :action
pause>nul
)
)
)
:action
echo "%filea%"
echo "%exta%"
echo "%folder%"
md "%folder%"
echo "%cd%"
cd "%pathb%"
echo on
echo "%cd%"
@echo off
goto eof
:eofCOPY
这份代码不能直接绕过(abc)&(xyz)形式的限制, 但拖入别的文件能枚举同目录下任何含特殊字符的文件.

TOP

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

TOP

回复 33# watermark


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

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

TOP

回复 34# powerbat


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

TOP

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

TOP

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

返回列表