该脚本接收批处理文件发送的参数,读取音乐日志文件并根据 LUFS 值范围生成一个列表,该列表具有一个标题和两列,其中包含音乐名称和每首音乐的 LUFS 值。
当我在批处理文件之外运行该命令时,脚本可以正常工作,但是当我通过批处理文件运行该命令时,列表生成不正确。
脚本:
Param(
[decimal]$env:_vLUF
)
[decimal]$vLUFps = $env:_vLUF
$files = "C:\Users\$env:username\Desktop\Logs_LUFS\List Music FOR NORMALIZATION.txt"
$logs = "C:\Users\$env:username\Desktop\Logs_Musics"
# READ LOG files of Musics and generates the List Music FOR NORMALIZATION.txt ($files)
$logMatches = Select-String -Path "C:\Users\$env:username\Desktop\Logs_Musics\*.*" -Pattern '(?<I>^ +I:) +(?<LUFS>.+)|(?<I>^Input Integrated:) +(?<LUFS>.+)' -List | Select-Object -Property FileName -ExpandProperty Matches
$results = foreach ($log in $logMatches) {
$pos = $log.Filename.IndexOf("_")
$leftPart = $log.Filename.Substring(0, $pos)
$rightPart = $log.Filename.Substring($pos+1)
$LUFS = $log.Groups | Where-Object { $_.Name -eq "LUFS" }
[PSCustomObject]@{
Música = $rightPart
LUFS = [decimal]$($LUFS.Value -replace " .*")
}
}
$vLUFpsLess= ($vLUFps)+ (-0.9)
$vLUFpsGreat= ($vLUFps)+ (-0.5)
$results | Where-Object {($_.LUFS -lt $vLUFpsLess) -or ($_.LUFS -gt $vLUFpsGreat) } | Out-file $files
运行脚本的批处理文件中执行的命令:
powershell.exe -executionpolicy remotesigned -File "D:\z_Batchs and Scripts\Batchs\LUFS_Normalize\ArqsNorms_LUFS_pass.ps1" %_vLUF%
该%_vLUF%
变量是传递给脚本的参数。
注意:
通过批处理文件,脚本会剪切掉包含更多字符的音乐名称,还会剪切掉 LUFS 列。
当通过批处理文件执行脚本时,Out-file 命令无法正确生成 .txt 文件。我是否需要向脚本添加其他命令,以便它通过批处理文件正确运行?
答案1
这是批处理文件中的段落,它将生成日志文件并运行 powershell 脚本:
REM ============================================== PARAGRAPH GENERATES LOGS ============================================
:LOGFILES
cls
mode 111,08
FOR /F "delims=" %%a in ('where .:*.* ^|findstr /vi "_LOUDNORM _EBU"') DO (
ffmpeg -hide_banner -i "%%a" -af ebur128 -f null NUL 2> "C:\Users\%username%\Desktop\Logs_LUFS\LOG_%%~na%%~xa"
)
REM Run the Powershell script in normal mode:
REM powershell.exe -executionpolicy remotesigned -File "D:\z_Batchs e Scripts\Batchs\Normaliza_LUFS\ArqsNorms_LUFS_pass.ps1" %_vLUF%
REM Run the Powershell script in administrator mode:
REM powershell -NoProfile -ExecutionPolicy Bypass -Command "Start-Process -Verb RunAs powershell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File \"D:\z_Batchs e Scripts\Batchs\Normaliza_LUFS\ArqsNorms_LUFS_pass.ps1\" -_vLUF %_vLUF%'"
脚本或者脚本中的任何命令都没有问题,我们必须对脚本通过批处理文件执行时的执行优先级进行分析。
批处理文件中的命令mode
定义了执行批处理时将显示给用户的屏幕尺寸(宽度x高度)。
当我们在管理员模式下运行脚本时,通过我所做的测试,它会控制处理,在这种情况下,Out-file 命令会根据脚本中定义的内容生成信息,从而正确生成文件文本。
当我们在正常模式下运行脚本时,它不会控制处理,Out-file 命令会生成文本文件,其大小与批处理文件段落中定义的屏幕宽度相同。由于有一首音乐的名称长度超过 111 个字符(这是mode
批处理文件命令中定义的值),因此该命令会剪切文件信息的其余部分,并且 111 个字符之后的所有内容都不会写入文本文件。
我不知道这是否会是一个错误,但我们应该分析一下,通过批处理文件执行的每个 powershell 脚本在执行其命令时都必须具有完全优先级,无论是在管理员模式下还是在正常模式下调用。