![バッチファイル経由でPowershellコマンドが正しく動作しない](https://rvso.com/image/1671514/%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%B5%8C%E7%94%B1%E3%81%A7Powershell%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%8F%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%AA%E3%81%84.png)
スクリプトはバッチ ファイルによって送信されたパラメーターを受け取り、Music Logs ファイルを読み取り、LUFS 値の範囲に従って、ヘッダーと、音楽名と各音楽の LUFS 値を含む 2 つの列を含むリストを生成します。
バッチ ファイルの外部でコマンドを実行するとスクリプトは正常に動作しますが、バッチ ファイル経由で実行するとリストが正しく生成されません。
脚本:
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 スクリプトは、管理者モードで呼び出されるか通常モードで呼び出されるかに関係なく、コマンドを実行するときに完全な優先順位を持つ必要があることを分析する必要があります。