2016-10-19 222 views
1

我有一個設置,從12個文件夾中選擇一打隨機選擇的mpg,然後發送到播放列表播放。我試圖添加的是能夠在播放mpg時保持跟蹤或記錄日誌,並且不重放它,直到一個文件夾中的所有mpg被播放一次。換句話說,我將選擇一個隨機文件/洗牌,而不是重複;在任何重複之前播放一次。它也應該能夠跟蹤這個每天關閉和再次打開電腦的日子。選擇隨機,不重複,全部播放,我的播放列表的腳本

我目前正在運行該腳本,我發現。


$formats = 
@("*.mpg") 
$dir = Split-Path $MyInvocation.MyCommand.Path 
gci "$dir\*" -include $formats | Get-Random -Count 1 | 
Invoke-Item 

我想腳本添加到該文件名爲.psl我打電話PlayRandom.ps1

我想腳本來創建一個日誌每個文件的播放,在隨機挑選新文件之前閱讀該日誌。如果文件已被選中,則不要選擇該文件,直到所有文件都播放完畢。然後它可以重置要播放的文件的選擇。基本上,這樣我就可以隨機播放一次,不再重複播放,播放列表的腳本。

+0

你需要保持運行列表(或者,如你所說,日誌 - 但是這不值得磁盤I/O恕我直言)的任何文件的播放。如果你發現你的'Get-Random'在該列表中返回一個文件名,那麼再次執行'Get-Random'直到它不在該列表中。一旦播放完每個項目,重置列表並重新開始。 – gravity

+0

是的,就是這個想法。這會帶來什麼樣的腳本? – ZootScriptRiot

+0

請參閱下面的示例。我確認它按您的要求工作。 – gravity

回答

0

這是一個工作示例。有幾個注意事項/警告:

  1. 我改變文件類型爲以下mp3,因此本次測試代碼工作普遍在Windows機器上的大部分,所以改回mpg如果你需要它。
  2. 我明確指定$dir作爲示例音樂文件夾。根據需要更改。無論如何,我不確定你爲什麼使用$MyInvocation
  3. 爲了計算歌曲的長度,有很多附加的代碼。這樣,它知道在開始下一首曲目之前需要等待多長時間(+5秒)。
  4. 您的默認音頻播放器的行爲將潛在地導致不同的功能。如果您遇到問題,請嘗試使用Windows Media Player,並且它應該可以正常工作。例如,實例化WinAmp或VLC等單獨副本可能會導致問題或內存泄漏。如果開機,請關閉重複!

$formats = @("*.mp3") 
$dir = Split-Path "C:\Users\Public\Music\Sample Music\*" 

$ListOfMPGs = gci "$dir\*" -include $formats 

$ShuffledList = $ListOfMPGs | Sort-Object {Get-Random} 
$COMShell = New-Object -COMObject Shell.Application 

foreach ($MPG in $ShuffledList) 
{ 
    #the below lines retrieve the song length from the file(s) 
    $FolderInfo = Split-Path $MPG 
    $FileInfo = Split-Path $MPG -Leaf 
    $shFolder = $COMShell.NameSpace($FolderInfo) 
    $shFile = $shFolder.ParseName($FileInfo) 
    $MPGLength = $shFolder.GetDetailsOf($shFile, 27) 
    $MPGSecondsToSleep = (([int]$MPGLength.Split(':')[0] * 60 * 60) + ([int]$MPGLength.Split(':')[1] * 60) + ([int]$MPGLength.Split(':')[2]) + 5) 

    #this is where the song gets launched, and when it waits as well  
    Invoke-Item $MPG 
    Write-Host ("Waiting " + $MPGSecondsToSleep) 
    #the above is just so you can see how long it will wait below - omit if desired 
    Start-Sleep -s $MPGSecondsToSleep 
}