Los comandos de Powershell no funcionan correctamente a través de un archivo por lotes

Los comandos de Powershell no funcionan correctamente a través de un archivo por lotes

El script recibe un parámetro enviado por el archivo por lotes, lee un archivo de registros de música y genera una lista con un encabezado y dos columnas que contienen el nombre de la música y el valor LUFS de cada música, según un rango de valores LUFS.

Cuando ejecuto el comando fuera del archivo por lotes, el script funciona correctamente, pero cuando lo ejecuto mediante un archivo por lotes, la lista se genera incorrectamente.

Guion:

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 

Comando ejecutado en el archivo por lotes para ejecutar el script:

powershell.exe -executionpolicy remotesigned -File "D:\z_Batchs and Scripts\Batchs\LUFS_Normalize\ArqsNorms_LUFS_pass.ps1" %_vLUF%

La %_vLUF%variable es el parámetro pasado al script.

Lista generada correctamente por el script ejecutado fuera del archivo por lotes:
ingrese la descripción de la imagen aquí

Lista generada incorrectamente por el script ejecutado mediante un archivo por lotes:
ingrese la descripción de la imagen aquí

Nota:
A través de un archivo por lotes, el script corta el nombre de la música con más caracteres y también corta la columna LUFS.

El comando Out-file no genera el archivo .txt correctamente cuando el script se ejecuta mediante un archivo por lotes. ¿Necesito agregar algún otro comando a mi script para que se ejecute correctamente mediante un archivo por lotes?

Respuesta1

Esta es la lista que genera correctamente el script cuando se ejecuta, como administrador, vía archivo por lotes: ingrese la descripción de la imagen aquí

Esta es la lista que genera incorrectamente el script cuando se ejecuta, sin ser administrador, vía archivo por lotes: ingrese la descripción de la imagen aquí

Este es el párrafo en el archivo por lotes que generará los archivos de registro y ejecutará el script de 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%'"

No hay ningún problema en el script ni en ningún comando del script, debemos hacer un análisis respecto a las prioridades de ejecución de un script cuando se ejecuta vía archivo por lotes.

El modecomando en el archivo por lotes define el tamaño de la pantalla (ancho x alto) que se mostrará al usuario cuando se ejecute el lote.

Cuando ejecutamos el script en modo administrador, según la prueba que hice, toma el control del procesamiento y, en este caso, el comando Out-file genera la información según lo definido en el script, generando así correctamente el texto del archivo. .

Cuando ejecutamos el script en modo normal, no toma el control del procesamiento y el comando Out-file genera el archivo de texto con el tamaño del ancho de pantalla definido en el párrafo del archivo por lotes. Como hay una música cuyo nombre tiene más de 111 caracteres (que es el valor definido en el modecomando del archivo por lotes), el comando corta el resto de la información del archivo y todo lo que pasa después de 111 caracteres no se escribe en el archivo de texto.

No sé si esto sería un error, pero deberíamos analizar que cada script de powershell que se ejecuta vía archivo por lotes, tendría que tener prioridad total al ejecutar sus comandos, independientemente de que sea llamado en modo administrador o en modo normal.

información relacionada