2016-04-05 4 views
0

Я очень новичок в powershell и только начинаю изучать глубину этой прогмы. Моя проблема заключается в том, что я получаю массу информации, и у меня возникают проблемы с ее пониманием и так много противоречивых методов, которые я теряю. Это то, что я пробовал до сих пор, и сообщение об ошибке, которое я получаю. Если кто-нибудь может сказать мне, что я делаю неправильно, и хотя бы дать подсказку, как это исправить, я был бы очень доволен. Заранее спасибо.Сценарий для извлечения имени файла из файла m3u в powershell

Script

$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

Когда я запускаю этот сценарий, я получаю следующее сообщение об ошибке, и я не уверен, что это значит.

At line:4 char:44 + Get-Content $PlaylistName | where {$+.trim() -ne "" } | Out-File Temp ... + ~ An expression was expected after '('. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : ExpectedExpression

Линия

Get-Content $PlaylistName | where {$+.trim() -ne "" } | Out-File 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 

Теперь я просто должен понять, как получить команду копирования элемента, чтобы прочитать файл temp.txt и скопировать файлов в папку $ Directory. Я предполагаю, что мне нужно добавить строку

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

Надеюсь, что это правильно. (Тем не менее есть много, чтобы учиться в PowerShell.)

+0

'$ +' - ошибка, это должно быть '$ _'. – majkinetor

+0

ваш источник, pixelchef, показывает правильное использование $ _ вместо $ +. – Martin

ответ

1

Попробуйте это:

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

первый $ _ будет пропускать пустые строки, другой будет по существу пропустить все не файл.

+0

Хорошо, что помогло много. Теперь у меня есть следующее: 'code' $ PlaylistName = Read-Host 'Плейлист filename (Включить диск и путь):' $ Directory = Целевая директория для чтения-хоста (включая диск и путь): ' Write-Host" Поиск «$ PlaylistName» для медиафайлов и копирование в «$ Directory» 'n" Get-Content $ PlaylistName | ? {$ _ -and (Test-Path $ _)} | Out-File Temp.txt 'code' Теперь мне просто нужно понять, как получить команду copy-item для чтения файла Temp.txt и скопировать файлы в папку $ Directory. –

2

Если вы хотите получить имя файла, вы можете использовать командлет Select-String с простым регулярным выражением, чтобы исключить любую строку, начинающуюся с #.

Затем вы можете перебирать названия и использовать метод 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 
+0

Вы можете сделать '([IO.FileInfo] $ _). BaseName', чтобы преобразовать строку в имя файла и получить имя без расширения. – TessellatingHeckler

0

Хорошо я получил сценарий, который работает так, как Я хочу этого. Это выглядит следующим образом:

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, если это вообще возможно. Спасибо за всю помощь. Мне нравится идея отображения имен песен без расширения, даже если мне это не нужно для подлинного скрипта.Я могу использовать его в будущем. Возможно, даже в пользу этого сценария, как только я очищу его и сделаю его «Pretty»

+0

В последних версиях PowerShell имеется команда «Write-Progress», которая может отображать индикатор выполнения. Вам придется изменить свой скрипт, чтобы подсчитать, сколько файлов есть, перебрать их и как выполнить запись, так и скопировать элемент внутри цикла. Вы можете запросить имя файла со стандартным приглашением GUI Windows, используя 'System.Windows.Forms.OpenFileDialog' [как этот пример] (http://www.powershellmagazine.com/2013/07/01/pstip-using-the- system-windows-forms-openfiledialog-class /) – TessellatingHeckler

+0

Есть ли способ удалить только имя файла без пути, чтобы я мог сравнивать имена файлов в списке с файлами в папке для копирования новых файлов в папку на позднее время? –

0
#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) 
} 
Смежные вопросы