Powershell Использование списка CSV для проверки отсутствия файлов в папке - PullRequest
0 голосов
/ 10 мая 2018

Я новичок в написании сценариев, прости меня за любые очевидные ответы здесь.

По сути, у меня есть большой список музыкальных файлов, хранящихся в папке, которую я обновляю каждый месяц. Я создал меньшую папку для тестирования:

music folder

У меня есть список CSV всех файлов, которые должны быть в папке:

CSV File with missing entry

Я пытаюсь создать скрипт Powershell, который:

  • Берет имена столбцов CSV "Путь к аудиофайлу" и сравнивает их с именами файлов в папке "Музыка"
  • Проверяет, отсутствуют ли какие-либо файлы в списке CSV или папке Music
  • Вывести имена отсутствующих файлов

Мой тестовый скрипт (отредактировано):

$folder = 'C:/Users/Me/Documents'
$myFolder = Get-ChildItem '/Users/Me/Documents/Music' 
$myCSV = Import-Csv -Path 'Documents/AudioMissing.csv'| % {$_.'Audio File Path' -replace "\\", ""}

$compare = Compare-Object -ReferenceObject $myCSV -DifferenceObject $myFolder

foreach($y in $compare){
    if($y.SideIndicator -eq "=>"){
     write-output "$($y.InputObject) Is present in the Music folder but not in the CSV."
    }
    if($y.SideIndicator -eq "<="){
     write-output "$($y.InputObject) Is present in the CSV but not in Music folder."
    }
 }

За исключением случаев, когда я запускаю сценарий, он возвращает все файлы из списка и папки, а также говорит, что некоторые из них отсутствуют, даже если они имеют одинаковое имя файла.

Вывод выглядит так (отредактировано):

9913SA_FIle1.wav Is present in the Music folder but not in the CSV.
9914SA_File2.wav Is present in the Music folder but not in the CSV.
9915SA_File3.wav Is present in the Music folder but not in the CSV.
9916SA_File4.wav Is present in the Music folder but not in the CSV.
9917SA_File5.wav Is present in the Music folder but not in the CSV.
9913SA_FIle1.wav Is present in the CSV but not in Music folder.
9914SA_File2.wav Is present in the CSV but not in Music folder.
9915SA_File3.wav Is present in the CSV but not in Music folder.
9916SA_File4.wav Is present in the CSV but not in Music folder.

Я хочу, чтобы скрипт выводил только отсутствующие файлы, например:

 9917SA_File5.wav Is present in the Music folder but not in the CSV.

Возможно ли это сделать?


EDIT:

Оказывается, у моего CSV-файла действительно были скрытые пробелы в конце каждой записи "Путь к аудиофайлу", в результате чего он читался как другое имя.

Новый код

$myFolder = Get-ChildItem '/Users/Me/Documents/Music' | % {$_.Name}
$myCSV = Import-Csv -Path '/Users/Me/Documents/AudioMissing.csv' | % {$_.'Audio File Path' -replace "\\", ""}
$compare = Compare-Object -ReferenceObject $myCSV -DifferenceObject $myFolder -includeequal

Write-Output "`n_____FOLDER_____`n"
$myFolder

Write-Output "`n_____CSV_____`n"
$myCSV

Write-Output "`n_____COMPARE_____`n"
$compare

Write-Output "`n_____Formatted Results____`n"
foreach($y in $compare){
    if($y.SideIndicator -eq "=>"){
     write-output "$($y.InputObject) Is present in the Music folder but not in the CSV."
    }
    if($y.SideIndicator -eq "<="){
     write-output "$($y.InputObject) Is present in the CSV but not in Music folder."
    }
 }
if($y.SideIndicator -eq "=="){
     write-output "All files present."
    } 

Возвращает:

_____FOLDER_____

9913SA_File1.wav
9914SA_File2.wav
9915SA_File3.wav
9916SA_File4.wav
9917SA_File5.wav

_____CSV_____

9913SA_File1.wav
9914SA_File2.wav
9915SA_File3.wav
9916SA_File4.wav

_____COMPARE_____


InputObject                                                         SideIndicator                                                     
-----------                                                         -------------                                                     
9913SA_File1.wav                                                    ==                                                                
9914SA_File2.wav                                                    ==                                                                
9915SA_File3.wav                                                    ==                                                                
9916SA_File4.wav                                                    ==                                                                
9917SA_File5.wav                                                    =>                                                                

_____Formatted Results____

9917SA_File5.wav Is present in the Music folder but not in the CSV.

1 Ответ

0 голосов
/ 10 мая 2018

Я создал CSV-файл со следующим:

ID  Audio File Path
1   99\13\SA_File1.docx
2   99\13\SA_File2.docx
3   99\13\SA_File3.docx
5   99\13\SA_File5.docx

Примечание: я удалил 99\13\SA_File4.docx из списка.

Затем я запустил следующий скрипт:

$myCSV = Import-Csv -Path '/Users/me/myFiles.csv' | % {$_.'Audio File Path' -replace "\\", ""}
$myFolder = Get-ChildItem '/Users/me/test'

$compare = Compare-Object -ReferenceObject $myCSV -DifferenceObject $myFolder

foreach($y in $compare){
    if($y.SideIndicator -eq "=>"){
     write-output "$($y.InputObject) Is present in the Music folder but not in CSV."
    }
    if($y.SideIndicator -eq "<="){
     write-output "$($y.InputObject) Is present in the CSV but not in the Music folder."
    }
 }

Я протестировал удаление файла из папки и включение этого файла в CSV, и сценарий соответствует.

Вам не нужен флаг -passthru при сравнении объекта, и Get-ChildItem подходит для этого приложения.


EDIT:

Ваши результаты довольно странные, смотрите скрипт ниже (я обновил имена файлов, чтобы они больше походили на ваши):

$myFolder = Get-ChildItem '/Users/me/test'
$myCSV = Import-Csv -Path '/Users/me/myFiles.csv' | % {$_.'Audio File Path' -replace "\\", ""}
$compare = Compare-Object -ReferenceObject $myCSV -DifferenceObject $myFolder

Write-Output "`n_____FOLDER_____`n"
$myFolder.Name

Write-Output "`n_____CSV_____`n"
$myCSV

Write-Output "`n_____COMPARE_____`n"
$compare

Write-Output "`n_____Formatted Results____`n"
foreach($y in $compare){
    if($y.SideIndicator -eq "=>"){
     write-output "$($y.InputObject) Is present in the Music folder but not in the CSV."
    }
    if($y.SideIndicator -eq "<="){
     write-output "$($y.InputObject) Is present in the CSV but not in Music folder."
    }
 }

Это дает мне следующий вывод:

Вывод из скрипта Можете ли вы запустить скрипт выше и отправить вывод?

...