![Powershell 명령이 배치 파일을 통해 올바르게 작동하지 않습니다.](https://rvso.com/image/1671514/Powershell%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EB%B0%B0%EC%B9%98%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%ED%86%B5%ED%95%B4%20%EC%98%AC%EB%B0%94%EB%A5%B4%EA%B2%8C%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
스크립트는 배치 파일에서 전송된 매개 변수를 수신하고 음악 로그 파일을 읽고 LUFS 값 범위에 따라 음악 이름과 각 음악의 LUFS 값을 포함하는 헤더와 두 개의 열이 있는 목록을 생성합니다.
배치 파일 외부에서 명령을 실행하면 스크립트가 올바르게 작동하지만 배치 파일을 통해 실행하면 목록이 잘못 생성됩니다.
스크립트:
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 스크립트는 관리 모드 또는 일반 모드에서 호출되는지에 관계없이 명령을 실행할 때 전체 우선 순위를 가져야 한다는 점을 분석해야 합니다.