2017-10-08 10 views
0

私はPowerShellを初めて使用しています。だから私はここにこれが可能かどうかを誰にも知ってもらうかどうかを尋ねる。ファイルをソングの長さでサブフォルダに分割する

私は1000個のmp3ファイルをフォルダに持っている。そして、それらをサブフォルダに分割したいと思いますが、各サブフォルダの再生時間は1時間、またはできるだけ1時間近く(好ましくは1時間以上)にする必要があります。

私はmp3ファイルの長さ(通常2〜4分)を見なければなりません。そして、私は最初に十分なmp3ファイルを得て、合計で1時間の再生時間にします。それらをサブフォルダに移動し、List *n*という名前を付けます。ここで、各サブフォルダに対してnが増分されます。同様:リスト1、リスト2、リスト3

これは可能ですか?

+2

は、PowerShellのmp3の*期間をもう一度検索してください*長さの代わりに、長さはファイルサイズの方が一般的です。 https://superuser.com/questions/704575/get-song-duration-from-an-mp3-file-in-a-scriptおよびhttps://geekeefy.wordpress.com/2016/10/15/powershell- get-mp3mp4-files-metadata-how-to-use-it-to-make-you-life-easy/ – TessellatingHeckler

+0

ありがとう、私はこれを見てみよう –

+0

@TessellatingHeckler下の私の答えをチェックしてください。私はそれを働かせることができましたが、改善の余地があります。あなたはそれを見てみることができますか?どのようにエラーを取り除くのですか? –

答えて

1

更新:ここに作業スクリプトがあります!それを解決するために管理! :) プレイリストのパス(すべてのサブフォルダが作成されるメインディレクトリ)を編集します。また、プレイリストの長さを編集してください!

Function Get-MP3Data 
{ 
    [CmdletBinding()] 
    [Alias()] 
    [OutputType([Psobject])] 
    Param 
    (
     [String] [Parameter(Mandatory=$true, ValueFromPipeline=$true)] $Directory 
    ) 

    Begin 
    { 
     $shell = New-Object -ComObject "Shell.Application" 
    } 
    Process 
    { 

     Foreach($Dir in $Directory) 
     { 
      $ObjDir = $shell.NameSpace($Dir) 
      $Files = gci $Dir| ?{$_.Extension -in '.mp3','.mp4'} 

      Foreach($File in $Files) 
      { 
       $ObjFile = $ObjDir.parsename($File.Name) 
       $MetaData = @{} 
       $MP3 = ($ObjDir.Items()|?{$_.path -like "*.mp3" -or $_.path -like "*.mp4"}) 
       $PropertArray = 0,1,2,12,13,14,15,16,17,18,19,20,21,22,27,28,36,220,223 

       Foreach($item in $PropertArray) 
       { 
        If($ObjDir.GetDetailsOf($ObjFile, $item)) #To avoid empty values 
        { 
         $MetaData[$($ObjDir.GetDetailsOf($MP3,$item))] = $ObjDir.GetDetailsOf($ObjFile, $item) 
        } 

       } 

       New-Object psobject -Property $MetaData |select *, @{n="Directory";e={$Dir}}, @{n="Fullname";e={Join-Path $Dir $File.Name -Resolve}}, @{n="Extension";e={$File.Extension}} 
      } 
     } 
    } 
    End 
    { 
    } 
} 

# Create playlist 
$TotalLength = 0 
$MaxLength = 3600 
$TempPlaylist = @() 
$PlaylistName = 1 
$PlaylistPath = "C:\Users\Admin\Desktop\New folder" 

if ($TotalLength -lt $MaxLength) 
{ 
    ForEach($item in ($PlaylistPath |Get-Mp3Data)){ 

     # Get all song names and song durations 
     $SongName = $item.Fullname 
     $Seconds = [int](([datetime]$item.Length).TimeOfDay.TotalSeconds) 

     # Append song duration to total length and add song to temporary playlist 
     $TotalLength += $Seconds 
     $TempPlaylist += ,$SongName 

     # Create a folder for the playlist if it doesn't exist 
     if (!(test-path $PlaylistPath\$PlaylistName)) 
     { 
      New-item -ItemType Directory -Force -Name $PlaylistName -Path $PlaylistPath 
      Write-Host Created new folder $PlaylistName 
     } 

     # Check if the total length is >= maxlength, then move temporary playlist to a new folder 
     if ($TotalLength -ge $MaxLength) 
     { 
      # Loop through all songs in the temporary playlist 
      For($i=0; $i -lt $TempPlaylist.length; $i++) 
      { 
       Move-Item -Path $TempPlaylist[$i] -Destination $PlaylistName 
       Write-Host Moved file $TempPlaylist[$i] to $PlaylistName 
      } 

      # Increment playlist folder name 
      $PlaylistName++ 

      # Reset the temporary playlist 
      $TempPlaylist = @() 

      # Reset the temporary playlist length 
      $TotalLength = 0 
     } 
    } 
} 

(mp3ファイルをプレイリストに挿入する前に、ランダムにソートされるように)、それにランダム化を追加するには、単に

​​に

ForEach($item in ($PlaylistPath | Get-Mp3Data)){ 

を変更

関連する問題