배치 대신 PowerShell을 사용해보십시오. PowerShell의 장점은 일반 명령 줄 유틸리티에 대한 액세스 권한을 유지하면서 PowerShell과 함께 제공되는 고급 스크립팅 기능 및 명령을 활용할 수 있다는 것입니다.
원래 게시물을 감안할 때 변환 유틸리티의 명령 구문은 다음과 같습니다.
convert.exe -o converted [output filename] [input filename]
이 구문이 틀리면 그에 따라 아래 스크립트를 조정해야합니다.
스크립트 템플릿
$MusicFolder = '[Full path to music folder]'
$InputFormat = '[Extension for input files]'
$OutputFormat = '[Extension for output files]'
Get-ChildItem "$MusicFolder\*.$InputFormat" |
ForEach-Object {
$Filename = $_.BaseName
$InputPath = "`"$MusicFolder\$Filename.$InputFormat`""
$OutputPath = "`"$MusicFolder\$Filename.$OutputFormat`""
Invoke-Expression "convert.exe -o converted $OutputPath $InputPath"
}
나는 위의 많은 부분을 테스트 하지 않았는데, 주로 사용중인 유틸리티가 무엇인지 모르기 때문에 원칙적으로 작동해야하기 때문입니다. 다음은 명령과 흐름에 대한 일반적인 분석입니다.
기본 컨셉
- 형식
$[Name] = [Stuff]
은 모두 변수 할당입니다.
Get-ChildItem
PowerShell은에 해당합니다 dir
. 그러나 대부분의 PowerShell 명령과 마찬가지로 주요 차이점 dir
은 콘솔 출력을위한 문자열을 Get-ChildItem
반환 하는 반면 개체를 다른 명령으로 파이프 할 때 사용할 수있는 메서드와 속성이있는 개체를 실제로 반환한다는 것입니다.
- 파이프 문자 (
|
}는 콘솔에 결과를 단순히 표시하는 대신 추가 처리를 위해 한 명령의 출력을 다른 명령으로 리디렉션합니다.
ForEach-Object
배열로 객체를 가져 와서 각각에 대해 일련의 명령을 실행합니다.
$_
PowerShell에서 처리중인 현재 개체를 참조하기 위해 사용하는 기본 제공 변수입니다.
$[Name].[Something]
변수의 속성 또는 메서드를 나타냅니다. PowerShell은 기본적으로 간단한 문자열이 아닌 개체와 함께 작동합니다.
'[Words and Stuff]'
기본 정적 문자열을 나타냅니다.
"[Words and Stuff]"
또한 문자열을 나타냅니다. 그러나 큰 따옴표는 PowerShell에 내부 변수를 확장하도록 지시하기 때문에 특별합니다.
$x = 'world'; Write-Output "Hello $x"
출력 Hello world
합니다.
$x = 'world'; Write-Output 'Hello $x'
출력 Hello $x
합니다.
- 억음 악센트 (
`
)는 이스케이프 문자로, PowerShell 구문에서 기능적 의미가있는 경우 특수 문자로 처리하는 대신 다음 문자를 그대로 문자열에 포함하도록 PowerShell에 지시합니다.
Invoke-Expression
문자열로 저장된 명령을 실행하는 데 사용됩니다. 이것은 외부 명령에 대한 인수를 미리 어셈블 한 다음 해당 명령을 해당 인수와 함께 실행해야하는 상황과 같은 상황에 유용합니다.
스크립트 흐름
- 처음 세 줄은 나중에 파일 경로를 구성하는 데 사용할 변수를 설정합니다.
- 네 번째 줄은 확장명이 일치하는의
Get-ChildItem
모든 파일을 가져와 파이프 라인을 따라 전달 $MusicFolder
하는 데 사용 됩니다 $InputFormat
.
- 다섯 번째 줄에서
ForEach-Object
전송 된 파일을 가져 와서 Get-ChildItem
나머지 스크립트 블록을 각각에 대해 실행합니다.
- 다음 세 줄은 적절한 인수를 제공하는 데 필요한 파일 경로 세부 사항을 추가로 빌드하는 데 사용됩니다
convert.exe
.
BaseName
폴더 구조와 파일 확장자를 제외한 파일 이름 만 포함하는 파일 객체의 속성입니다.
$InputPath
및 에서 이스케이프 된 큰 따옴표를 유의하십시오 $OutputPath
. 이것은 실제 문자열 값이 그 주위에 큰 따옴표를 갖기 때문에 공백과 다른 특수 문자가있는 경로를 올바르게 처리하기 위해 귀하의 명령 줄 유틸리티가 필요할 가능성이 높기 때문입니다.
- 닫기 괄호 앞의 마지막 줄은 모든 것을 하나로 묶고
convert.exe
적절한 인수로 실행됩니다 .
스크립트 예
$MusicFolder = 'C:\Users\Me\My Documents\Music'
$InputFormat = 'mp3'
$OutputFormat = 'wav'
Get-ChildItem "$MusicFolder\*.$InputFormat" |
ForEach-Object {
$Filename = $_.BaseName
$InputPath = "`"$MusicFolder\$Filename.$InputFormat`""
$OutputPath = "`"$MusicFolder\$Filename.$OutputFormat`""
Invoke-Expression "convert.exe -o converted $OutputPath $InputPath"
}