【问题标题】:Powershell comparing data in a CSV against files in a folderPowershell 将 CSV 中的数据与文件夹中的文件进行比较
【发布时间】:2017-08-01 08:04:06
【问题描述】:

我对 powershell 还很陌生。

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

我想看看是否发生了变化以及发生了什么变化,然后将其记录在另一个名为“已更改”的列中。

这是我在下面所做的,它似乎创建了一个名为“已更改”的新列,但没有在其中输入更改。

$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

【问题讨论】:

  • 您可能应该提供 CSV 文件的摘录,以便我们更好地了解您要做什么。
  • 嗨@mar​​sze,我在上面提供了一个例子。

标签: excel powershell csv


【解决方案1】:

您的代码存在许多问题。我将尝试突出显示其中的一些问题,链接到文档并为您指明正确的方向,以便您解决问题。一个合适的解决方案需要获得更多的需求,或者编写代码(StackOverflow 的题外话)

  • 更改
    | ForEach-Object - {

    | ForEach-Object {

  • Foreach-Object 中,您将连接每一行的值,因为您使用的是+=
    第一次运行时,$Path 包含 D:\ps-test\data
    第二次运行后,它包含D:\ps-test\dataE:\ps-test\data
    在测试数据的末尾,它包含D:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\data

  • 这些消息包含在 script block 中,但看起来这不是故意的,因为它从未执行过。所以在scriptblock之后,变量$Msg1还没有被创建;它是空白的。

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

    • 不需要双括号。
    • 将始终为 false,因为变量 $psdata 不存在,如脚本块中所述。
    • 将始终为假,因为您试图将字符串等同起来;您的输入实际上并不包含"D:\ps-test\data\*.*"。您可能想要-like 而不是-eq
    • 将始终不准确,因为即使比较路径,也无法检查文件是否确实存在于系统中。

有用的链接

【讨论】:

    【解决方案2】:

    这是帮助您入门的建议。 它不完整且未经测试!如果它按预期工作以及如果您有任何问题,请告诉我。

    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'
    

    【讨论】:

    • 我收到了这个错误?加入路径:无法将参数绑定到参数“路径”,因为它为空。在 C:\Powershell\Help.ps1:7 char:44 + $file = [System.IO.FileInfo](Join-Path $Path $Filename) + ~~~~~~ + CategoryInfo : InvalidData: (:) [Join -Path], ParameterBindingValidationExce ption + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.JoinPathCommand cmdlet Export-Csv at command pipeline position 1 为以下参数提供值:InputObject:
    • 检查导入 csv。检查是否正确分配了所有属性。如果示例正确,您可能需要更改分隔符。
    • 我已经检查了导入 CSV 和所有属性,但仍然出现相同的错误以及:'无法转换值 "D:\ps-test\data\4212242656_3d87d21fc3_o.jpgD:\ps- test\data\4212242656_3d87d21fc3_o.jpg\”输入“System.IO.FileInfo”。错误:“不支持给定路径的格式。”在 line:56 char:5 + $file = [System.IO.FileInfo](Join-Path $Path $Filename) + ~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorId : InvalidCastConstructorException'
    • 我觉得这里的问题很明显。 (与您发布的 csv 数据不同,这两个路径都是有根的。)我无法为您完成所有工作。
    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多