Board logo

标题: [文件操作] [部分解决]使用拖放文件到批处理上执行的方式对文件名带特殊字符文件如何获取完整路径 [打印本页]

作者: tonyabbs    时间: 2016-11-5 18:20     标题: [部分解决]使用拖放文件到批处理上执行的方式对文件名带特殊字符文件如何获取完整路径

本帖最后由 tonyabbs 于 2016-11-6 11:21 编辑

需要拖放到批处理的文件,根据其文件名 、创建时间、当时时间,进行更名。批处理不能运行,但将批处理中的语句行复制到CMD是可以运行的。请教各位!(学习了论坛跟文件名字符串处理相关的若干文章,没有找出这段代码的问题)
比如文件名为“基于(山水为体,文化为魂)理念的旅游产业开发研究.txt” 想要修改为 "4R161105_基于(山水为体,文化为魂)理念的旅游产业开发研究_TonyQ_1942.txt"(其中,161105是今天的日期,1942是当前的时间)
把“基于(山水为体,文化为魂)理念的旅游产业开发研究.txt“拖到这个BAT上,屏幕显示如下:
file_suffix = _TonyQ_2051
请按任意键继续. . .
file_name= 基于(山水为体
file_prename=基于(山水为体
file_extname=
基于(山水为体中的空格已经改为_ ,文件 全 名 改为基于(山水为体
基于(山水为体中的空格已经改为_ ,文件名 改为基于(山水为体
基于(山水为体中的括号已经改为( ,文件 全 名 改为基于(山水为体
括号已经改为( ,文件名 改为基于(山水为体
基于(山水为体中的括号已经改为) ,文件 全 名 改为基于(山水为体
括号已经改为) ,文件名 改为基于(山水为体
基于(山水为体中的加号已经改为: ,文件 全 名 改为基于(山水为体
加号已经改为: ,文件名 改为基于(山水为体
请按任意键继续. . .
没有达到预期的想要更名为"4R161105_基于(山水为体,文化为魂)理念的旅游产业开发研究_TonyQ_1942.txt"(其中,161105是今天的日期,1942是当前的时间)的效果
出现的问题:1、file_name并没有取得文件的全名;2、更不要提后面的ren命令能运行了
另外我想请教下
for /f "tokens=*" %%I in ("%1") do (
和for /f "delims=" %%I in ("%~1") do (
这两种写法有啥不同?我的本意是取得拖放到BAT的文件名变量
  1. @echo off&setlocal enabledelayedexpansion
  2. :ADDREM
  3. IF %1.==. GOTO END
  4. set thefile=%1
  5. set/a g=%time:~0,2%,h=g+100
  6. set "file_suffix=_TonyQ_%h:~-2%%time:~3,2%"
  7. echo file_suffix = %file_suffix%
  8. for /f "delims=" %%I in ("%~1") do (
  9. set "file_name=%%~nxI"&set "file_prename=%%~nI"&set "file_extname=%%~xI"
  10. echo file_name= !file_name!&echo  file_prename=!file_prename!&echo file_extname=!file_extname!
  11. set "file_name0=!file_name: =_!"&echo !file_name!中的空格已经改为_ ,文件 全 名 改为!file_name0!  
  12. set "file_prename=!file_prename: =_!"&echo !file_prename!中的空格已经改为_ ,文件名 改为!file_prename!
  13. set "file_name1=!file_name0:%(=(!"&echo !file_name0!中的括号已经改为( ,文件 全 名 改为!file_name1!
  14. set "file_prename1=!file_prename:%(=(!"&echo 括号已经改为( ,文件名 改为!file_prename1!
  15. set "file_name2=!file_name1:%)=)!"&echo !file_name1!中的括号已经改为) ,文件 全 名 改为!file_name2!
  16. set "file_prename2=!file_prename1:%)=)!"&echo 括号已经改为) ,文件名 改为!file_prename2!
  17. set "file_name3=!file_name2:%+=:!"&echo !file_name2!中的加号已经改为: ,文件 全 名 改为!file_name3!
  18. set "file_prename3=!file_prename2:%+=:!"&echo 加号已经改为: ,文件名 改为!file_prename3!
  19. ::以下语句ren没有执行
  20. ren "!file_name!" "!file_name3!"
  21. for  %%a in ("!file_name3!") do (
  22. set "file_pre=4R%date:~2,2%%date:~5,2%%date:~8,2%_"&echo file_pre= !file_pre!
  23. set "file_new=!file_pre!!file_prename3!!file_suffix!!file_extname!"&echo file_new= !file_new!
  24. )
  25. ren  "!file_name3!" "!file_new!"
  26. echo %thefile%  已经阅读完毕并更名为  !file_new!
  27. )
  28. shift
  29. goto ADDREM
  30. :DEAL
  31. echo %%1 = %1
  32. :END
  33. echo OK
  34. pause
复制代码

作者: pcl_test    时间: 2016-11-5 18:36

都学了什么内容?文件名不合法的字符有哪些?为什么要替换掉那么多字符?从头到尾都没举例说明要怎么重命名呀
作者: tonyabbs    时间: 2016-11-5 19:45

本帖最后由 pcl_test 于 2016-11-5 20:04 编辑

比如文件名为“abc  def+g(hk).txt” 想要修改为 "4R161105_abc_def:g(hk)_TonyQ_1942.txt"(其中,161105是今天的日期,1942是当前的时间)。调试发现,用上述代码实现了文件名的新命名,但 ren 命令没有运行。
如ren "abc  def+g(hk).txt" "4R161105_abc_def:g(hk)_TonyQ_1942.txt"这个语句没有运行
作者: pcl_test    时间: 2016-11-5 19:54

回复 3# tonyabbs

拜托,先弄清楚echo ren是什么意思
作者: tonyabbs    时间: 2016-11-5 20:12

本帖最后由 tonyabbs 于 2016-11-5 20:21 编辑

我之前加上echo是想显示这行命令的,去掉echo后,实验了一个实际文件名:“基于(山水为体,文化为魂)理念的旅游产业开发研究.txt” 是想把这个文件名中的()改成(),并加上上述时间标签的,但仍旧不成功,屏幕一闪而过,文件名没有被修改。(我已经把问题贴根据版主提醒又修改明确了下)
作者: pcl_test    时间: 2016-11-5 20:33

  1. echo;%1&pause
复制代码
你把文件拖放到这个批处理上,看到了什么
批处理默认分隔符有哪些
作者: 老刘1号    时间: 2016-11-5 20:37

回复 6# pcl_test


    我已深深无语……
作者: 老刘1号    时间: 2016-11-5 20:40

回复 5# tonyabbs


    想要显示命令,用echo on
基本调试方法:
1.打开cmd,bat拖进去,看错误码
2.echo on
3.多加PAUSE
作者: pcl_test    时间: 2016-11-5 21:02

6楼就一行代码保存为批处理文件,然后把你的“基于(山水为体,文化为魂)理念的旅游产业开发研究.txt”文件拖到这个批处理上,看到结果后回答我6楼的问题
作者: tonyabbs    时间: 2016-11-5 21:05

本帖最后由 tonyabbs 于 2016-11-5 21:50 编辑

回复 9# pcl_test

屏幕显示:

C:\Users\tonyq\Desktop>echo;C:\Users\tonyq\Desktop\基于(山水为体  & pause
C:\Users\tonyq\Desktop\基于(山水为体
请按任意键继续. . .

看来文件名中有,的话,没法用拖放成为%1变量?
作者: pcl_test    时间: 2016-11-5 21:56

回复 10# tonyabbs

你要先了解批处理默认分隔符有哪些,%1、%2~%8、%9和%*的意思及作用
作者: tonyabbs    时间: 2016-11-5 22:03

回复 11# pcl_test

我把原来文件名改成 "基于(山水为体 , 文化为魂)理念的旅游产业开发研究.TXT"或者是“基于(山水为体,文化为魂)理念的旅游产业开发研究 - 副本.txt”,就没有问题。就只有文件名为“基于(山水为体,文化为魂)理念的旅游产业开发研究.txt”不行
我查了论坛中的文章,说这是系统的问题,解决不了。
http://www.bathome.net/thread-7509-1-1.html
作者: pcl_test    时间: 2016-11-5 22:17

本帖最后由 pcl_test 于 2016-11-6 01:43 编辑

回复 12# tonyabbs
  1. echo;%*
  2. pause
复制代码
你自己测试过没,这样获取不到么

vbs
  1. Set fso=CreateObject("Scripting.FileSystemObject")
  2. If WSH.Arguments.Count=0 Then
  3.     Msgbox "将需更名的文件拖放到vbs文件上"
  4.     WSH.Quit
  5. End If
  6. file=WSH.Arguments(0)
  7. fname=fso.GetBaseName(file)
  8. fext="."&fso.GetExtensionName(file)
  9. d=now()
  10. newfname="4R"&right(year(d),2)&right("0"&month(d),2)&_
  11.     right("0"&day(d),2)&"_"&fname&"_"&_
  12.         right("0"&hour(d),2)&right("0"&minute(d),2)&fext
  13. fso.GetFile(file).Name=newfname
复制代码

作者: tonyabbs    时间: 2016-11-5 22:49

本帖最后由 tonyabbs 于 2016-11-5 23:07 编辑

回复 13# pcl_test
%*能获取到,但不懂如何转成for里面%%I能处理的方式
for /f "delims=" %%I in ("%~*") do (  ?
(vbs的还不懂怎么用)
作者: pcl_test    时间: 2016-11-5 23:00

回复 14# tonyabbs

把%*赋给一个变量,将这个变量中的英文双引号删除后丢给for处理,那时再带上英文双引号
作者: tonyabbs    时间: 2016-11-5 23:06

回复 14# tonyabbs
VBS的不会用。
作者: pcl_test    时间: 2016-11-5 23:20

回复 16# tonyabbs

纳尼!要灵活点呀,要会触类旁通、举一反三呀,批处理都会拖放执行,vbs就不会了?
作者: tonyabbs    时间: 2016-11-5 23:46

回复 15# pcl_test
  1. echo;%*&pause
  2. set "thefile=%*"
  3. echo thefile=%thefile%
  4. for /f "tokens=*" %%I in ("%thefile%") do (
  5. echo %%~nxI)
复制代码
单独这样用BAT时,是可行的,但是把这段代码放到整个批处理中,就不行了。
  1. @echo on&setlocal enabledelayedexpansion
  2. set/a g=%time:~0,2%,h=g+100
  3. set "file_suffix=_TonyQ_%h:~-2%%time:~3,2%"
  4. echo file_suffix = %file_suffix%
  5. pause
  6. :ADDREM
  7. echo;%*&pause
  8. set "thefile=%*"
  9. echo thefile=%thefile%
  10. for /f "tokens=*" %%I in ("%thefile%") do (
  11. echo %%~nxI
  12. if %%I=="" goto END
  13. pause
  14. set "file_name=%%~nxI"&set "file_prename=%%~nI"&set "file_extname=%%~xI"
  15. echo file_name= !file_name!&echo  file_prename=!file_prename!&echo file_extname=!file_extname!
  16. set "file_name0=!file_name: =_!"&echo !file_name!中的空格已经改为_ ,文件 全 名 改为!file_name0!  
  17. set "file_prename=!file_prename: =_!"&echo !file_prename!中的空格已经改为_ ,文件名 改为!file_prename!
  18. set "file_name1=!file_name0:%(=(!"&echo !file_name0!中的括号已经改为( ,文件 全 名 改为!file_name1!
  19. set "file_prename1=!file_prename:%(=(!"&echo 括号已经改为( ,文件名 改为!file_prename1!
  20. set "file_name2=!file_name1:%)=)!"&echo !file_name1!中的括号已经改为) ,文件 全 名 改为!file_name2!
  21. set "file_prename2=!file_prename1:%)=)!"&echo 括号已经改为) ,文件名 改为!file_prename2!
  22. set "file_name3=!file_name2:%+=:!"&echo !file_name2!中的加号已经改为: ,文件 全 名 改为!file_name3!
  23. set "file_prename3=!file_prename2:%+=:!"&echo 加号已经改为: ,文件名 改为!file_prename3!
  24. pause
  25. ren "!file_name!" "!file_name3!"
  26. pause
  27. for  %%a in ("!file_name3!") do (
  28. set "file_pre=4R%date:~2,2%%date:~5,2%%date:~8,2%_"&echo file_pre= !file_pre!
  29. set "file_new=!file_pre!!file_prename3!!file_suffix!!file_extname!"&echo file_new= !file_new!
  30. )
  31. pause
  32. ren  "!file_name3!" "!file_new!"
  33. echo %thefile%  已经阅读完毕并更名为  !file_new!
  34. )
  35. shift
  36. goto ADDREM
  37. :END
  38. echo OK
  39. pause
复制代码
这个需要改名的TXT文件为
作者: tonyabbs    时间: 2016-11-6 00:08

本帖最后由 tonyabbs 于 2016-11-6 11:20 编辑

回复 17# pcl_test

显示 缺少对象wsh。
找到原因了,是需要把VBS的缺省打开方式用wscript打开。




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