Board logo

标题: [文本处理] 批处理如何从一行字符串中提取出文件路径? [打印本页]

作者: 狂人一个    时间: 2012-6-5 21:54     标题: 批处理如何从一行字符串中提取出文件路径?

本帖最后由 pcl_test 于 2016-9-3 15:11 编辑

请问下怎么把这样的字符串分成这样的形式!!
D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3

变成
D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3
D:\KuGou\陈楚生 - 有没有人告诉你.mp3
D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3
D:\KuGou\陈楚生 - 有没有人告诉你.mp3
作者: fatcat    时间: 2012-6-5 23:18

  1. @echo off & setlocal enabledelayedexpansion
  2. set "str=D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3"
  3. (set str=%str::=^" ^"% )
  4. for %%a in ("%str%") do (
  5.   set "p=%%~a"
  6.   if defined last echo,!last:~-1!:!p:~0,-1!
  7.   set "last=%%~a"
  8. )
  9. pause
  10.    
复制代码

作者: 狂人一个    时间: 2012-6-6 00:10

谢谢,真的可以用,我是新手,看不大懂你的代码,能稍加解释一下么!
我自己是把字符串mp3替换成其他符号后,再用for循环将字符还原成这几排显示的!
作者: CrLf    时间: 2012-6-6 09:49

回复 2# fatcat


   可以直接替换为换行符,好处是不用考虑未转义的分隔符导致的意外换行和通配符引发的错误(当然,本题木有通配符)
  1. for /f "delims="eol^= %%a in (^"!p:.mp3=^
  2. !^") do echo %%a
复制代码

作者: 喃喃努努    时间: 2012-6-6 10:18

有点累,想睡一觉。
作者: 喃喃努努    时间: 2012-6-6 10:51

有点累,想睡一觉。
喃喃努努 发表于 2012-6-6 10:18



    这,速度真快,我不是灌水,我是觉得看到累,感觉到越看越头疼,所以想睡一会。
作者: poter    时间: 2012-6-6 20:01

@echo off
setlocal enableDelayedExpansion
for /f "tokens=*" %%i in (1.txt) do (
set a=%%i&set "a=!a:mp3=mp3" "!"
for %%a in ("!a!") do (
if not "%%a"=="""" echo %%~a
)
)
作者: poter    时间: 2012-6-6 20:42

回复 4# CrLf


    大侠,你这段代码很不对劲呢,输出的结果很奇怪

@echo off
setlocal enableDelayedExpansion
set "str=D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉
你.mp3D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3"
for /f "delims="eol^= %%a in (^"!str:.mp3=^

!^") do echo %%a
作者: CrLf    时间: 2012-6-6 23:53

回复 8# poter


    这回应该没错了,同理。
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set "str=D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3"
  4. for /f %%d in ('copy /z "%~0" nul') do echo !str:.mp3=.mp3%%d^
  5. !
  6. pause
复制代码

作者: 狂人一个    时间: 2012-6-7 20:09

这段代码假如都是MP3文件是可以的,那假如是别的文件混在里面的话,可能只有2 楼的代码管用一点,我主要是解决在批处理命令里拖入多个文件并将它们分类移动到相应的下一级文件夹里用的。
作者: 狂人一个    时间: 2012-6-7 20:13

本帖最后由 狂人一个 于 2012-6-7 20:31 编辑
  1. @echo off  
  2. setlocal enabledelayedexpansion
  3. color 9f
  4. title 文件分类移动
  5. for /f %%i in ('dir /b *.') do (
  6.    set /a p=p+1
  7.   @echo !p!. %cd%\%%i\&&@echo !p!. %cd%\%%i\>>h.temp
  8. )
  9. set /p choice=               请选择目标文件夹:
  10. :cc
  11. if !choice!=="1" goto 1
  12. if !choice!=="2" goto 2
  13. if !choice!=="3" goto 3
  14. if !choice!=="4" goto 4
  15. if !choice!=="5" goto 5
  16. if !choice!=="6" goto 6
  17. if !choice!=="7" goto 7
  18. if !choice!=="8" goto 8
  19. if !choice!=="9" goto 9
  20. if !choice!=="0" goto end
  21. :1
  22. set /p Files=              请把要处理的文件拖曳到本窗口:
  23. set Files=!Files:"=!
  24. (set Files=%Files::=^" ^"% )
  25. for %%i in ("%Files%") do (
  26.   set "b=%%~i"
  27.   if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
  28.   set "last=%%~i"
  29. )
  30. for /f "skip=2 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
  31.     for /f "delims=" %%A in (files.txt) do (
  32.           move "%%A"  %%a>nul
  33.           echo.
  34.           echo 已将%%A移动到目标文件夹了!
  35. )
  36. )
  37. del files.txt>nul
  38. echo 完成移动任务,还需要继续么?&&type h.temp&&set /p choice=      请继续选择(退出请按0):
  39. if not  !choice!==0 goto cc
  40. if !choice!==0 goto end
  41. pause>nul
  42. :2
  43. set /p Files=              请把要处理的文件拖曳到本窗口:
  44. set Files=!Files:"=!
  45. (set Files=%Files::=^" ^"% )
  46. for %%i in ("%Files%") do (
  47.   set "b=%%~i"
  48.   if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
  49.   set "last=%%~i"
  50. )
  51. for /f "skip=3 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
  52.     for /f "delims=" %%A in (files.txt) do (
  53.          move "%%A"  %%a>nul
  54.          echo.
  55.           echo 已将%%A移动到目标文件夹了!
  56. )
  57. )
  58. del files.txt>nul
  59. echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice=      请继续选择(退出请按0):
  60. if not  !choice!==0 goto cc
  61. if !choice!==0 goto end
  62. pause>nul
  63. :3
  64. set /p Files=              请把要处理的文件拖曳到本窗口:
  65. set Files=!Files:"=!
  66. (set Files=%Files::=^" ^"% )
  67. for %%i in ("%Files%") do (
  68.   set "b=%%~i"
  69.   if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
  70.   set "last=%%~i"
  71. )
  72. for /f "skip=4 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
  73.     for /f "delims=" %%A in (files.txt) do (
  74.          move "%%A"  %%a>nul
  75.          echo.
  76.           echo 已将%%A移动到目标文件夹了!
  77. )
  78. )
  79. del files.txt>nul
  80. echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice=      请继续选择(退出请按0):
  81. if not  !choice!==0 goto cc
  82. if !choice!==0 goto end
  83. pause>nul
  84. :4
  85. set /p Files=              请把要处理的文件拖曳到本窗口:
  86. set Files=!Files:"=!
  87. (set Files=%Files::=^" ^"% )
  88. for %%i in ("%Files%") do (
  89.   set "b=%%~i"
  90.   if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
  91.   set "last=%%~i"
  92. )
  93. for /f "skip=5 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
  94.     for /f "delims=" %%A in (files.txt) do (
  95.          move "%%A"  %%a>nul
  96.          echo.
  97.           echo 已将%%A移动到目标文件夹了!
  98. )
  99. )
  100. del files.txt>nul
  101. echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice=      请继续选择(退出请按0):
  102. if not  !choice!==0 goto cc
  103. if !choice!==0 goto end
  104. pause>nul
  105. :5
  106. set /p Files=              请把要处理的文件拖曳到本窗口:
  107. set Files=!Files:"=!
  108. (set Files=%Files::=^" ^"% )
  109. for %%i in ("%Files%") do (
  110.   set "b=%%~i"
  111.   if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
  112.   set "last=%%~i"
  113. )
  114. for /f "skip=6 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
  115.     for /f "delims=" %%A in (files.txt) do (
  116.          move "%%A"  %%a>nul
  117.          echo.
  118.           echo 已将%%A移动到目标文件夹了!
  119. )
  120. )
  121. del files.txt>nul
  122. echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice=      请继续选择(退出请按0):
  123. if not  !choice!==0 goto cc
  124. if !choice!==0 goto end
  125. pause>nul
  126. :6
  127. set /p Files=              请把要处理的文件拖曳到本窗口:
  128. set Files=!Files:"=!
  129. (set Files=%Files::=^" ^"% )
  130. for %%i in ("%Files%") do (
  131.   set "b=%%~i"
  132.   if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
  133.   set "last=%%~i"
  134. )
  135. for /f "skip=7 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
  136.     for /f "delims=" %%A in (files.txt) do (
  137.          move "%%A"  %%a>nul
  138.          echo.
  139.           echo 已将%%A移动到目标文件夹了!
  140. )
  141. )
  142. del files.txt>nul
  143. echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice=      请继续选择(退出请按0):
  144. if not  !choice!==0 goto cc
  145. if !choice!==0 goto end
  146. pause>nul
  147. :7
  148. set /p Files=              请把要处理的文件拖曳到本窗口:
  149. set Files=!Files:"=!
  150. (set Files=%Files::=^" ^"% )
  151. for %%i in ("%Files%") do (
  152.   set "b=%%~i"
  153.   if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
  154.   set "last=%%~i"
  155. )
  156. for /f "skip=8 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
  157.     for /f "delims=" %%A in (files.txt) do (
  158.          move "%%A"  %%a>nul
  159.          echo.
  160.           echo 已将%%A移动到目标文件夹了!
  161. )
  162. )
  163. del files.txt>nul
  164. echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice=      请继续选择(退出请按0):
  165. if not  !choice!==0 goto cc
  166. if !choice!==0 goto end
  167. pause>nul
  168. :8
  169. set /p Files=              请把要处理的文件拖曳到本窗口:
  170. set Files=!Files:"=!
  171. (set Files=%Files::=^" ^"% )
  172. for %%i in ("%Files%") do (
  173.   set "b=%%~i"
  174.   if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
  175.   set "last=%%~i"
  176. )
  177. for /f "skip=9 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
  178.     for /f "delims=" %%A in (files.txt) do (
  179.          move "%%A"  %%a>nul
  180.          echo.
  181.           echo 已将%%A移动到目标文件夹了!
  182. )
  183. )
  184. del files.txt>nul
  185. echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice=      请继续选择(退出请按0):
  186. if not  !choice!==0 goto cc
  187. if !choice!==0 goto end
  188. pause>nul
  189. :9
  190. set /p Files=              请把要处理的文件拖曳到本窗口:
  191. set Files=!Files:"=!
  192. (set Files=%Files::=^" ^"% )
  193. for %%i in ("%Files%") do (
  194.   set "b=%%~i"
  195.   if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
  196.   set "last=%%~i"
  197. )
  198. for /f "skip=10 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
  199.     for /f "delims=" %%A in (files.txt) do (
  200.          move "%%A"  %%a>nul
  201.          echo.
  202.           echo 已将%%A移动到目标文件夹了!
  203. )
  204. )
  205. del files.txt>nul
  206. echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice=      请继续选择(退出请按0):
  207. if not  !choice!==0 goto cc
  208. if !choice!==0 goto end
  209. pause>nul
  210. :end
  211. del h.temp
  212. @echo 你没有进行选择,程序即将退出!!
  213. pause>nul
复制代码

作者: 狂人一个    时间: 2012-6-7 20:17

我把二楼的代码应用在这段代码中的,但是这个程序有点重复,请各位大侠帮忙修正修正!我的环境是WINdows 7不支持多文件拖曳所以问的这个问题!拖进来的文件有的有引号,有的还没引号!!
作者: 狂人一个    时间: 2012-6-7 20:21

但很奇怪,我只写到9个文件夹这么多,昨晚试了下,就是有25个文件夹也能准确移入!!
有大侠知道为什么?谢谢
作者: fatcat    时间: 2012-6-8 02:27

2 楼的代码:


首先把没有 任何分隔的 全路径串 以 冒号 : 作分隔,
选择 : 是因为其在全路径中是必有的, 且一条路径只可能包含一个
%str::=^" ^"%
将一个 冒号 变成了两个 双引号 隔着一个 空格,
后文中使用了
!p:~0,-1!
的形式, 所以为了让最后一段路径也通用, 就再在尾部加了一个空格,
再加上括号对作 保护, 防止 空格 在编辑过程中 被忽略 或者 被 增多.
(set str=%str::=^" ^"% )

for %%a in ("%str%")
这里 又在 str 内容 的 头和尾各加了一个双引号, 从而形成类似这样的形式
for %%a in ("ab c" "de" "fg hi")
其中, b和c之间, g和h之间 的空格因为都在 匹配的双引号对 内部,
所以不会成为 for 解析的分隔符, 从而得以保留
而下面的
%%~a
使用 又会将存在(不存在也不影响)的双引号对给脱去.

!last:~-1!
获得每一个路径的盘符(被分离到了上一个路径的尾部)

%%a 第一次获得的值仅仅是一个盘符,
而此时, last 恰好也没有定义, 所以
if defined last echo,!last:~-1!:!p:~0,-1!
略过此次输出.
若反复多次运行
for %%a in ("%str%") do (
  ...
)
则应在前面加上 last 的初始化:
set "last="



楼主这样的语句是不能按预期执行的:
if !choice!=="1" goto 1
所以实际使用中, 第 12 -- 21 行的 goto 语句从没有执行过,
而是顺序运行到 第 24 行.
所以, 第 50 -- 266 行代码其实都成了死代码
(逻辑上可以运行到(输入 "1" 等时), 但实际没有运行到)
应改为
if "!choice!"=="1" goto 1

这里, 楼主代码中 choice 的跳转方式是不可取的,
而且 临时文件 完全是没有必要的.
依楼主的意图, 可以用 数组 来记录那些目标目录.
下面给出一段示例代码, 请楼主找到其中的技巧, 从而加以利用简化自己的代码.
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "i=0"
  4. for /f "tokens=*" %%i in ('dir /b /ad') do (
  5.   set /a i+=1
  6.   set "d_!i!=%%~dpnxi"
  7.   set "i=    !i!.  "
  8.   echo,!i:~-5!%%~dpnxi
  9. )
  10. pause
  11. set d_
  12. pause
  13. set "indDest=3"
  14. for %%i in (!indDest!) do set "destDefault=!d_%%i!"
  15. set /p "indDest=请输入目标目录对应的序号(当前默认目录为 !indDest!. !destDefault!, 选择默认目录直接回车): "
  16. for %%i in (!indDest!) do echo,选择了 !d_%%i!
  17. pause
复制代码

作者: forfiles    时间: 2012-6-8 08:25

回复 14# fatcat


    V5,学习了。
作者: neorobin    时间: 2012-6-8 11:24

回复 9# CrLf

测试过直接
  1. echo !str:.mp3=.mp3^
  2. !
复制代码
就可以分段换行输出了,  不知为何要用
  1. for /f %%d in ('copy /z "%~0" nul')
复制代码

作者: powerbat    时间: 2012-6-8 12:03

回复 16# neorobin


    前者只有一个换行符\n,后者是回车换行\r\n
作者: neorobin    时间: 2012-6-8 13:09

回复 17# powerbat

谢谢
作者: 狂人一个    时间: 2012-6-9 00:40

谢谢!!学习了
作者: 狂人一个    时间: 2012-6-9 00:41

马上消化!!




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