![Los comandos de Powershell no funcionan correctamente a través de un archivo por lotes](https://rvso.com/image/1671514/Los%20comandos%20de%20Powershell%20no%20funcionan%20correctamente%20a%20trav%C3%A9s%20de%20un%20archivo%20por%20lotes.png)
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:
Lista generada incorrectamente por el script ejecutado mediante un archivo por lotes:
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:
Esta es la lista que genera incorrectamente el script cuando se ejecuta, sin ser administrador, vía archivo por lotes:
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 mode
comando 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 mode
comando 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.