Powershell将CSV中的数据与文件夹

时间:2017-08-01 08:04:06

标签: excel powershell csv

我对powershell很新。

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

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

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

$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

2 个答案:

答案 0 :(得分:0)

这是一个帮助您入门的建议。 它没有完整且未经过测试!请告诉我它是否按预期工作,如果您有任何疑问。

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'

答案 1 :(得分:0)

您的代码存在许多问题。我将尝试突出显示一些问题,链接到文档并指出正确的方向,以便您可以解决问题。一个正确的解决方案需要获得更多的需求,或编写代码(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
    • 将始终不准确,因为即使比较路径,也不会检查文件实际存在于系统上。

有用的链接