1 votes

Les commandes Powershell ne fonctionnent pas correctement via le fichier batch

Le script reçoit un paramètre envoyé par le fichier batch, lit un fichier Music Logs et génère une liste avec un en-tête et deux colonnes contenant le nom de la musique et la valeur LUFS de chaque musique, selon une plage de valeurs LUFS.

Lorsque j'exécute la commande en dehors du fichier batch, le script fonctionne correctement, mais lorsque je l'exécute via le fichier batch, la liste est générée de manière incorrecte.

script :

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 

Commande exécutée dans le fichier batch pour exécuter le script :

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

El %_vLUF% est le paramètre passé au script.

Liste correctement générée par le script exécuté en dehors du fichier batch :
enter image description here

Liste générée, de manière incorrecte, par le script exécuté via un fichier batch :
enter image description here

Nota:
Via un fichier batch, le script coupe le nom de la musique avec plus de caractères et coupe également la colonne LUFS.

La commande Out-file ne génère pas correctement le fichier .txt lorsque le script est exécuté via un fichier batch. Dois-je ajouter une autre commande à mon script pour qu'il s'exécute correctement via un fichier batch ?

1voto

Clamarc Points 305

C'est la liste générée correctement par le script lorsqu'il est exécuté, en tant qu'administrateur, via un fichier batch : enter image description here

Il s'agit de la liste générée incorrectement par le script lorsqu'il est exécuté, sans être administrateur, via un fichier batch : enter image description here

C'est le Paragraphe du fichier batch qui va générer les fichiers Log et exécuter le script powershell script :

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%'"

Il n'y a aucun problème dans le script ou dans une commande du script, nous devons faire une analyse concernant les priorités d'exécution d'un script lorsqu'il est exécuté via un fichier batch.

El mode dans le fichier batch définit la taille de l'écran (largeur x hauteur) qui sera affichée à l'utilisateur lorsque le batch sera exécuté.

Lorsque nous exécutons le script en mode administrateur, par le test que j'ai fait, il prend le contrôle du traitement et, dans ce cas, la commande Out-file génère les informations selon ce qui est défini dans le script, générant ainsi correctement le texte du fichier.

Lorsque nous exécutons le script en mode normal, il ne prend pas le contrôle du traitement et la commande Out-file génère le fichier texte avec la taille de la largeur de l'écran définie dans le paragraphe du fichier batch. Comme il y a une musique dont le nom est supérieur à 111 caractères (qui est la valeur définie dans le paragraphe de la commande mode du fichier batch), la commande coupe le reste des informations du fichier et tout ce qui dépasse 111 caractères n'est pas écrit dans le fichier texte.

Je ne sais pas si cela serait un bug, mais nous devrions analyser que chaque script powershell qui est exécuté via un fichier batch, devrait avoir la pleine priorité lors de l'exécution de ses commandes, indépendamment d'être appelé en mode admin ou en mode normal.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X