从powershell中的m3u文件中提取文件名的脚本

Posted

技术标签:

【中文标题】从powershell中的m3u文件中提取文件名的脚本【英文标题】:Script to extract filename from m3u file in powershell 【发布时间】:2016-07-25 00:37:41 【问题描述】:

我对 powershell 非常陌生,并且刚刚开始学习这个程序的深度。我的问题是我得到了大量的信息,我无法掌握所有这些信息,而且我迷失了许多相互矛盾的方法。这是我到目前为止所尝试的以及我收到的错误消息。如果有人能告诉我我做错了什么并且至少给出如何解决它的提示,我会很高兴。提前致谢。

脚本

$PlaylistName = Read-Host 'Playlist filename (Include drive and path):'
$Directory = Read-Host 'Target Directory (Include drive and path):'
Write-Host "Searching "$PlaylistName" for media files and copying to "$Directory"`n"
Get-Content $PlaylistName | where $+.trim() -ne ""  | Out-File Temp.txt
get-content Temp.txt | select-string -pattern "#EXTINF:0" -notmatch | Out-File Musiclist.txt

播放列表在这里:https://gist.github.com/zipster1967/ddc5ce0d81e70f3e59cf0dfb2b224704

当我运行此脚本时,我收到以下错误消息,但我不确定它的含义。

在 line:4 char:44 + 获取内容 $PlaylistName |其中 $+.trim() -ne "" |文件外温度... + ~ '(' 之后应该有一个表达式。 + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : ExpectedExpression

线

获取内容 $PlaylistName |其中 $+.trim() -ne "" |输出文件 Temp.txt

我来自http://www.pixelchef.net/remove-empty-lines-file-powershell

好的,根据建议,我现在有一个部分工作的脚本。我使用以下脚本将所有文件放入名为 Temp.txt 的文本文件中:

$PlaylistName = Read-Host 'Playlist filename (Include drive and path):'
$Directory = Read-Host 'Target Directory (Include drive and path):'
Write-Host "Searching "$PlaylistName" for media files and copying to "$Directory"`n"
Get-Content $PlaylistName |  ?  $_ -and (Test-Path $_)  | Out-File Temp.txt

现在我只需要了解如何让 copy-item 命令读取 Temp.txt 文件并将文件复制到 $Directory 文件夹中。我的猜测是我需要添加该行

Get-Content Temp.txt | Copy-Item -Destination $Directory

我希望这是正确的。 (在 PowerShell 中还有很多东西要学。)

【问题讨论】:

$+ 是一个错误,应该是$_ 您的来源,pixelchef,显示了 $_ 而不是 $+ 的正确用法。 【参考方案1】:

试试这个:

 cat .\test.m3u | ?  $_ -and (Test-Path $_)   

第一个 $_ 将跳过空行,另一个将基本上跳过所有内容而不是文件。

【讨论】:

好的,帮助很大。现在我有以下内容:code$PlaylistName = Read-Host '播放列表文件名(包括驱动器和路径):' $Directory = Read-Host '目标目录(包括驱动器和路径):' Write-Host "Searching "$ PlaylistName”用于媒体文件并复制到“$Directory”n" Get-Content $PlaylistName | ? $_ -and (Test-Path $_) | Out-File Temp.txt code` 现在我只需要了解如何获取 copy-item 命令来读取 Temp.txt 文件并将文件复制到 $Directory 文件夹中。跨度> 【参考方案2】:

如果要获取文件名,可以使用带有简单正则表达式的 Select-String cmdlet 来排除任何以 # 开头的行。

然后您可以遍历标题并使用GetFileNameWithoutExtension 方法检索不带扩展名的文件名:

Get-Content c:\test.m3u |
  Select-String '^[^#]' | 
  foreach  [System.IO.Path]::GetFileNameWithoutExtension($_) 

结果示例:

A Sign Of The Times
A White Sport Coat (And A Pink Carnation)
Abracadabra
Accidents Never Happen
Addicted To Love
African Killer Bees
Ahab The Arab
Aint Got Rhythm
Ain't No Way To Treat A Lady
Ain't that a Kick in the Head
Ain't That a Shame
Albequerque
Alison
All About That Bass
All Fired Up
All for love ~Rod Stewart_Sting
All I Care About
All I Have To Do Is Dream
All I Wanna Do
All I Want Is You
All My Rowdy Friends Are Coming Over Tonight
All Revved Up With No Place To Go
All Shook Up

【讨论】:

您可以使用([IO.FileInfo]$_).BaseName 将字符串转换为文件名,并获得不带扩展名的名称。【参考方案3】:

好的,我得到了一个可以按照我想要的方式运行的脚本。如下:

cls
$PlaylistName = Read-Host 'Playlist filename (Include drive and path)'
$Directory = Read-Host 'Target Directory (Include drive and path)'
Write-Host "Searching "$PlaylistName" for media files and copying to "$Directory"`n"
Get-Content $PlaylistName |  ?  $_ -and (Test-Path $_)  | Out-File Temp.txt
Get-Content Temp.txt | Copy-Item -Destination $Directory 
write-host "Operation Completed."

虽然它仍然有点笨重,但它可以工作。我想知道是否有办法在文件复制过程中显示某种进度条,甚至在复制文件时显示文件名。此外,如果我可以让脚本让用户从驱动器上的任何位置选择播放列表名称并使用 Windows 资源管理器选择目标目录,那就太好了。我知道目前这些东西远远超出了我的想象,但如果可能的话,我很想从 powershell 中学习这种东西。感谢到目前为止的所有帮助。我喜欢在没有扩展名的情况下显示歌曲名称的想法,即使我不需要它用于 opresent 脚本。我将来可能会使用它。一旦我清理它并使它看起来“漂亮”,甚至可能对这个脚本进行改进

【讨论】:

在最近的 PowerShell 版本中,有一个 Write-Progress commandlet 可以显示进度条。您必须更改脚本以计算有多少文件,循环它们,以及循环内的 write-progress 和 copy-item。您可以使用 System.Windows.Forms.OpenFileDialog like this example 使用 Windows 标准 GUI 提示符提示输入文件名 有没有办法只去掉没有路径的文件名,以便我可以将列表中的文件名与文件夹中的文件进行比较,以便以后将新文件复制到文件夹中? 【参考方案4】:
#Instruction - Create a New folder where you want the tracks to be copied to
#Export the play into the newly created folder as m3u.
#Run this script and browse to the exported playlist txt file
#This script will then copy all the files in that playlist to that folder
#Script written by Clive Foley on 22/06/2017

#Import track details
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = "m3u (*.m3u)| *.m3u"
$OpenFileDialog.ShowDialog() | Out-Null


#Import Playlist and collect file path and copy file.
$locations = Get-Content ($OpenFileDialog.filename) | Select-String '^[^#]'

#Set Copy Location
$Des = (split-path ($OpenFileDialog.filename) -Parent)

#Copy tracks
$i=0
foreach ($Track in $locations)

copy "$track" "$des"
Write-Progress -activity "Copying $Track"`
-Status "`Tracks copied  = $i" `
-PercentComplete ($i / $loc.count*100)
 

【讨论】:

以上是关于从powershell中的m3u文件中提取文件名的脚本的主要内容,如果未能解决你的问题,请参考以下文章

从Powershell中的文本文件中输入值

PowerShell - 递归提取特定文件夹的内容

如何编写Powershell脚本以提取.iso文件并通过创建文件夹将其复制到文件夹中

在 PowerShell 中将大型 blob 从 SQL Server 提取到文件需要很长时间

从文件中提取数据并使用powershell将其分类到新文件中

TagLib - 从 MP3 中提取专辑封面 (Powershell)