Batch file 自动批处理-修剪、更改比特率,然后通过Windows上的sox规范化wav文件
我想批量处理文件夹中的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 |____
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
目前,我每次都手动执行每个步骤。以下是Windowscmd
命令:
步骤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