标题: [文件操作] 如何解决拖放/拖曳文件或文件夹到bat文件图标上获取到的路径缺失/不完整的问题 [打印本页]
作者: sykIII 时间: 2019-10-16 01:40 标题: 如何解决拖放/拖曳文件或文件夹到bat文件图标上获取到的路径缺失/不完整的问题
本帖最后由 pcl_test 于 2019-10-20 16:29 编辑
我拿来批量修改文件夹图标的
现在有这个问题,它工作的非常好,但是遇到文件目录带有“&“这种符号,就会不显示之后的字符导致找不到文件
请问怎么解决啊
上代码- @echo off
-
- :loop
- if "%~1"=="" goto :done
- if not exist "%~1\*.ico" goto :err
-
- del "%~1\desktop.ini" /f /q /ah 1>nul 2>nul
- set "dir=%~1"
- pushd "%dir%"
- for /f "delims=" %%a in ('dir /a-d/b *.ico') do set "icon=%%~nxa"
- (echo [.ShellClassInfo]
- echo IconResource=%icon%
- )>"%dir%\desktop.ini"
-
- attrib +s +h "%dir%\desktop.ini"
- attrib +s +h "%icon%"
- attrib +r /d "%dir%"
- popd
- goto :next
-
- :err
- echo=err﹥%~nx1
-
- :next
- shift
- goto :loop
-
- :done
- 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
- @echo off
- setlocal enabledelayedexpansion
- set "s=!cmdcmdline:*%~f0=!"
- for /f "delims=" %%i in (!s!) do (
- endlocal
- for %%j in (%%i) do echo;%%~j
- )
- 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- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var msg = '';
-
- for( var i=0; i<WSH.Arguments.length; i++ ){
- var fd = WSH.Arguments(i);
- if( fso.FolderExists(fd) ){
- if( fso.FileExists(fd + '\\desktop.ini') ) fso.DeleteFile(fd + '\\desktop.ini', true);
- createFile(fd);
- } else {
- msg += fd + ' is not FOLDER\n';
- }
- }
-
- function createFile(fd){
- var icon = '';
- var e = new Enumerator(fso.GetFolder(fd).Files);
- for( ; !e.atEnd(); e.moveNext() ){
- if( /\.ico$/i.test(e.item().Name) ){
- var icon = e.item().Name;
- break;
- }
- }
- if( icon != '' ){
- var str = '[.ShellClassInfo]\r\nIconResource=' + icon;
- var objFile = fso.OpenTextFile(fd + '\\desktop.ini', 2, true);
- objFile.WriteLine(str);
- objFile.Close();
- var sh = new ActiveXObject('WSCript.Shell');
- sh.Run('cmd /c attrib +s +h "' + fd + '\\desktop.ini" & attrib +s +h "' + fd + '\\' + icon + '" & attrib +s +r /d /s "' + fd + '"');
- } else {
- msg += fd + ' ICON not FOUND\n';
- }
- }
-
- WSH.Echo(msg == '' ? 'Done' : msg)
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |