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

[文件操作] 如何解决拖放/拖曳文件或文件夹到bat文件图标上获取到的路径缺失/不完整的问题

[复制链接]
发表于 2019-10-16 01:40:55 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2019-10-20 16:29 编辑

我拿来批量修改文件夹图标的
现在有这个问题,它工作的非常好,但是遇到文件目录带有“&“这种符号,就会不显示之后的字符导致找不到文件
请问怎么解决啊

上代码
  1. @echo off

  2. :loop
  3. if "%~1"=="" goto :done
  4. if not exist "%~1\*.ico" goto :err

  5. del "%~1\desktop.ini" /f /q /ah 1>nul 2>nul
  6. set "dir=%~1"
  7. pushd "%dir%"
  8. for /f "delims=" %%a in ('dir /a-d/b *.ico') do set "icon=%%~nxa"
  9. (echo [.ShellClassInfo]
  10. echo IconResource=%icon%
  11. )>"%dir%\desktop.ini"

  12. attrib +s +h "%dir%\desktop.ini"
  13. attrib +s +h "%icon%"
  14. attrib +r /d "%dir%"
  15. popd
  16. goto :next

  17. :err
  18. echo=err﹥%~nx1

  19. :next
  20. shift
  21. goto :loop

  22. :done
  23. pause>nul
复制代码
发表于 2019-10-16 10:49:38 | 显示全部楼层
回复 1# sykIII


    你把 @echo off 删掉就能定位到是哪一行命令在报错
 楼主| 发表于 2019-10-16 10:54:55 | 显示全部楼层
回复 2# Batcher


    知道哪行报错,就是所有%~1都不能传递“1&2”这种文件名
尝试了下发现引号扩起来也不行,有点不知所措
发表于 2019-10-16 11:35:39 | 显示全部楼层
回复 3# sykIII


    你是“拖放”操作对吧?直接传递参数是没有问题的比如 test.bat "a&b"
 楼主| 发表于 2019-10-16 12:40:54 | 显示全部楼层
回复 4# Batcher


    是的,是拖放操作。这个批处理能处理大量的文件夹,但是文件名不能有&,其他的没具体尝试但是(和[是没问题的
该怎么改才能让&也能识别呢
发表于 2019-10-16 13:03:50 | 显示全部楼层
很明显,批处理 "拖拽" 就是一个坑。往里面跳的人大多是不要命的。
发表于 2019-10-16 13:05:18 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "s=!cmdcmdline:*%~f0=!"
  4. for /f "delims=" %%i in (!s!) do (
  5.     endlocal
  6.     for %%j in (%%i) do echo;%%~j
  7. )
  8. pause
复制代码
 楼主| 发表于 2019-10-16 13:17:34 | 显示全部楼层
回复 7# WHY


    但是怎么添加到我那串代码里呢,感觉无从下手
 楼主| 发表于 2019-10-16 19:00:16 | 显示全部楼层
回复  sykIII


    你是“拖放”操作对吧?直接传递参数是没有问题的比如 test.bat "a&b"
Batcher 发表于 2019-10-16 11:35



我自己发现一个现象
在文件目录前加一个空格(比如“1&2”变成“ 1&2”),就能正常回显了
这是什么原理呢
发表于 2019-10-16 23:14:22 | 显示全部楼层
回复 9# sykIII


    尽量不用批处理拖拽就行了,纯批拖拽不可能兼容所有特殊字符。
发表于 2019-10-16 23:32:10 | 显示全部楼层
Test.JS
  1. var fso = new ActiveXObject('Scripting.FileSystemObject');
  2. var msg = '';

  3. for( var i=0; i<WSH.Arguments.length; i++ ){
  4.     var fd = WSH.Arguments(i);
  5.     if( fso.FolderExists(fd) ){
  6.         if( fso.FileExists(fd + '\\desktop.ini') ) fso.DeleteFile(fd + '\\desktop.ini', true);
  7.         createFile(fd);
  8.     } else {
  9.         msg += fd + ' is not FOLDER\n';
  10.     }
  11. }

  12. function createFile(fd){
  13.     var icon = '';
  14.     var e = new Enumerator(fso.GetFolder(fd).Files);
  15.     for( ; !e.atEnd(); e.moveNext() ){
  16.         if( /\.ico$/i.test(e.item().Name) ){
  17.             var icon = e.item().Name;
  18.             break;
  19.         }
  20.     }
  21.     if( icon != '' ){
  22.         var str = '[.ShellClassInfo]\r\nIconResource=' + icon;
  23.         var objFile = fso.OpenTextFile(fd + '\\desktop.ini', 2, true);
  24.         objFile.WriteLine(str);
  25.         objFile.Close();
  26.         var sh = new ActiveXObject('WSCript.Shell');
  27.         sh.Run('cmd /c attrib +s +h "' + fd + '\\desktop.ini" & attrib +s +h "' + fd + '\\' + icon + '" & attrib +s +r /d /s "' + fd + '"');
  28.     } else {
  29.         msg += fd + ' ICON not FOUND\n';
  30.     }
  31. }

  32. WSH.Echo(msg == '' ? 'Done' : msg)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 01:42 , Processed in 0.019864 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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