![Powershell-Befehle funktionieren über die Batchdatei nicht richtig](https://rvso.com/image/1671514/Powershell-Befehle%20funktionieren%20%C3%BCber%20die%20Batchdatei%20nicht%20richtig.png)
Das Skript empfängt einen von der Batchdatei gesendeten Parameter, liest eine Musikprotokolldatei und generiert eine Liste mit einer Kopfzeile und zwei Spalten, die den Musiknamen und den LUFS-Wert jedes Musikstücks entsprechend einem LUFS-Wertebereich enthalten.
Wenn ich den Befehl außerhalb der Batchdatei ausführe, funktioniert das Skript ordnungsgemäß. Wenn ich es jedoch über eine Batchdatei ausführe, wird die Liste falsch generiert.
Skript:
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
In der Batchdatei auszuführender Befehl zum Ausführen des Skripts:
powershell.exe -executionpolicy remotesigned -File "D:\z_Batchs and Scripts\Batchs\LUFS_Normalize\ArqsNorms_LUFS_pass.ps1" %_vLUF%
Die %_vLUF%
Variable ist der an das Skript übergebene Parameter.
Vom außerhalb der Batchdatei ausgeführten Skript korrekt generierte Liste:
Vom per Batchdatei ausgeführten Skript falsch generierte Liste:
Hinweis:
Über eine Batchdatei schneidet das Skript den Musiknamen mit mehr Zeichen ab und schneidet auch die LUFS-Spalte ab.
Der Out-file-Befehl generiert die TXT-Datei nicht korrekt, wenn das Skript über eine Batchdatei ausgeführt wird. Muss ich meinem Skript einen anderen Befehl hinzufügen, damit es über die Batchdatei korrekt ausgeführt wird?
Antwort1
Dies ist die Liste, die vom Skript korrekt generiert wird, wenn es als Administrator über eine Batchdatei ausgeführt wird:
Dies ist die Liste, die vom Skript fälschlicherweise generiert wird, wenn es ohne Administratorrechte über eine Batchdatei ausgeführt wird:
Dies ist der Absatz in der Batchdatei, der die Protokolldateien generiert und das Powershell-Skript ausführt:
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%'"
Es liegt kein Problem im Skript oder in einem der Befehle des Skripts vor. Wir müssen eine Analyse hinsichtlich der Ausführungsprioritäten eines Skripts durchführen, wenn es über eine Batchdatei ausgeführt wird.
Der mode
Befehl in der Batchdatei definiert die Bildschirmgröße (Breite x Höhe), die dem Benutzer bei der Ausführung des Batches angezeigt wird.
Wenn wir das Skript im Administratormodus ausführen, übernimmt es gemäß dem von mir durchgeführten Test die Kontrolle über die Verarbeitung und in diesem Fall generiert der Befehl Out-file die Informationen entsprechend der Definition im Skript und generiert so den Dateitext korrekt.
Wenn wir das Skript im normalen Modus ausführen, übernimmt es nicht die Kontrolle über die Verarbeitung und der Befehl Out-file generiert die Textdatei mit der Größe der Bildschirmbreite, die im Absatz der Batchdatei definiert ist. Da es ein Musikstück gibt, dessen Name länger als 111 Zeichen ist (das ist der im mode
Befehl der Batchdatei definierte Wert), schneidet der Befehl den Rest der Dateiinformationen ab und alles nach 111 Zeichen wird nicht in die Textdatei geschrieben.
Ich weiß nicht, ob dies ein Fehler wäre, aber wir sollten analysieren, dass jedes Powershell-Skript, das über eine Batchdatei ausgeführt wird, bei der Ausführung seiner Befehle volle Priorität haben muss, unabhängig davon, ob es im Administratormodus oder im normalen Modus aufgerufen wird.