如何从命令行批量转换文件?

如何从命令行批量转换文件?

我正在将音乐从 Nintendo 3DS 使用的专有格式转换为 wav。唯一可以转换此专有格式的程序是命令行程序,它接受如下输入:

convert.exe -o converted music.wav inputfile.differentformat

我想知道如何对文件夹中的所有文件运行此程序并保留原始文件名。例如,如果我有 3 个文件,分别名为音乐1.不同格式,音乐2.不同格式music3.differentformat它将运行名为转换程序并生成 3 个 wav 文件,分别名为音乐1.wav,音乐2.wav,音乐3.wav

答案1

您可能想尝试使用 PowerShell 来实现这一点,而不是批处理。PowerShell 的优点在于它保留了对常规命令行实用程序的访问,同时还允许您利用 PowerShell 附带的更高级的脚本功能和命令。

根据您的原始帖子,我猜测转换实用程序的命令语法是这样的。

convert.exe -o converted [output filename] [input filename]

如果此语法不正确,则需要相应地调整下面的脚本。

脚本模板

$MusicFolder = '[Full path to music folder]'
$InputFormat = '[Extension for input files]'
$OutputFormat = '[Extension for output files]'
Get-ChildItem "$MusicFolder\*.$InputFormat" |
ForEach-Object {
    $Filename = $_.BaseName
    $InputPath = "`"$MusicFolder\$Filename.$InputFormat`""
    $OutputPath = "`"$MusicFolder\$Filename.$OutputFormat`""
    Invoke-Expression "convert.exe -o converted $OutputPath $InputPath"
}

我没有测试过上述内容,主要是因为我一开始真的不知道你用的是什么实用程序,但原则上它应该可以工作。以下是命令和流程的一般细分:

基本概念

  • 任何格式$[Name] = [Stuff]都是变量赋值。
  • Get-ChildItem是 PowerShell 的等价物dir。但与大多数 PowerShell 命令一样,一个关键区别在于,它dir仅返回用于控制台输出的字符串,而Get-ChildItem实际上返回的对象具有可在通过管道传输到其他命令时使用的方法和属性。
  • 管道字符 ( |} 将一个命令的输出重定向到另一个命令以进行进一步处理,而不是简单地在控制台上显示结果。
  • ForEach-Object获取数组中的对象并针对每个对象运行一系列命令。
  • $_是 PowerShell 用于引用循环中正在处理的当前对象的内置变量。
  • $[Name].[Something]指的是变量的属性或方法——请记住,PowerShell 主要处理对象而不是简单的字符串。
  • '[Words and Stuff]'表示一个基本的、静态的字符串。
  • "[Words and Stuff]"也表示字符串。但是,双引号比较特殊,因为它们告诉 PowerShell 扩展其中的变量。
    • $x = 'world'; Write-Output "Hello $x"将输出Hello world
    • $x = 'world'; Write-Output 'Hello $x'将输出Hello $x
  • 重音符 ( `) 是一个转义字符,它告诉 PowerShell 将以下字符按原样包含在字符串中,而不是将其作为特殊字符处理(如果它在 PowerShell 语法中具有功能意义)。
  • Invoke-Expression用于运行以字符串形式存储的命令。这对于像您这样的情况很有用,我们需要预先组装外部命令的参数,然后使用其参数执行该命令。

脚本流程

  1. 前三行设置了我们稍后将用于构建文件路径的变量。
  2. 第四行用于Get-ChildItem获取 中所有$MusicFolder扩展名与 匹配的文件$InputFormat,并沿着管道转发它们。
  3. 在第五行中,ForEach-Object将获取发送给它的文件Get-ChildItem并针对每个文件运行其余脚本块。
  4. 接下来的三行用于进一步构建我们需要提供适当参数的文件路径详细信息convert.exe
    • BaseName是文件对象的属性,仅包含文件名 - 不包括文件夹结构和文件扩展名。
    • $InputPath请注意和中的转义双引号$OutputPath。这样实际的字符串值就会被双引号括起来,因为像您这样的命令行实用程序很可能需要它们才能正确处理包含空格或其他特殊字符的路径。
  5. 右括号之前的最后一行将所有内容放在一起并convert.exe使用适当的参数运行。

示例脚本

$MusicFolder = 'C:\Users\Me\My Documents\Music'
$InputFormat = 'mp3'
$OutputFormat = 'wav'
Get-ChildItem "$MusicFolder\*.$InputFormat" |
ForEach-Object {
    $Filename = $_.BaseName
    $InputPath = "`"$MusicFolder\$Filename.$InputFormat`""
    $OutputPath = "`"$MusicFolder\$Filename.$OutputFormat`""
    Invoke-Expression "convert.exe -o converted $OutputPath $InputPath"
}

相关内容