[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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
复制代码

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

回复 17# pcl_test

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

TOP

回复 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文件为

TOP

回复 16# tonyabbs

纳尼!要灵活点呀,要会触类旁通、举一反三呀,批处理都会拖放执行,vbs就不会了?

TOP

回复 14# tonyabbs
VBS的不会用。

TOP

回复 14# tonyabbs

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

TOP

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

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

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

回复 11# pcl_test

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

TOP

回复 10# tonyabbs

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

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

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

TOP

回复 5# tonyabbs


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

TOP

回复 6# pcl_test


    我已深深无语……

TOP

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

TOP

返回列表