Batch file 自动批处理-修剪、更改比特率,然后通过Windows上的sox规范化wav文件

Batch file 自动批处理-修剪、更改比特率,然后通过Windows上的sox规范化wav文件,batch-file,wav,sox,Batch File,Wav,Sox,我想批量处理文件夹中的wav文件: 首先将文件修剪到5秒,并将修剪后的文件放入名为“Trim5s”的文件夹中,然后 更改修剪文件(即文件夹“Trim5s”中)的比特率,并将从上述步骤1中修剪文件派生的新比特率文件保存到名为“16bit”的文件夹中,然后 将新修剪+新比特率文件规范化为-1,该文件位于上述步骤2中导出的“16位”文件夹中,并将规范化+修剪文件+新比特率文件保存到文件夹“Norm-1”中 这是我的文件夹结构: MainFolder |____file1.wav |____

我想批量处理文件夹中的wav文件:

  • 首先将文件修剪到5秒,并将修剪后的文件放入名为“Trim5s”的文件夹中,然后
  • 更改修剪文件(即文件夹“Trim5s”中)的比特率,并将从上述步骤1中修剪文件派生的新比特率文件保存到名为“16bit”的文件夹中,然后
  • 将新修剪+新比特率文件规范化为-1,该文件位于上述步骤2中导出的“16位”文件夹中,并将规范化+修剪文件+新比特率文件保存到文件夹“Norm-1”中
  • 这是我的文件夹结构:

    MainFolder
       |____file1.wav
       |____file2.wav
       |____Trim5s
               |____file1_trim5s.wav
               |____file2_trim5s.wav
               |____16bit
                      |____file1_trim5s_16bit.wav
                      |____file2_trim5s_16bit.wav
                      |____Norm-1
                             |____file1_trim5s_16bit_Norm-1.wav
                             |____file2_trim5s_16bit_Norm-1.wav
            
    
    目前,我每次都手动执行每个步骤。以下是Windows
    cmd
    命令:

    步骤1:将文件修剪为秒:

    for %i in (*.wav) do sox -S "%i" "Trim5s\%~ni_trim5.wav" trim 0 5
    
    然后,我手动将目录更改为“Trim5s”,并运行第二步:

    步骤2:将“Trim5s”文件夹中的位深度更改为16位:

    然后我再次手动将目录更改为文件夹“16bit”,并运行第三步:

    步骤3:规范化16位文件夹中的文件:

    for %i in (*.wav) do sox -S --norm=-1 "%i" "Norm-1\%~ni_norm-1.wav"
    
    有没有一种方法可以自动完成这三个过程?也就是说,将上述三个手动步骤转换为嵌套循环?嵌套循环是否可以完成,或者是否有更好的方法从Main文件夹自动执行上述3项任务

    这就是我迄今为止所尝试的:

    for %i in (*.wav) do sox -S "%i" "Trim5s\%~ni_trim-5.wav" trim 0 0.5 & cd Trim5s & for %j in (*.wav) do sox -S "%j" -b 16 "..\16bit\%~nj_16bit.wav" & cd 16bit & for %k in (*wav) do sox -S --norm=-1 "%k" "..\norm-1\%~nk_norm-1.wav"
    
    任何帮助都将不胜感激

    评论很少:

    • 使用绝对路径而不是“相对路径并更改当前/工作目录”是一个好主意,因为当出现问题时,人们会迷失在这些工作目录中;绝对路径还允许直接链接脚本
    • 避免链接子文件夹也是一个好主意,因为您正在创建一个依赖链,当您更改脚本或添加新脚本时,很难遵循/测试这些依赖链;这降低了维护开销/成本。不过,如果您想这样做,可以随意更改脚本中的目标目录
    • 在脚本中定义函数是个好主意,这样可以提高可读性和可测试性,并允许重用
    在这个脚本中,我定义了解决小问题的前几个函数,最后是实际的批处理:

    function ToColor($color) { process { Write-Host $_ -ForegroundColor $color } }
    function Trim($source, $target) { "sox -S $source $target trim 0 5" | ToColor "green" }
    function To16bits($source, $target) { "sox -S $source -b 16 $target" | ToColor "green" }
    function Norm($source, $target) { "sox -S --norm=-1 $source $target" | ToColor "green" }
    function AddTag($ori, $tag) { return $ori.name -replace '(\w+)(\.wav)', ('$1_' + $tag + '$2') }
    function AddDir($ori, $name) { New-Item -Path $ori -Name $name -ItemType "directory" -Erroraction SilentlyContinue }
    
    function Batch($func, $oriSubDir, $newDir, $tag) {
        AddDir $dir $newDir
        $oriDir = "$dir$oriSubDir"
        $targetDir = "$dir$newDir"
        $files = Get-ChildItem *.wav -Path $oriDir
        "applying <<$tag>> to $(($files | Measure-Object).Count) files from <$oriDir> to <$targetDir>" | ToColor "yellow"
        foreach($file in $files) {
            $target = AddTag $file $tag
            Invoke-Command $func -ArgumentList "$oriDir/$file", "$targetDir/$target"
            New-Item -Path "$targetDir" -ItemType "file" -Name $target # mocks creation of processed file
        }
    }
    
    function ProcessFiles() {
        foreach ($dir in $targetList) {
            "using original files from $dir" | ToColor "yellow"
            Batch ${function:Trim}     ""       "trim5s" "trim"
            Batch ${function:To16bits} "trim5s" "16bits" "16bits"
            Batch ${function:Norm}     "16bits" "Norm-1" "norm"
        }
    }
    
    $targetList = $args | Where-Object {Test-Path $_  -PathType Container}
    $count = ($targetList | Measure-Object).Count
    if($count -eq 0) {
        "usage: Start-BatchSox.ps1 dir1 [dir2 ...]" | ToColor "yellow"
        return
    }
    "Got $count directories to process" | ToColor "yellow"
    ProcessFiles
    
    致:


    脚本可以放在
    Start BatchSox.ps1
    中,它可以放在您路径的某个地方;然后您可以从任何地方调用它(请参阅“用法”消息)。

    这是否回答了您的问题?你可以简单地编辑它,而不是复制你自己。到目前为止,你自己尝试了什么,你被困在哪里?你不是新来的,所以你应该清楚这个网站不是一个免费的代码/脚本编写服务,而且“有没有办法”的问题在这里不是很受欢迎……这是一个[]问题,为什么不以你无效和不必要的单行[]为例,并将其分解为多行括号块,以便在批处理文件中运行。这将使我们和你自己更容易遵循你的个人步骤。您可以阅读如何在批处理脚本中使用,方法是打开一个窗口,键入
    for/?
    ,然后按
    [ENTER]
    键。@Joe我每次都用
    Invoke命令来编辑我的答案,而不是
    Trim
    function ToColor($color) { process { Write-Host $_ -ForegroundColor $color } }
    function Trim($source, $target) { "sox -S $source $target trim 0 5" | ToColor "green" }
    function To16bits($source, $target) { "sox -S $source -b 16 $target" | ToColor "green" }
    function Norm($source, $target) { "sox -S --norm=-1 $source $target" | ToColor "green" }
    function AddTag($ori, $tag) { return $ori.name -replace '(\w+)(\.wav)', ('$1_' + $tag + '$2') }
    function AddDir($ori, $name) { New-Item -Path $ori -Name $name -ItemType "directory" -Erroraction SilentlyContinue }
    
    function Batch($func, $oriSubDir, $newDir, $tag) {
        AddDir $dir $newDir
        $oriDir = "$dir$oriSubDir"
        $targetDir = "$dir$newDir"
        $files = Get-ChildItem *.wav -Path $oriDir
        "applying <<$tag>> to $(($files | Measure-Object).Count) files from <$oriDir> to <$targetDir>" | ToColor "yellow"
        foreach($file in $files) {
            $target = AddTag $file $tag
            Invoke-Command $func -ArgumentList "$oriDir/$file", "$targetDir/$target"
            New-Item -Path "$targetDir" -ItemType "file" -Name $target # mocks creation of processed file
        }
    }
    
    function ProcessFiles() {
        foreach ($dir in $targetList) {
            "using original files from $dir" | ToColor "yellow"
            Batch ${function:Trim}     ""       "trim5s" "trim"
            Batch ${function:To16bits} "trim5s" "16bits" "16bits"
            Batch ${function:Norm}     "16bits" "Norm-1" "norm"
        }
    }
    
    $targetList = $args | Where-Object {Test-Path $_  -PathType Container}
    $count = ($targetList | Measure-Object).Count
    if($count -eq 0) {
        "usage: Start-BatchSox.ps1 dir1 [dir2 ...]" | ToColor "yellow"
        return
    }
    "Got $count directories to process" | ToColor "yellow"
    ProcessFiles
    
    "sox -S $source $target trim 0 5" | ToColor "green"
    
    sox -S $source $target trim 0 5