我需要一个命令行来将文件重命名为模式

时间:2018-01-05 19:50:56

标签: powershell batch-file command-line

我使用了媒体转换工具将某些视频转换为MP3。不幸的是,该工具不遵循命名惯例,我找不到文件名的选项。

特别是,它删除了艺术家和标题之间的连字符。所以

Smash Mouth   All Star.mp3

变为

ren "*   *.mp3" "*. - *.mp3"

有2600个文件要转换,所以我宁愿将所有转换完成到一个文件夹中,然后我可以运行批处理文件或命令。我试过像

这样的东西
let recipe = {description: 'Super cool recipe'};
let newHTML = `<div>${recipe.description}</div>`;

但它没有效果(没有引号,它产生了错误,并且使用问号而不是*,据我所知,它需要一个固定的模式,就字长而言,对于文件名)。

有什么想法吗?我已经安装了PowerShell,但从未使用过它,所以如果要采用这种方式,请指向一些文档的方向(我之前指向的PowerShell源现在是一个断开的链接)。 / p>

[编辑]

我将从这里开始提出建议,看看我是否可以为我的目的修改它。

https://superuser.com/questions/1230586/renaming-files-with-a-standard-pattern-as-and-when-they-are-added-to-a-folder

3 个答案:

答案 0 :(得分:0)

如果你想进入Powershell路线,你可以使用Get-ChildItem和Rename-Item命令以及正则表达式。

实施例

Get-ChildItem -Path C:\path\to\your\folder | foreach{ Rename-Item -NewName { $_.Name -replace '\[.*\]' }

此处还有关于使用PS w / regexs的另一篇文章:

Use Regex / Powershell to rename files

希望有所帮助!

答案 1 :(得分:0)

这是一个批处理文件解决方案。批处理文件应存储在包含此目录或其子目录中所有* .mp3文件的目录中,并通过双击执行。

@echo off
for /F "eol=| delims=" %%I in ('dir "*   *.mp3" /A-D /B /S 2^>nul') do call :RenameFile "%%I"
set "NewName="
pause
goto :EOF

:RenameFile
set "NewName=%~nx1"
set "NewName=%NewName:   = - %"
ren "%~1" "%NewName%"
goto :EOF

命令 DIR 搜索

  • 仅针对文件,因为/A-D(非属性目录)
  • 由于/S ,在当前目录和所有子目录中
  • 表示包含3个空格的* .mp3文件和
  • 以纯格式输出,因为/B找到的文件的名称带有文件扩展名和完整路径。

DIR 命令行由 FOR 在后台单独的命令进程中执行,后者捕获此命令进程的输出(= command DIR )写入处理 STDOUT

DIR 在未在整个目录树中找到任何与通配符模式匹配的文件以处理 STDERR 的错误输出通过使用2>nul重定向来抑制设备 NUL 。另请阅读有关Using Command Redirection Operators的Microsoft文章,了解2>nul的说明。重定向运算符>必须使用 FOR 命令行上的插入符^进行转义,以便在执行命令之前Windows命令解释程序处理此命令行时将其解释为文字字符FOR ,它在后台启动的单独命令进程中执行嵌入式dir命令行。

命令 FOR 处理从 DIR 输出中捕获的每一行。选项;禁用 FOR 忽略以eol=|开头的行的默认行为。字符|不能用于文件/文件夹名称,因此不能位于文件名或文件路径的开头。 FOR 将水平制表符和空格中的每一行拆分为子字符串的默认行为由选项delims=禁用,指定一个空的分隔符列表。所以 FOR 确实为每个文件名分配了完整路径和文件扩展名,以循环变量I

注意: eol=|此处不需要,因为选项/S DIR 会逐行输出带有完整路径的文件名由 FOR 处理的行不可能以分号开头。但是文件名可以以分号开头,但对于不使用 DIR 选项/S来获取*列表的* .mp3文件,其中包含艺术家和标题作为名称的情况不太可能。没有路径的当前目录中的mp3文件。

此处在捕获的文件名列表上运行 FOR 非常重要,而不是让 FOR 本身以递归方式搜索MP3文件,否则可能会在文件中发生重命名由于在循环迭代期间目录条目更改而跳过某些MP3文件。

对于每个文件名,调用子例程RenameFile,并将完整文件名作为用双引号括起来的第一个参数传递给子例程。双引号是必要的,以便在文件名或文件路径中处理包含空格或其中一个字符&()[]{}^=;!'+,`~的文件名。

使用子程序而不是直接在 FOR 循环中执行剩余代码,因为这将需要使用延迟环境变量扩展,如果处理文件的文件/文件夹名称包含,则会导致问题一个或多个惊叹号。

在子例程RenameFile中,没有路径的当前文件的名称被分配给环境变量NewName

接下来,对文件名应用字符串替换,以空格,连字符,空格替换系列中三个空格的所有出现次数。因此,这个代码不能100%保证连字符真正插入艺术家部分和标题部分之间而不是空格,因为没有脚本代码而无法访问具有艺术家和标题的大型数据库能够确定什么是艺术家和什么是每个文件名中的标题部分。

然后执行文件重命名,指定要使用完整路径重命名的文件,以及命令 REN 所需的带有文件扩展名的新名称。

可以将 ECHO 命令左侧插入ren以首先运行批处理文件,以便检查文件重命名是否按预期完成。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • pause /?
  • ren /?
  • set /?

另见Where does GOTO :EOF return to?

答案 2 :(得分:-1)

编辑: 由于您提到使用Batch / CMD,您可以使用以下内容。

@echo off

for /f "tokens=*" %%i in ('dir \path\to\files /B /A-D') DO (
        set var=%%i
        set var=%var:   = - %
        ren \path\to\"%%~i" "%var%"
)

现在,这是因为您显示文件名有三个空格,省略了破折号。只需更改路径,确保使用适当的权限运行脚本以更改文件名。

PowerShell方式如上所述:

gci \path\to\files|%{rni {$_.Name -replace '\[.*\]'}}