Powershell 命令无法通过批处理文件正常工作

Powershell 命令无法通过批处理文件正常工作

该脚本接收批处理文件发送的参数,读取音乐日志文件并根据 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 脚本在执行其命令时都必须具有完全优先级,无论是在管理员模式下还是在正常模式下调用。

相关内容