首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Power Shell:用于每个循环和XML输出故障

Power Shell:用于每个循环和XML输出故障
EN

Stack Overflow用户
提问于 2014-08-21 20:40:58
回答 1查看 205关注 0票数 1

我以前问过一个关于这个脚本的问题,但是我需要帮助的部分被解决了,所以我决定问一个新的问题。

我正在编写一个PS脚本,该脚本获取目录中每个文件的散列和其他一些特定文件,将它们组合成一个csv,然后将它们与以前捕获的基线进行比较。然后有一个for每个循环,其中每个具有不同哈希的文件被输出到一个XML文件中,其中包含算法、散列、filepath和最后修改日期。

代码语言:javascript
复制
### 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中更改的文件的完整列表?

如果我需要提供更多的信息,请告诉我。

非常感谢您的帮助!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-23 11:07:11

代码语言:javascript
复制
$HashCRQ = Get-FileHash $CRQLocation -Algorithm MD5
$HashCRQ | Export-Csv -append -Path $HashCompare -NoTypeInformation -Force

您正在将文件d:\ Request.csv的散列添加到$HashCompare。

代码语言:javascript
复制
$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内容。

代码语言:javascript
复制
$HashNew | Export-Csv -Path $HashTemp -NoTypeInformation -Force

如果存在差异,则将$FileDir内容的散列(没有上述2个附加文件)发送到$Hashtemp。但是脚本中的其他地方都不使用文件$HashTemp。

那么,您想将$HashStore与$fileDir + $HashCRQ + $HashCRQ当前内容的散列进行比较吗?如果是这样的话,$Diffs是正确的。还是$HashStore中包含$fileDir当前内容的散列?如果是这样的话,$Diffs应该是:

代码语言:javascript
复制
Compare-Object -ReferenceObject (Import-Csv $Hashstore) -DifferenceObject (Import-Csv $HashTemp)

关于XML,$DiffObj是在Foreach循环中创建的,因此它是每个不同文件的表示,每次我们遍历这个循环时都会发生变化。所以$DiffObj实际上是一个单一的对象,这就是为什么转换到Xml最多只能显示一个对象的原因。

你需要这样做:

作为空数组创建一个变量,它将累加$DiffObj的每一次迭代:

代码语言:javascript
复制
$DiffObjCollection = @()

注意:您需要在foreach循环之外定义这个变量,否则每次我们遍历这个循环时,它都会被重置为一个空数组。

然后,我们将$DiffObj的每个单独迭代存储在这个"Collection变量“中:

代码语言:javascript
复制
$DiffObjCollection += $DiffObj

注意:这需要在Foreach循环的末尾,但在它的内部,以确保每次我们遍历循环时都将$DiffObj添加到$DiffObjCollection。

最后,在遍历了每个不同的文件之后,我们可以使用我们的“集合变量”并将这个对象集合转换为XML:

代码语言:javascript
复制
$DiffObjCollection | ConvertTo-Xml -As String -NoTypeInformation | Out-File $OutPut

注意:这需要在Foreach循环之外和脚本的末尾。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25435567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档