Board logo

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

作者: sykIII    时间: 2019-10-16 01:40     标题: 如何解决拖放/拖曳文件或文件夹到bat文件图标上获取到的路径缺失/不完整的问题

本帖最后由 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
复制代码

作者: Batcher    时间: 2019-10-16 10:49

回复 1# sykIII


    你把 @echo off 删掉就能定位到是哪一行命令在报错
作者: sykIII    时间: 2019-10-16 10:54

回复 2# Batcher


    知道哪行报错,就是所有%~1都不能传递“1&2”这种文件名
尝试了下发现引号扩起来也不行,有点不知所措
作者: Batcher    时间: 2019-10-16 11:35

回复 3# sykIII


    你是“拖放”操作对吧?直接传递参数是没有问题的比如 test.bat "a&b"
作者: sykIII    时间: 2019-10-16 12:40

回复 4# Batcher


    是的,是拖放操作。这个批处理能处理大量的文件夹,但是文件名不能有&,其他的没具体尝试但是(和[是没问题的
该怎么改才能让&也能识别呢
作者: WHY    时间: 2019-10-16 13:03

很明显,批处理 "拖拽" 就是一个坑。往里面跳的人大多是不要命的。
作者: WHY    时间: 2019-10-16 13:05

  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
复制代码

作者: sykIII    时间: 2019-10-16 13:17

回复 7# WHY


    但是怎么添加到我那串代码里呢,感觉无从下手
作者: sykIII    时间: 2019-10-16 19:00

回复  sykIII


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



我自己发现一个现象
在文件目录前加一个空格(比如“1&2”变成“ 1&2”),就能正常回显了
这是什么原理呢
作者: WHY    时间: 2019-10-16 23:14

回复 9# sykIII


    尽量不用批处理拖拽就行了,纯批拖拽不可能兼容所有特殊字符。
作者: WHY    时间: 2019-10-16 23:32

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)
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2