Poweshell将CSV中的数据与文件夹中的文件进行比较

我相当新的PowerShell。

我试图将CSV文件中的数据与特定文件夹中的随机文件进行比较。

我想查看是否有什么更改,然后在另一个名为“更改”的列中logging。

以下是我在下面所做的,似乎创build了一个名为“已更改”的新列,但不会input更改。

$Spreadsheet = 'C:\Powershell\CSV\inv.csv' $SpreadSheetPath = "C:\Powershell\CSV" Import-Csv $Spreadsheet -Delimiter "|" -Encoding Default | ForEach-Object - { $Path += $_.Path $Filename += $_.Filename $DateModified += $_.DateModified $FileSize += $_.FileSize $MD5Hash += $_.MD5Hash } { $Msg1 = "Path changed" $Msg2 = "File Name changed" $Msg3 = "Date Modified changed" $Msg4 = "File Size changed" $Msg5 = "MD5 changed" $Msg6 = "Files are the same" $psdata = "D:\ps-test\data\*.*" } If (($Path -eq $psdata)) { Import-Csv C:\Powershell\CSV\inv.csv | Select-Object *,@{Name='Changed';Expression={$Msg6}} | Export-Csv C:\Powershell\CSV\NewSpreadsheet4.csv } Else { Import-Csv C:\Powershell\CSV\inv.csv | Select-Object *,@{Name='Changed';Expression={$Msg1}} | Export-Csv C:\Powershell\CSV\NewSpreadsheet4.csv } 

以下是CSV的例子:

 Path Filename Date Modified File Size MD5 Hash D:\ps-test\data adminmodeinfo.htm 03/11/2010 22:42 1079 BD1C9468D71FD33BB35716630C4EC6AC E:\ps-test\data admintoolinfo.htm 03/11/2010 22:42 868 24B99B6316F0C49C23F27FEA6FF1C6AC E:\ps-test\data admin_ban.bmp 03/11/2010 22:42 63480 C856F1F3C58962B456E749F2EA9C933A E:\ps-test\data baseline.dat 03/20/2010 03:18:33 173818 F13183D88AABD1A725437802F8551A06 E:\ps-test\data blueRule.gif 03/11/2010 22:42 815 D1AEFE884935095DAB42DAFD072AA46F E:\ps-test\data deffactory.dat 03/20/2010 03:18:33 706 862D4DFD2F49021BB7C145BDAFE62F6F E:\ps-test\data dividerArt.jpg 03/11/2010 22:42 367 F7050C596C097C0B01A443058CD15E35 

任何帮助,你可以给予非常感谢!

您的代码有很多问题。我将尝试突出显示一些问题,链接到文档并指向正确的方向,以便您可以解决问题。 一个适当的解决scheme将需要更多的要求,或者编写代码(StackOverflow的脱离主题)

  • 更改
    | ForEach-Object - {

    | ForEach-Object {

  • Foreach-Object ,因为使用了+=所以要连接每行的值。
    在第一次运行时, $Path包含D:\ps-test\data
    第二次运行后,它包含D:\ps-test\dataE:\ps-test\data
    在testing数据末尾,它包含D:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\data

  • 这些消息包含在一个脚本块中 ,但看起来不像这是故意的,因为这从来没有被执行过。 所以在scriptblock之后,variables$Msg1还没有被创build; 它是空白的。

  • If (($Path -eq $psdata))

    • 双括号不是必需的。
    • 将永远是错误的,因为variables$psdata不存在,因为它是在一个脚本块内陈述。
    • 将永远是错误的,因为你试图等同string; 您的input不会从字面上包含"D:\ps-test\data\*.*" 。 你可能想要-like而不是 – 等。
    • 将始终是不准确的,因为即使path进行比较,也没有检查该文件实际上存在于系统上。

有用的链接

  • Test-Path来检查文件是否存在。

  • Get-FileHash获取MD5散列并与文件进行比较。

  • Get-ChildItem获取目录中的目录/文件列表。

  • Write-Output以便您可以打印variables,并确保它们包含您所期望的。

  • about_comparison_operators – -in和-contains将帮助你。

这是一个帮助您入门的build议。 这不完整,没有testing! 让我知道它是否按预期工作,如果您有任何问题。

 Import-Csv 'C:\Powershell\CSV\inv.csv' -Delimiter "|" -Encoding Default | foreach { $Path += $_.Path $Filename += $_.Filename $DateModified += $_.DateModified $FileSize += $_.FileSize $MD5Hash += $_.MD5Hash $file = [System.IO.FileInfo](Join-Path $Path $Filename) if (-not $file.Exists) { $message = "File does not exist" } elseif ($file.LastWriteTime -ne [DateTime]$DateModified) { $message = "Dates differ" } elseif ($file.Length -ne [int]$FileSize) { $message = "Sizes differ" } # and so on... # (You cannot really compared a changed file name btw) New-Object -Type PSObject -Prop @{ Path = $Path Filename = $Filename DateModified = $DateModified FileSize = $FileSize MD5Hash = $MD5Hash Message = $message } } | Export-CSV 'C:\Powershell\CSV\NewSpreadsheet4.csv'