Экспорт различий в CSV и объединение со столбцами из отдельного CSV PowerShell - PullRequest
0 голосов
/ 24 мая 2018

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

CSV File

Directory content

Мой скрипт делает это, однако я пытаюсь экспортировать результаты отсутствующих файлов в новый файл CSV.

Текущий сценарий:

#get working directory
$documents = 'C:\Users\Me\Documents\ScriptTest'
#path to files located in the directory
$myFolder = Get-ChildItem 'C:\Users\Me\Documents\Test\1' -Recurse -Include *.txt | 
    Select-Object -ExpandProperty BaseName | 
        Where-Object{$_ -notmatch "\\FolderName\\"}
#get items located in CSV file list column
$myCSV = Import-CSV -Path 'C:\Users\Me\Documents\Test.csv' | 
    Select-Object -ExpandProperty 'File Path'

$CSVexport = '\Users\Me\Documents\Test.csv'

$results=@()
$desiredColumns = @{
        ID = $CSVexport | Select-Object ID 
        'File Path' = $CSVexport | Select-Object 'File Path'
        }

#split the CSV item names
$splits=@()
foreach($file in $myCSV){
  $split = $file.split("\\")[2]
  $split2 = $split.split(".")[0]
  $splits+=$split2
}

#compare the CSV items to the folder items
$compare = Compare-Object -ReferenceObject $splits -DifferenceObject $myFolder -includeequal

Write-Output "`n_____Results____`n"
#Write the results and export to a CSV file
$compare | ForEach-Object {
    if($_.SideIndicator -eq "<="){
        write-host "`n$($_.InputObject) is missing from the Test folder.`n"
        $results = New-Object PSObject -Property $desiredColumns
        $results.'File Path' = $_.InputObject
        $results | Export-Csv -Path C:\Users\Me\Documents\Results.csv –NoTypeInformation
    }
}

Все, что я получаю, это:

Results

Он получает только один изотсутствующие файлы и ничего для столбца «ID».Я хочу иметь возможность получить результат сравнения и экспортировать его в новый CSV со связанными столбцами из первого файла CSV.Например:

What I'm looking for

Могу ли я получить некоторую помощь относительно того, что я могу делать неправильно?


Редактировать (Вответ на LotPings ответ)

Новый код:

$documents = 'C:\Users\Me\Documents'

$NewCsv = Import-CSV -Path 'C:\Users\Me\Documents\Test.csv' |
    Select-Object ID,'File Path' |  
      ForEach-Object {
        if (!(Test-Path (Join-Path $documents $_.'File Path'))){
          [PSCustomObject]@{
             ID = $_.ID
             Missing = $_.'File Path'
          }
       }
    }
    $NewCsv

Вывод:

Name                           Value                                                                           
----                           -----                                                                           
ID                             4                                                                               
Missing                        Test\1\File4.txt                                                                
ID                             6                                                                               
Missing                        Test\1\File6.txt   

1 Ответ

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

Чрезвычайно сложный.

Если вы выполняете итерацию своего CSV, проверяете наличие каждого файла и генерируете новый CSV на лету, это может быть просто:

## Q:\Test\2018\05\24\SO_50517360.ps1
$BasePath = "C:\Users\Me\Documents"

$NewCsv = Import-CSV -Path '.\Test.csv'|Select-Object ID,'File Path' |  
  ForEach-Object {
    if (!(Test-Path (Join-Path $BasePath $_.'File Path'))){
      [PSCustomObject]@{
         ID = $_.ID
         Missing = $_.'File Path'
      }
   }
}
$NewCsv

Пример вывода (который можно поместить в новый файл с помощью
$NewCsv|Export-Csv .\Missing.csv -NoTypeInformation

> .\SO_50517360.ps1

ID Missing
-- -------
4  Test\1\File4.txt
6  Test\1\File6.txt
...