标题: [文本处理] 批处理如何从一行字符串中提取出文件路径? [打印本页]
作者: 狂人一个 时间: 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
- @echo off & setlocal enabledelayedexpansion
- set "str=D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3"
- (set str=%str::=^" ^"% )
- for %%a in ("%str%") do (
- set "p=%%~a"
- if defined last echo,!last:~-1!:!p:~0,-1!
- set "last=%%~a"
- )
- pause
-
-
复制代码
作者: 狂人一个 时间: 2012-6-6 00:10
谢谢,真的可以用,我是新手,看不大懂你的代码,能稍加解释一下么!
我自己是把字符串mp3替换成其他符号后,再用for循环将字符还原成这几排显示的!
作者: CrLf 时间: 2012-6-6 09:49
回复 2# fatcat
可以直接替换为换行符,好处是不用考虑未转义的分隔符导致的意外换行和通配符引发的错误(当然,本题木有通配符)- for /f "delims="eol^= %%a in (^"!p:.mp3=^
-
- !^") 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
这回应该没错了,同理。- @echo off
- setlocal enableDelayedExpansion
- set "str=D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3D:\KuGou\T.R.Y-不是因为寂寞才想你.mp3D:\KuGou\陈楚生 - 有没有人告诉你.mp3"
- for /f %%d in ('copy /z "%~0" nul') do echo !str:.mp3=.mp3%%d^
-
- !
- pause
复制代码
作者: 狂人一个 时间: 2012-6-7 20:09
这段代码假如都是MP3文件是可以的,那假如是别的文件混在里面的话,可能只有2 楼的代码管用一点,我主要是解决在批处理命令里拖入多个文件并将它们分类移动到相应的下一级文件夹里用的。
作者: 狂人一个 时间: 2012-6-7 20:13
本帖最后由 狂人一个 于 2012-6-7 20:31 编辑
- @echo off
- setlocal enabledelayedexpansion
- color 9f
- title 文件分类移动
- for /f %%i in ('dir /b *.') do (
- set /a p=p+1
- @echo !p!. %cd%\%%i\&&@echo !p!. %cd%\%%i\>>h.temp
- )
- set /p choice= 请选择目标文件夹:
-
- :cc
- if !choice!=="1" goto 1
- if !choice!=="2" goto 2
- if !choice!=="3" goto 3
- if !choice!=="4" goto 4
- if !choice!=="5" goto 5
- if !choice!=="6" goto 6
- if !choice!=="7" goto 7
- if !choice!=="8" goto 8
- if !choice!=="9" goto 9
- if !choice!=="0" goto end
-
-
- :1
- set /p Files= 请把要处理的文件拖曳到本窗口:
- set Files=!Files:"=!
-
- (set Files=%Files::=^" ^"% )
-
- for %%i in ("%Files%") do (
-
- set "b=%%~i"
-
- if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
-
- set "last=%%~i"
- )
- for /f "skip=2 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
- for /f "delims=" %%A in (files.txt) do (
- move "%%A" %%a>nul
- echo.
- echo 已将%%A移动到目标文件夹了!
- )
- )
- del files.txt>nul
- echo 完成移动任务,还需要继续么?&&type h.temp&&set /p choice= 请继续选择(退出请按0):
- if not !choice!==0 goto cc
- if !choice!==0 goto end
- pause>nul
-
- :2
- set /p Files= 请把要处理的文件拖曳到本窗口:
- set Files=!Files:"=!
-
- (set Files=%Files::=^" ^"% )
-
- for %%i in ("%Files%") do (
-
- set "b=%%~i"
-
- if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
-
- set "last=%%~i"
- )
- for /f "skip=3 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
- for /f "delims=" %%A in (files.txt) do (
- move "%%A" %%a>nul
- echo.
- echo 已将%%A移动到目标文件夹了!
- )
- )
- del files.txt>nul
- echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice= 请继续选择(退出请按0):
- if not !choice!==0 goto cc
- if !choice!==0 goto end
- pause>nul
-
- :3
- set /p Files= 请把要处理的文件拖曳到本窗口:
- set Files=!Files:"=!
-
- (set Files=%Files::=^" ^"% )
-
- for %%i in ("%Files%") do (
-
- set "b=%%~i"
-
- if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
-
- set "last=%%~i"
- )
- for /f "skip=4 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
- for /f "delims=" %%A in (files.txt) do (
- move "%%A" %%a>nul
- echo.
- echo 已将%%A移动到目标文件夹了!
- )
- )
- del files.txt>nul
- echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice= 请继续选择(退出请按0):
- if not !choice!==0 goto cc
- if !choice!==0 goto end
- pause>nul
-
- :4
- set /p Files= 请把要处理的文件拖曳到本窗口:
- set Files=!Files:"=!
-
- (set Files=%Files::=^" ^"% )
-
- for %%i in ("%Files%") do (
-
- set "b=%%~i"
-
- if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
-
- set "last=%%~i"
- )
- for /f "skip=5 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
- for /f "delims=" %%A in (files.txt) do (
- move "%%A" %%a>nul
- echo.
- echo 已将%%A移动到目标文件夹了!
- )
- )
- del files.txt>nul
- echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice= 请继续选择(退出请按0):
- if not !choice!==0 goto cc
- if !choice!==0 goto end
- pause>nul
-
- :5
- set /p Files= 请把要处理的文件拖曳到本窗口:
- set Files=!Files:"=!
-
- (set Files=%Files::=^" ^"% )
-
- for %%i in ("%Files%") do (
-
- set "b=%%~i"
-
- if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
-
- set "last=%%~i"
- )
- for /f "skip=6 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
- for /f "delims=" %%A in (files.txt) do (
- move "%%A" %%a>nul
- echo.
- echo 已将%%A移动到目标文件夹了!
- )
- )
- del files.txt>nul
- echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice= 请继续选择(退出请按0):
- if not !choice!==0 goto cc
- if !choice!==0 goto end
- pause>nul
-
- :6
- set /p Files= 请把要处理的文件拖曳到本窗口:
- set Files=!Files:"=!
-
- (set Files=%Files::=^" ^"% )
-
- for %%i in ("%Files%") do (
-
- set "b=%%~i"
-
- if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
-
- set "last=%%~i"
- )
- for /f "skip=7 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
- for /f "delims=" %%A in (files.txt) do (
- move "%%A" %%a>nul
- echo.
- echo 已将%%A移动到目标文件夹了!
- )
- )
- del files.txt>nul
- echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice= 请继续选择(退出请按0):
- if not !choice!==0 goto cc
- if !choice!==0 goto end
- pause>nul
-
- :7
- set /p Files= 请把要处理的文件拖曳到本窗口:
- set Files=!Files:"=!
-
- (set Files=%Files::=^" ^"% )
-
- for %%i in ("%Files%") do (
-
- set "b=%%~i"
-
- if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
-
- set "last=%%~i"
- )
- for /f "skip=8 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
- for /f "delims=" %%A in (files.txt) do (
- move "%%A" %%a>nul
- echo.
- echo 已将%%A移动到目标文件夹了!
- )
- )
- del files.txt>nul
- echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice= 请继续选择(退出请按0):
- if not !choice!==0 goto cc
- if !choice!==0 goto end
- pause>nul
-
- :8
- set /p Files= 请把要处理的文件拖曳到本窗口:
- set Files=!Files:"=!
-
- (set Files=%Files::=^" ^"% )
-
- for %%i in ("%Files%") do (
-
- set "b=%%~i"
-
- if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
-
- set "last=%%~i"
- )
- for /f "skip=9 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
- for /f "delims=" %%A in (files.txt) do (
- move "%%A" %%a>nul
- echo.
- echo 已将%%A移动到目标文件夹了!
- )
- )
- del files.txt>nul
- echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice= 请继续选择(退出请按0):
- if not !choice!==0 goto cc
- if !choice!==0 goto end
- pause>nul
-
- :9
- set /p Files= 请把要处理的文件拖曳到本窗口:
- set Files=!Files:"=!
-
- (set Files=%Files::=^" ^"% )
-
- for %%i in ("%Files%") do (
-
- set "b=%%~i"
-
- if defined last echo,!last:~-1!:!b:~0,-1!>>files.txt
-
- set "last=%%~i"
- )
- for /f "skip=10 delims=. tokens=2" %%a in ('find "!choice!." h.temp') do (
- for /f "delims=" %%A in (files.txt) do (
- move "%%A" %%a>nul
- echo.
- echo 已将%%A移动到目标文件夹了!
- )
- )
- del files.txt>nul
- echo 完成移动任务,还需要继续么?&&type h.temp &&set /p choice= 请继续选择(退出请按0):
- if not !choice!==0 goto cc
- if !choice!==0 goto end
- pause>nul
-
- :end
- del h.temp
- @echo 你没有进行选择,程序即将退出!!
- 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 的跳转方式是不可取的,
而且 临时文件 完全是没有必要的.
依楼主的意图, 可以用 数组 来记录那些目标目录.
下面给出一段示例代码, 请楼主找到其中的技巧, 从而加以利用简化自己的代码.- @echo off
- setlocal enabledelayedexpansion
- set "i=0"
- for /f "tokens=*" %%i in ('dir /b /ad') do (
- set /a i+=1
- set "d_!i!=%%~dpnxi"
- set "i= !i!. "
- echo,!i:~-5!%%~dpnxi
- )
- pause
-
- set d_
- pause
-
- set "indDest=3"
- for %%i in (!indDest!) do set "destDefault=!d_%%i!"
- set /p "indDest=请输入目标目录对应的序号(当前默认目录为 !indDest!. !destDefault!, 选择默认目录直接回车): "
- for %%i in (!indDest!) do echo,选择了 !d_%%i!
-
- pause
复制代码
作者: forfiles 时间: 2012-6-8 08:25
回复 14# fatcat
V5,学习了。
作者: neorobin 时间: 2012-6-8 11:24
回复 9# CrLf
测试过直接复制代码
就可以分段换行输出了, 不知为何要用- 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 |