2017-08-01 49 views
1

我對PowerShell相當陌生。Poweshell將CSV中的數據與文件夾中的文件進行比較

我試圖將CSV文件中的數據與特定文件夾中的隨機文件進行比較。

我想查看是否以及發生了什麼變化,然後在另一個名爲「Changed」的列中記錄它。

下面是我在下面所做的,它似乎創建了一個名爲'Changed'的新列,但並未輸入其中的更改。

$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 

任何幫助你們能給將不勝感激!

+1

您應該提供CSV文件的摘錄,以便我們更好地瞭解您正在嘗試執行的操作。 – marsze

+0

嗨@mar​​sze,我上面提供了一個例子。 –

回答

0

沒有與您code.I許多問題會盡量突出一些的問題,鏈接,文檔和你指出正確的方向,這樣就可以解決你的問題。一個適當的解決方案需要獲得更多的要求,或

  • 變化
    | ForEach-Object - {

    | ForEach-Object {

  • 編寫代碼(題外話了StackOverflow上)在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,但它看起來並不像,因爲這是從來沒有執行,這是故意的。因此在腳本塊之後,變量$Msg1尚未創建;它是空白的。不需要

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

    • 雙括號。
    • 將始終爲假,因爲變量$psdata不存在,因爲它是在腳本塊內聲明的。
    • 將永遠是錯誤的,因爲你試圖等同字符串;您的輸入不包含字面意思"D:\ps-test\data\*.*"。您可能想要-like而不是-eq
    • 將始終是不準確的,因爲即使比較了路徑,也不會檢查該文件是否實際存在於系統中。

有用的鏈接

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' 
+0

我有這個錯誤? 加入路徑:無法將參數綁定到參數'路徑',因爲它是空的。 在C:\ Powershell \ Help.ps1:7 char:44 + $ file = [System.IO.FileInfo](Join-Path $ Path $ Filename) + ~~~~~ + CategoryInfo:InvalidData :(:) [聯接路徑],ParameterBindingValidationExce ption + FullyQualifiedErrorId:ParameterArgumentValidationErrorNullNotAllowed,Microsoft.Pow erShell.Commands.JoinPathCommand 小命令導出-CSV在命令管道位置爲以下參數1個 供應值: InputObject: –

+0

檢查導入csv。檢查所有屬性是否正確分配。如果示例正確,則可能需要更改分隔符。 – marsze

+0

我已檢查導入CSV和所有屬性,但仍然得到相同的錯誤以及此: '無法轉換值 「D:\ ps-test \ data \ 4212242656_3d87d21fc3_o.jpgD:\ ps-test \ data \ 4212242656_3d87d21fc3_o.jpg \「 鍵入」System.IO.FileInfo「。錯誤:「給定路徑的格式不受支持。」 At line:56 char:5 + $ file = [System.IO.FileInfo](Join-Path $ Path $ Filename) + ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(:) [],RuntimeException + FullyQualifiedErrorId:InvalidCastConstructorException' –

相關問題