使用批处理自动化解析文件名

Posted

技术标签:

【中文标题】使用批处理自动化解析文件名【英文标题】:Parse file name using batch automation 【发布时间】:2018-11-12 23:10:31 【问题描述】:

这可能很简单,但我不是计算机语言专家。 我一直在互联网上寻找解决方案将近 3 个小时。

假设我所有的 mp3 文件的标题都是 “艺术家的名字 - Song.mp3 的标题”,我希望它输出到一个包含以下内容的 txt 文件中: 艺术家:艺术家姓名 歌曲:歌曲名称

如何将文件名解析为用连字符分隔的两部分?我一直在尝试对批处理文件进行某种自动化以用于存档目的,这是我坚持使用的代码:

@echo off
for /r %%a in (*.mp3) do (
(
for %%b in ("%%~na") do echo ^Artist: %%~b
echo ^Song:
)>"%%~dpna.txt"
) 

【问题讨论】:

使用 for /f 解析文件名 read here 。您想要每个 mp3 都有一个文本文件吗? @LotPings 是的,没错。我试图理解你给我的链接,但它似乎有点压倒性。你能详细说明它是如何发挥作用的吗? 【参考方案1】:

如何将文件名解析为用连字符分隔的两部分?

我希望它输出到一个包含以下内容的 txt 文件中:

Artist: Name of Artist
Song: Title of Song

使用以下批处理文件作为起点:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=-" %%i in ('dir /b name*') do (
  echo Artist: %%i 
  echo Song: %%j
 )>>file.txt
endlocal

示例用法:

> dir name*
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

03/06/2018  14:06                 0 Name of Artist - Title of Song.mp3
03/06/2018  14:07                 0 Name of Artist 1 - Title of Song 1.mp3
               2 File(s)              0 bytes
               0 Dir(s)  1,269,011,574,784 bytes free

> test

> type file.txt
Artist: Name of Artist
Song:  Title of Song.mp3
Artist: Name of Artist 1
Song:  Title of Song 1.mp3    
>

我希望它为每个 mp3 文件提供一个文本文件。这可能吗?

是 使用以下批处理文件:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in ('dir /b name*.mp3') do (
  set _filename=%%~dpna.txt
  for /f "tokens=1,2 delims=-" %%i in ("%%a") do (
    echo Artist: %%i 
    echo Song: %%j
    )>!_filename!
  )
endlocal

示例用法:

> dir *.mp3
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

03/06/2018  14:06                 0 Name of Artist - Title of Song.mp3
03/06/2018  14:07                 0 Name of Artist 1 - Title of Song 1.mp3
               2 File(s)              0 bytes
               0 Dir(s)  1,269,022,654,464 bytes free

> test

> type name*.txt

Name of Artist - Title of Song.txt


Artist: Name of Artist 1
Song:  Title of Song 1.mp3

Name of Artist 1 - Title of Song 1.txt


Artist: Name of Artist 1
Song:  Title of Song 1.mp3

An A-Z Index of the Windows CMD command line A categorized list of Windows CMD commands dir - 显示文件和子文件夹列表。 for /f - 根据另一个命令的结果循环命令。

【讨论】:

感谢@DavidPostill 的帮助,但我希望每个 mp3 文件都有一个文本文件。这可能吗? @Mr-RightHanded 那么编辑问题以指定您希望如何命名文本文件。 呃哦,没有引用已知包含空格的文件名。为什么要保存到强制延迟扩展的变量?如果文件名包含另一个破折号,其余部分将被截断。 @LotPings 我专门使用包含空格的文件名对其进行了测试...如果您费心正确阅读答案,您可以在“示例用法”中看到跨度> @LotPings 延迟扩展没什么问题。如果只有更多的人知道它是什么以及它是如何工作的......【参考方案2】:

更改 PushD 之后的 startfolder 以适应您的环境。

:: Q:\Test\2018\06\03\SO_50666632.cmd
@echo off
PushD "%USERPROFILE%\Music" || (Echo can't locate folder&Pause&exit /B 1)

for /r %%a in (*.mp3) do (
    if exist "%%~dpna.txt" (
        Echo "%%~dpna.txt" already present, skip
    ) else (
       for /f "tokens=1,*delims=-" %%b in ("%%~na") do (
           echo Artist: %%b
           echo Song  :%%c
       )>"%%~dpna.txt"
    )
)

我的 ramdrive a 上的示例输出:

> tree /F
Auflistung der Ordnerpfade
Volumeseriennummer : 5566-7788
A:.
│   Name of Artist - Title of Song.mp3
│   Name of Artist - Title of Song.txt
│
└───Music
        Survivor - Eye of the Tiger.mp3
        Survivor - Eye of the Tiger.txt


> type "Name of Artist - Title of Song.txt"
Artist: Name of Artist
Song  : Title of Song

> type "Music\Survivor - Eye of the Tiger.txt"
Artist: Survivor
Song  : Eye of the Tiger

【讨论】:

成功了。谢谢我实际上是在尝试将 for /f 添加到不同的行中。不像我说的那样是专家。谢谢。为我节省了很多时间。干杯! 顺便说一句,关于这个问题的后续问题。此代码会跳过现有文件吗?喜欢,更新的音乐库。这会是成千上万首歌曲等的问题吗? 目前不,它只是覆盖现有文件。增强了首次检查的答案。

以上是关于使用批处理自动化解析文件名的主要内容,如果未能解决你的问题,请参考以下文章

走近华佗,解析自动化故障处理系统背后的秘密

使用管道将 Windows 命令解析为批处理文件中的变量 [重复]

教你如何批量运行自动化脚本,高效工作!

java解析properties文件

Arouter之注解处理器

yum 是使用 rpm 可执行文件来处理 rpm 包还是实现自己的 rpm 解析和处理