명령 줄에서 파일을 일괄 변환하는 방법은 무엇입니까?


3

Nintendo 3DS가 WAV에 사용하는 독점 형식의 음악을 변환하고 있습니다. 이 독점 형식을 변환 할 수있는 유일한 프로그램은 다음과 같이 입력을받는 명령 행 프로그램입니다.

convert.exe -o converted music.wav inputfile.differentformat

폴더의 모든 파일에 대해이 프로그램을 실행하고 원래 파일 이름을 유지하는 방법을 알고 싶습니다. 예를 들어 music1.differentformat, music2.differentformatmusic3.differentformat 이라는 3 개의 파일이 있으면 convert.exe 라는 명령 행 프로그램을 실행하고 music1.wav, music2.wav, music3.wav 라는 3 개의 wav 파일을 생성합니다 .

답변:


1

배치 대신 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-ChildItemPowerShell은에 해당합니다 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문자열로 저장된 명령을 실행하는 데 사용됩니다. 이것은 외부 명령에 대한 인수를 미리 어셈블 한 다음 해당 명령을 해당 인수와 함께 실행해야하는 상황과 같은 상황에 유용합니다.

스크립트 흐름

  1. 처음 세 줄은 나중에 파일 경로를 구성하는 데 사용할 변수를 설정합니다.
  2. 네 번째 줄은 확장명이 일치하는의 Get-ChildItem모든 파일을 가져와 파이프 라인을 따라 전달 $MusicFolder하는 데 사용 됩니다 $InputFormat.
  3. 다섯 번째 줄에서 ForEach-Object전송 된 파일을 가져 와서 Get-ChildItem나머지 스크립트 블록을 각각에 대해 실행합니다.
  4. 다음 세 줄은 적절한 인수를 제공하는 데 필요한 파일 경로 세부 사항을 추가로 빌드하는 데 사용됩니다 convert.exe.
    • BaseName 폴더 구조와 파일 확장자를 제외한 파일 이름 만 포함하는 파일 객체의 속성입니다.
    • $InputPath및 에서 이스케이프 된 큰 따옴표를 유의하십시오 $OutputPath. 이것은 실제 문자열 값이 그 주위에 큰 따옴표를 갖기 때문에 공백과 다른 특수 문자가있는 경로를 올바르게 처리하기 위해 귀하의 명령 줄 유틸리티가 필요할 가능성이 높기 때문입니다.
  5. 닫기 괄호 앞의 마지막 줄은 모든 것을 하나로 묶고 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"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.