2017-08-01 6 views
1

私はpowershellをかなり使い慣れています。CSVのデータとフォルダ内のファイルを比較するPoweshell

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 

:ここ

$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がどのように見えるかの一例です!

+1

あなたがしようとしていることをよりよく理解できるように、おそらくCSVファイルから抜粋してください。 – marsze

+0

こんにちは@marsze、私は上記の例を提供しました。 –

答えて

0

あなたcode.Iを持つ多くの問題がありますが、問題のいくつかを強調しようとするドキュメントへのリンクや、あなたの問題を解決できるように、正しい方向にあなたを指します。適切な解決策は、より多くの要件を取得、またはForeach-Object

  • 変更
    | ForEach-Object - {

    | ForEach-Object {

  • に(StackOverflowのため、オフトピック)コードを書く必要になり、あなたは連結値であります+=を使用しているため、各行から
    最初の実行では、$PathにはD:\ps-test\dataが含まれています。
    2回目の実行後、D:\ps-test\dataE:\ps-test\dataが含まれます。テストデータの終わりに
    、それはメッセージがscript blockに含まれているが、これが実行されることはありません、これは意図的であるようにそれが見えないD:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\dataE:\ps-test\data

  • が含まれています。したがって、スクリプトブロックの後では、変数$Msg1は作成されていません。それは空白です。

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

    • 二重括弧は必要ありません。
    • は、スクリプトブロック内に記述された変数$psdataが存在しないため、常にfalseになります。
    • は、文字列を一致させるために常にfalseになります。あなたの入力は文字通り"D:\ps-test\data\*.*"を含んでいません。 -eqの代わりに-likeが必要です。
    • は、パスが比較されても、ファイルが実際にシステムに存在するかどうかのチェックがないため、常に不正確になります。

役立ちリンク

  • Test-Pathファイルが存在するかどうかを確認してください。

  • Get-FileHash MD5ハッシュを取得し、ファイルに比較します。

  • Get-ChildItemディレクトリ内のディレクトリ/ファイルのリストを取得します。

  • Write-Outputあなたは、変数を印刷し、彼らはあなたが期待するものを含めることを確認することができますように。

  • about_comparison_operators- -inおよび-containsがお手伝いします。

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

このエラーが発生しましたか? Join-Path:引数が 'Path'であるため、引数をバインドできません。 C:\ Powershell \ Help.ps1:7 char:44 + $ file = [System.IO.FileInfo](結合パス$パス$ファイル名) + ~~~~~ + CategoryInfo:InvalidData:( :) [参加-パス]、ParameterBindingValidationExce ption + FullyQualifiedErrorId:ParameterArgumentValidationErrorNullNotAllowed、Microsoft.Pow erShell.Commands.JoinPathCommand レットエクスポート-CSVコマンドパイプラインの位置に次のパラメータの1つの サプライ値: はInputObject: –

+0

チェック輸入csv。すべてのプロパティが正しく割り当てられているかどうかを確認します。例が正しい場合は、区切り文字を変更する必要があります。 – marsze

+0

私は、インポートCSVおよびすべてのプロパティを確認し、それでもまだこのようaswell同じエラーを取得しました: 「の値 を変換できません「D:\ PS-テスト\データ\ 4212242656_3d87d21fc3_o.jpgD:\ psのテスト\データ\ 4212242656_3d87d21fc3_o.jpg \ " "には "System.IO.FileInfo"と入力します。エラー:「指定されたパスの形式はサポートされていません。ラインで :56チャー:5 + $ファイル= [System.IO.FileInfo](参加・パス$パス$ファイル名) + ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(:) []、のRuntimeException + FullyQualifiedErrorId:InvalidCastConstructorException ' –

関連する問題