我对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
答案 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))
$psdata
不存在,因为它在脚本块中声明。"D:\ps-test\data\*.*"
。您可能需要-like
而不是-eq
。有用的链接
Test-Path
检查文件是否存在。
Get-FileHash
获取MD5哈希并与文件进行比较。
Get-ChildItem
获取目录中的目录/文件列表。
Write-Output
这样您就可以打印变量并确保它们包含您期望的内容。
about_comparison_operators - -in
和-contains
会对您有所帮助。