[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

都学了什么内容?文件名不合法的字符有哪些?为什么要替换掉那么多字符?从头到尾都没举例说明要怎么重命名呀

TOP

本帖最后由 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"这个语句没有运行

TOP

回复 3# tonyabbs

拜托,先弄清楚echo ren是什么意思

TOP

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

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

TOP

  1. echo;%1&pause
复制代码
你把文件拖放到这个批处理上,看到了什么
批处理默认分隔符有哪些

TOP

回复 6# pcl_test


    我已深深无语……

TOP

回复 5# tonyabbs


    想要显示命令,用echo on
基本调试方法:
1.打开cmd,bat拖进去,看错误码
2.echo on
3.多加PAUSE

TOP

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

TOP

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

回复 9# pcl_test

屏幕显示:

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

看来文件名中有,的话,没法用拖放成为%1变量?

TOP

回复 10# tonyabbs

你要先了解批处理默认分隔符有哪些,%1、%2~%8、%9和%*的意思及作用

TOP

回复 11# pcl_test

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

TOP

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

TOP

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

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

TOP

回复 14# tonyabbs

把%*赋给一个变量,将这个变量中的英文双引号删除后丢给for处理,那时再带上英文双引号

TOP

返回列表