我以前问过一个关于这个脚本的问题,但是我需要帮助的部分被解决了,所以我决定问一个新的问题。
我正在编写一个PS脚本,该脚本获取目录中每个文件的散列和其他一些特定文件,将它们组合成一个csv,然后将它们与以前捕获的基线进行比较。然后有一个for每个循环,其中每个具有不同哈希的文件被输出到一个XML文件中,其中包含算法、散列、filepath和最后修改日期。
### This PowerShell 4.0 script compares the MD5 hash of each file in ###
### a directory in it's current state and compares it with a baseline ###
### copy taken previously. If no baseline exists, a new one is created. ###
### ***The first time this script is run, a false-positive report ###
# Variables
$DateTime = Get-Date -format M.d.yyyy.hh.mm.ss
$Hashstore = "d:\Baseline.txt"
$HashCompare = "d:\Difference_$DateTime.txt"
$HashTemp = "d:\hashtemp_$DateTime.txt"
$FileDir = "d:\scripts\"
$CRQLocation = "d:\Change Request.csv"
$ScriptLocation = "d:\FileChecker.ps1"
$OutPut = "d:\Results_$DateTime.xml"
# Check if Baseline.txt Exists
If (Test-Path $Hashstore)
# // File exists
{
}
Else {
# // File does not exist - Should never happen!
$RefreshHash = dir $FileDir -Recurse | Get-FileHash -Algorithm MD5
$RefreshScript = Get-FileHash $ScriptLocation -Algorithm MD5
$RefreshCRQ = Get-FileHash $CRQLocation -Algorithm MD5
}
## Generate new Compare Hash.txt
$HashNew = dir $FileDir -Recurse | Get-FileHash -Algorithm MD5
$HashNew | Export-Csv -Path $HashCompare -NoTypeInformation -Force
#Get hash of this script
$HashScript = Get-FileHash $ScriptLocation -Algorithm MD5
$HashScript | Export-Csv -append -Path $HashCompare -NoTypeInformation -Force
#Get hash of CRQ Log
$HashCRQ = Get-FileHash $CRQLocation -Algorithm MD5
$HashCRQ | Export-Csv -append -Path $HashCompare -NoTypeInformation -Force
# Get Hash of baseline.txt
$HashBaseline = Get-FileHash -Path $Hashstore -Algorithm MD5
# Get Hash of hashcompare.txt
$HashDiff = Get-FileHash -Path $HashCompare -Algorithm MD5
# If changed, output hash to storage, and flag changes
If ($HashBaseline.hash -eq $HashDiff.hash) {
Add-Content -Path D:\success.$DateTime.txt -Value " Source Files ARE EQUAL </p>"
}
Else {
Add-Content -Path D:\failure.$DateTime.txt -Value "Source Files NOT EQUAL </p>"
$HashNew | Export-Csv -Path $HashTemp -NoTypeInformation -Force
# Storing a collection of differences in $Diffs
$Diffs = Compare-Object -ReferenceObject (Import-Csv $Hashstore) -DifferenceObject (Import-Csv $HashCompare)
Foreach ($Diff in $Diffs) {
$DiffHashInfo = $Diff | Select-Object -ExpandProperty InputObject
$DiffFileInfo = Get-ChildItem -Path $DiffHashInfo.Path
# Creating a list of properties for the information you need
$DiffObjProperties = [ordered]@{'Algorithm'=$DiffHashInfo.Algorithm
'Hash'=$DiffHashInfo.Hash
'File Path'=$DiffFileInfo.FullName
'Last edit time'=$DiffFileInfo.LastWriteTime
}
# Building a custom object from the list of properties in $DiffObjProperties
$DiffObj = New-Object -TypeName psobject -Property $DiffObjProperties
$DiffObj
}
}
$DiffObj | ConvertTo-Xml -As String -NoTypeInformation | Out-File $OutPut我从用户Mathieu Buisson那里得到了很好的帮助,但是我遇到了另一个错误。
我的理解是,循环将接收每个发现不同的文件,转换我需要的字段,然后将它们全部附加到一个文件中。最后一行将它们转换为xml并输出它们。
我的问题是输出。正确地创建基线和差异文件,生成成功/失败. The文件并使其准确。问题是,xml要么出现空白,要么只列出以前不存在的文件。在这种程度上,它只在xml中列出了一个文件,即使PS控制台显示了两个或更多的文件。
如何才能获得XML中更改的文件的完整列表?
如果我需要提供更多的信息,请告诉我。
非常感谢您的帮助!!
发布于 2014-08-23 11:07:11
$HashCRQ = Get-FileHash $CRQLocation -Algorithm MD5
$HashCRQ | Export-Csv -append -Path $HashCompare -NoTypeInformation -Force您正在将文件d:\ Request.csv的散列添加到$HashCompare。
$HashScript = Get-FileHash $ScriptLocation -Algorithm MD5
$HashScript | Export-Csv -append -Path $HashCompare -NoTypeInformation -Force将文件d:\FileChecker.ps1的哈希添加到$Hashcompare中。
这两个文件不是$FileDir,所以我不明白为什么要将它们添加到$HashCompare中,因为当您将$HashCompare与$Hashstore进行比较时,您将$FileDir的内容与$FileDir +2其他文件的内容进行比较。我假设$Hashtore包含$FileDir内容的散列,但我只能假设,因为脚本没有说明如何创建$Hashstore内容。
$HashNew | Export-Csv -Path $HashTemp -NoTypeInformation -Force如果存在差异,则将$FileDir内容的散列(没有上述2个附加文件)发送到$Hashtemp。但是脚本中的其他地方都不使用文件$HashTemp。
那么,您想将$HashStore与$fileDir + $HashCRQ + $HashCRQ当前内容的散列进行比较吗?如果是这样的话,$Diffs是正确的。还是$HashStore中包含$fileDir当前内容的散列?如果是这样的话,$Diffs应该是:
Compare-Object -ReferenceObject (Import-Csv $Hashstore) -DifferenceObject (Import-Csv $HashTemp)关于XML,$DiffObj是在Foreach循环中创建的,因此它是每个不同文件的表示,每次我们遍历这个循环时都会发生变化。所以$DiffObj实际上是一个单一的对象,这就是为什么转换到Xml最多只能显示一个对象的原因。
你需要这样做:
作为空数组创建一个变量,它将累加$DiffObj的每一次迭代:
$DiffObjCollection = @()注意:您需要在foreach循环之外定义这个变量,否则每次我们遍历这个循环时,它都会被重置为一个空数组。
然后,我们将$DiffObj的每个单独迭代存储在这个"Collection变量“中:
$DiffObjCollection += $DiffObj注意:这需要在Foreach循环的末尾,但在它的内部,以确保每次我们遍历循环时都将$DiffObj添加到$DiffObjCollection。
最后,在遍历了每个不同的文件之后,我们可以使用我们的“集合变量”并将这个对象集合转换为XML:
$DiffObjCollection | ConvertTo-Xml -As String -NoTypeInformation | Out-File $OutPut注意:这需要在Foreach循环之外和脚本的末尾。
https://stackoverflow.com/questions/25435567
复制相似问题