【发布时间】:2018-11-04 03:42:24
【问题描述】:
基本上,我有一个 CSV 文件,其中列出了一个目录的内容,以分析任何丢失的文件。
我的脚本会执行此操作,但我正在尝试将丢失文件的结果导出到新的 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
}
}
我得到的只是:
它只获取丢失的文件之一,而“ID”列则没有。我希望能够获得比较结果并将其导出到新的 CSV,其中包含第一个 CSV 文件中的相关列。例如:
我可以就我可能做错的事情寻求帮助吗?
编辑(响应 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
【问题讨论】:
-
您在 PowerShell ISE 中执行此操作?关闭 ISE,然后重新启动它并再次尝试 LotPings 回答。您的输出看起来像是在输出多个哈希表,因此要么您有一些类型错误的重用变量,要么您忘记了其中的
[pscustomobject]部分。
标签: arrays powershell csv scripting comparison