批处理之家's Archiver

wxcute 发表于 2008-12-17 18:52

[ 新手习题 9 ] 批处理交换歌曲与歌手

可以是中文歌曲,也可以是英文歌曲。如果你想统一歌曲文件名,歌手都放前面或是都放后面。可能要进行如下操作,可是如果手工来改的话,要前面复制一下后面再复制一下,会很麻烦。
问题来了,拖一个文件到批处理图标上,自动对调歌手与歌曲名。

其中歌名可以由汉字、英语、数字组成,英文歌曲会有空格,但不含特殊符号;
歌手也可以是组合、艺名,也不含特殊符号;
中间用 “ - ” 连接,即(空格)-(空格)。
[font=宋体][code]老狼 - 同桌的你.mp3     ——>  同桌的你 - 老狼.mp3
Mirror Mirror - M2M.mp3  ——>  M2M - Mirror Mirror.mp3[/code][/font]

目的:学习参数的使用,可能用到 for,或是变量替换。

要求:歌曲与歌手对调,本题基本要求是能处理一个文件,当然你想多个一起交换也不反对;不考虑特殊字符。方法不限。

评分:代码可读性 1 分;
   首个新方法 6 分,第二个 5 分,依次类推,最少 2 分;
   一人可多种方法,新方法追加 3 分,已经出现过的方法追加 1 分。
=========================================
谢谢随风兄提醒,已添加说明。

[[i] 本帖最后由 wxcute 于 2008-12-17 19:32 编辑 [/i]]

随风 发表于 2008-12-17 19:19

是否应该说明一下文件名的规律?比如:歌手名和歌曲名是用-号割开的,文件名中是否有多个-号?

tireless 发表于 2008-12-17 22:53

1、[code]@echo off & setlocal EnableDelayedExpansion
for %%A in (%*) do (
  for /f "tokens=1,* delims=-" %%a in ("%%~nA") do (
    set "L=%%a" & set "R=%%b"
    ren %%A "!R:~1! - !L:~,-1!.mp3"
  )
)[/code]2、[code]@echo off & setlocal EnableDelayedExpansion
for %%A in (%*) do (
  set str=%%~nA
  for /f "delims=\ tokens=1,2" %%a in ("!str: - =\!") do (
    ren %%A "%%b - %%a.mp3"
  )
)[/code]

[[i] 本帖最后由 tireless 于 2008-12-18 08:05 编辑 [/i]]

httydolphin 发表于 2008-12-18 10:55

好的    看完   OK    批处理下吧

yuhaodong 发表于 2008-12-19 05:15

答案

@title 更名
@echo off
color 1f
setlocal EnableDelayedExpansion
:kaishi
set /p dir=请输入路径:
if exist %dir%\*.mp3 (for %%i in (%dir%\*.mp3) do (echo %%i >>tmp.txt)) else (echo 路径错误或*.mp3不存在&goto kaishi)
for /f "delims=\-. tokens=1,2,3,4,5,6,7,8,9" %%a in (tmp.txt) do echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q %%r %%s %%t %%u %%v %%w %%x %%y %%z >>1.txt
for /f "delims=%%" %%a in (1.txt) do (echo %%a >>2.txt)
for /f "delims=," %%a in (2.txt) do (
set /a s=0
for %%i in (%%a) do set /a s=!s!+1
set /a s1=!s!-2
set /a s2=!s!-1
)
for /f "tokens=%s1%,%s2%" %%a in (2.txt) do (ren "%dir%\%%a - %%b.mp3" "%%b - %%a.mp3" 2>nul
ren "%dir%\%%a-%%b.mp3" "%%b-%%a.mp3" 2>nul
)
del 1.txt
del 2.txt
del tmp.txt
set /p a=文件名已经更改完毕<nul
pause
start %dir%
exit

yuhaodong 发表于 2008-12-19 05:21

@title 更名
@echo off
color 1f
setlocal EnableDelayedExpansion
:kaishi
set /p dir=请输入路径:
if exist %dir%\*.mp3 (for %%i in (%dir%\*.mp3) do (echo %%i >>tmp.txt)) else (echo 路径错误或*.mp3不存在&goto kaishi)
for /f "delims=\-. tokens=1,2,3,4,5,6,7,8,9" %%a in (tmp.txt) do echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q %%r %%s %%t %%u %%v %%w %%x %%y %%z >>1.txt
for /f "delims=%%" %%a in (1.txt) do (echo %%a >>2.txt)
for /f "delims=," %%a in (2.txt) do (
set /a s=0
for %%i in (%%a) do set /a s=!s!+1
set /a s1=!s!-2
set /a s2=!s!-1
)
for /f "tokens=%s1%,%s2%" %%a in (2.txt) do (ren "%dir%\%%a - %%b.mp3" "%%b - %%a.mp3" 2>nul
ren "%dir%\%%a-%%b.mp3" "%%b-%%a.mp3" 2>nul
)
del 1.txt
del 2.txt
del tmp.txt
set /p a=文件名已经更改完毕<nul
pause
start %dir%
exit

yuhaodong 发表于 2008-12-19 05:51

@title 更名
@echo off
color 1f
setlocal EnableDelayedExpansion
:kaishi
set /p dir=请输入路径:(格式: X:\..\.. 例如 c:\music)
if exist %dir%\*.mp3 (for %%i in (%dir%\*.mp3) do (echo %%i >>tmp.txt)) else (echo 路径错误或*.mp3不存在&goto kaishi)
for /f "delims=\-. tokens=1,2,3,4,5,6,7,8,9" %%a in (tmp.txt) do echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q %%r %%s %%t %%u %%v %%w %%x %%y %%z >>1.txt
for /f "delims=%%" %%a in (1.txt) do (echo %%a >>2.txt)
for /f "delims=," %%a in (2.txt) do (
set /a s=0
for %%i in (%%a) do set /a s=!s!+1
set /a s1=!s!-2
set /a s2=!s!-1

)
for /f "tokens=%s1%,%s2%" %%a in (2.txt) do (ren "%dir%\%%a - %%b.mp3" "%%b - %%a.mp3" 2>nul
ren "%dir%\%%a-%%b.mp3" "%%b-%%a.mp3" 2>nul
)
del 1.txt
del 2.txt
del tmp.txt
set /p a=文件名已经更改完毕<nul
pause
start %dir%
exit

leaparde 发表于 2008-12-26 16:26

[code]@echo off
title Replace the filename
color 1f
mode con:cols=80 lines=30
setlocal enabledelayedexpansion
::列出当前目录下所有文件及文件夹
dir /b>tmp
::findstr用来找出所有的mp3
for /f "tokens=*" %%a in ('findstr ".mp3" "tmp"') do (
   set str=%%a
::把文件名中的“空格-空格”替换成“-”
   set str=!str: - =-!
::歌曲名称和歌手互换
   for /f "tokens=1-3 delims=-." %%i in ("!str!") do (
      set name=%%i
      set music=%%j
      echo %%a  change to !music! - !name!.mp3
      rename "%%a" "!music! - !name!.mp3"
      )
)
echo.
echo 以上文件改名成功!
del /f /q tmp
pause>nul[/code]空格不太会处理,代码感觉有点繁了,期待高手指点指点啊!

[[i] 本帖最后由 leaparde 于 2008-12-26 16:33 编辑 [/i]]

i520king 发表于 2009-11-13 10:12

学习学习了

zgq0301 发表于 2009-11-13 13:15

[code]@echo off
for %%i in (*.mp3) do (
     for /f "delims=-. tokens=1,2" %%a  in ("%%i") do (
          ren %%i  %%b-%%a.mp3
          )
  )
  pause>nul[/code]

[[i] 本帖最后由 zgq0301 于 2009-11-13 13:17 编辑 [/i]]

battab 发表于 2014-2-18 22:16

[i=s] 本帖最后由 battab 于 2014-2-18 22:20 编辑 [/i]

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=17347&ptid=2830]1#[/url] [i]wxcute[/i] [/b][code]@echo off
set name=%~nx1
for /f "tokens=1,2,3 delims=-." %%a in ("%name%") do set new_name=%%b - %%a.%%c
move /y %1 "C:\Documents and Settings\Administrator\桌面\%new_name%"



[/code][size=4][color=Magenta]注意:最后重命名成新名字的路径要给出到目标地址上,否则默认存在...\Administrator\下![/color][/size]

fcxk 发表于 2015-5-19 14:15

@echo off
for /f "tokens=1-3* delims=-." %%i in (1.txt) do (
echo;%%j - %%i.%%k
)
pause

偷懒的方法

fcxk 发表于 2015-5-19 14:57

@echo off
setlocal EnableDelayedExpansion
for %%i in (%*) do (
set vv=%%~nxi
for /f "tokens=1-3* delims=-." %%i in ('type "!vv%%i!"') do echo;%%j - %%i.%%k
  )
pause

拖放功能

437153 发表于 2015-6-8 12:04

[code]@echo off
for %%a in (%*) do (
        for /f "tokens=1,2,3 delims=-. " %%i in ("%%~nxa") do (
                ren "%%~nxa" "%%j - %%i.%%k"
        )
)[/code]

437153 发表于 2015-6-8 15:20

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=17362&ptid=2830]3#[/url] [i]tireless[/i] [/b]


    高,学习了。字符截取原来有如此妙用!

smss 发表于 2018-12-24 16:47

[quote]1、2、

[ 本帖最后由 tireless 于 2008-12-18 08:05 编辑 ]
[size=2][color=#999999]tireless 发表于 2008-12-17 22:53[/color] [url=http://www.bathome.net/redirect.php?goto=findpost&pid=17362&ptid=2830][img]http://www.bathome.net/images/common/back.gif[/img][/url][/size][/quote]

我试了下上边的所有脚本会导致文件名-左右删字符
如:AAA-BBB  会生成 BB-AA
然而我们需要的是生成BBB-AAA

以下提供可用脚本[code]@echo off&setlocal EnableDelayedExpansion  
for /f "tokens=1,2 delims=-." %%a in ('dir /b *.mp3') do (
set var=%%a
::去除var变量左边第一个空格
if "!var:~0,1!"==" " set var=!var:~1!
if "!var:~0,1!"==" " set var=!var:~1!
if "!var:~0,1!"==" " set var=!var:~1!
if "!var:~0,1!"==" " set var=!var:~1!
if "!var:~0,1!"==" " set var=!var:~1!
if "!var:~0,1!"==" " set var=!var:~1!
if "!var:~0,1!"==" " set var=!var:~1!
if "!var:~0,1!"==" " set var=!var:~1!
::去除var变量右边第一个空格
if "!var:~-1!"==" " set var=!var:~0,-1!
if "!var:~-1!"==" " set var=!var:~0,-1!
if "!var:~-1!"==" " set var=!var:~0,-1!
if "!var:~-1!"==" " set var=!var:~0,-1!
if "!var:~-1!"==" " set var=!var:~0,-1!
if "!var:~-1!"==" " set var=!var:~0,-1!
if "!var:~-1!"==" " set var=!var:~0,-1!
if "!var:~-1!"==" " set var=!var:~0,-1!
set jar=%%b
::去除jar变量左边第一个空格
if "!jar:~0,1!"==" " set jar=!jar:~1!
if "!jar:~0,1!"==" " set jar=!jar:~1!
if "!jar:~0,1!"==" " set jar=!jar:~1!
if "!jar:~0,1!"==" " set jar=!jar:~1!
if "!jar:~0,1!"==" " set jar=!jar:~1!
if "!jar:~0,1!"==" " set jar=!jar:~1!
if "!jar:~0,1!"==" " set jar=!jar:~1!
if "!jar:~0,1!"==" " set jar=!jar:~1!
::去除jar变量右边第一个空格
if "!jar:~-1!"==" " set jar=!jar:~0,-1!
if "!jar:~-1!"==" " set jar=!jar:~0,-1!
if "!jar:~-1!"==" " set jar=!jar:~0,-1!
if "!jar:~-1!"==" " set jar=!jar:~0,-1!
if "!jar:~-1!"==" " set jar=!jar:~0,-1!
if "!jar:~-1!"==" " set jar=!jar:~0,-1!
if "!jar:~-1!"==" " set jar=!jar:~0,-1!
if "!jar:~-1!"==" " set jar=!jar:~0,-1!
::重命名文件
ren "%%a-%%b.mp3" "!jar!-!var!.mp3"
)[/code]

xczxczxcz 发表于 2018-12-24 18:09

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=216142&ptid=2830]16#[/url] [i]smss[/i] [/b]

微软给我们的 WINDOWS 提供了更好的工具不用,还要这么绕脑。

Powershell :[code]
$a -replace '\s+','' -replace '(.*)-(.*)\.(.*)','$2 - $1.$3'
[/code]

smss 发表于 2018-12-30 16:26

[i=s] 本帖最后由 smss 于 2018-12-30 16:28 编辑 [/i]

[quote]回复  smss

微软给我们的 WINDOWS 提供了更好的工具不用,还要这么绕脑。

Powershell :
[size=2][color=#999999]xczxczxcz 发表于 2018-12-24 18:09[/color] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=216143&ptid=2830][img]http://bbs.bathome.net/images/common/back.gif[/img][/url][/size][/quote]

[img]https://static.bbs.miui.com/static/image/miui/base/emp.gif[/img]测试无效

Batcher 发表于 2018-12-30 17:09

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=216352&ptid=2830]18#[/url] [i]smss[/i] [/b]


    操作系统什么版本?PowerShell什么版本?把你的测试用例和测试结果发出来看看吧

smss 发表于 2019-1-1 18:52

[quote]回复  smss


    操作系统什么版本?PowerShell什么版本?把你的测试用例和测试结果发出来看看吧
[size=2][color=#999999]Batcher 发表于 2018-12-30 17:09[/color] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=216355&ptid=2830][img]http://bbs.bathome.net/images/common/back.gif[/img][/url][/size][/quote]


[img]https://attach.bbs.miui.com/album/201812/30/162531dm4715rfrwnzwlqz.jpg[/img]

xczxczxcz 发表于 2019-1-1 20:09

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=216385&ptid=2830]20#[/url] [i]smss[/i] [/b]

首先这句脚本写的是改名的正则表达式,没有文件浏览。它当然不能产生任何作用。

看图片,你的系统好像是 win10。WIN7以上自带PWOERSHELL。无需复制PS程序。可以在PS窗口或用PS脚本直接运行。

如修改你的 图片所示的RAR文件。[code]
dir *.rar | ren -newname {$_.name -replace '\s+','' -replace '(.*)-(.*)\.(.*)','$2-$1.$3'} -verb
cmd /c "echo;&pause"
[/code]元旦太冷。

smss 发表于 2019-1-2 21:44

[i=s] 本帖最后由 smss 于 2019-1-2 21:59 编辑 [/i]

[quote]回复  smss

首先这句脚本写的是改名的正则表达式,没有文件浏览。它当然不能产生任何作用。

看图片, ...
[size=2][color=#999999]xczxczxcz 发表于 2019-1-1 20:09[/color] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=216388&ptid=2830][img]http://bbs.bathome.net/images/common/back.gif[/img][/url][/size][/quote]
[img]https://attach.bbs.miui.com/album/201901/02/215543cnmdto9m5n9v55l9.png[/img]
无论在BAT中还是PowerShell中都无效

xczxczxcz 发表于 2019-1-5 11:32

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=216418&ptid=2830]22#[/url] [i]smss[/i] [/b]

老大,你先确定好工作目录行不行?CD /D ?

miqilaosu 发表于 2019-6-10 11:45

[i=s] 本帖最后由 miqilaosu 于 2019-6-10 16:39 编辑 [/i]

[code]echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=-" %%i in ('dir /a-d /b "*-*.*"') do (

ren "%%i-%%~nxj" "!str2! - !str1!%%~xj"
)
pause[/code]新人交作业


……………………………………………………………………………………………………………………[code]if "!str1:~0,-1!"==" " call  set /a "str1=!str1:~0,-1!"[/code]为什么我替换时数字没问题汉字就出错了

gdfyhao 发表于 2019-7-21 11:11

刚开始学,真的看不懂,还得努力才行

netdzb 发表于 2019-7-22 00:38

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=41134&ptid=2830]10#[/url] [i]zgq0301[/i] [/b]

代码有问题,更名后,文件名带空格。

impk 发表于 2019-8-23 12:31

[i=s] 本帖最后由 impk 于 2019-8-23 13:05 编辑 [/i]

[code]@echo off
for %%a in ( *.mp3 ) do (
for /f "tokens=1,2 delims=-. " %%i in ( "%%a" ) do ( ren "%%a" "%%j - %%i.mp3" )
)
pause[/code]这样写不对,如【Mirror Mirror - M2M.mp3】这种歌名里有空格的,这批处理就无效
16楼是正确答案

impk 发表于 2019-8-23 13:14

[i=s] 本帖最后由 impk 于 2019-8-23 13:18 编辑 [/i]

[code]@echo off
setlocal EnableDelayedExpansion  
for /f "tokens=1,2 delims=-." %%a in ( 'dir /b *.mp3' ) do (
set vara=%%a
if "!vara:~0,1!"==" " set vara=!vara:~1!
if "!vara:~-1!"==" " set vara=!vara:~0,-1!
set varb=%%b
if "!varb:~0,1!"==" " set varb=!varb:~1!
if "!varb:~-1!"==" " set varb=!varb:~0,-1!
ren "%%a-%%b.mp3" "!varb! - !vara!.mp3"
)
pause[/code]

guzm002 发表于 2021-3-29 22:39

为什么都只改4个文件就停了

ycjsplxp 发表于 2023-3-23 20:21

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=17849&ptid=2830]8#[/url] [i]leaparde[/i] [/b]
大佬是直接复制编辑bat文件就可以用吗咋用没研究明白&#128522;

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.