【问题标题】:Comparing two comma separated text files比较两个逗号分隔的文本文件
【发布时间】:2013-07-02 20:09:27
【问题描述】:

我有 2 个文本文件,一个包含远程服务器的注册表设置列表,另一个包含首选注册表设置。文件格式相同,即:

ServValues.txt

HKLM:\software\Wow6432Node\Policies\Citrix\, Evidence, DesktopKind, Private
HKLM:\software\Wow6432Node\Policies\Citrix\, MultimediaPolicies, EnableRAVE, 1
HKLM:\software\Wow6432Node\Policies\Citrix\, ICAPolicies, ACRLogEvents, 1
HKLM:\software\Wow6432Node\Policies\Citrix\, ICAPolicies, ACRRequireAuth, 0

CorrectValues.txt

HKLM:\software\Wow6432Node\Policies\Citrix\, Evidence, DesktopKind, Private
HKLM:\software\Wow6432Node\Policies\Citrix\, MultimediaPolicies, EnableRAVE, 1
HKLM:\software\Wow6432Node\Policies\Citrix\, ICAPolicies, ACRLogEvents, 0
HKLM:\software\Wow6432Node\Policies\Citrix\, ICAPolicies, ACRRequireAuth, 2

我正在尝试编写一个 powershel 脚本来比较这两个文件,并在发现差异时(如第三行和第四行)创建一个新的日志文件,如:

Discrepancies.txt

RemoteSever >HKLM:\software\Wow6432Node\Policies\Citrix\,ICAPolicies,ACRLogEvents 设置为 1,应为 0

RemoteServer >>HKLM:\software\Wow6432Node\Policies\Citrix\,ICAPolicies,ACRRequireAuth 设置为 0,应为 2

我只是比较任何行中最后一个逗号之后的值,其余的假定是相同的。 我被难住了,有什么建议吗?

【问题讨论】:

  • 我的意思是,我认为第一步显然是这样的:$ServerSettings = get-file ServValues.txt$CorrectSettings = get-file CorrectValues.txt 之后对我来说很难的是同时解析两个这样的数组,比较值跨越每个。
  • 你开始使用compare-object了吗??

标签: powershell text


【解决方案1】:

你试过Compare-Object吗?

如果这不起作用,您将不得不使用标准的 for 循环:

filter Split-RegSettingLine
{
    param(
        [Parameter(ValueFromPipeline=$true)]
        $Line
    )
    if( $Line -notmatch '^(.*), ([^,]+)$' )
    {
        Write-Error ('Invalid line: {0}' -f $Line)
        return
    }
    $matches[1],$matches[2]
}

$ServerSettings = Get-Content ServValues.txt
$CorrectSettings = Get-Content CorrectValues.txt

if( $ServerSettings.Length -ne $CorrectSettings.Length )
{
    Write-Warning ('Files have different number of lines.  WATCH OUT!')
}

for( $idx = 0 $idx -lt $ServerSettings.Length -and $idx -lt $CorrectSettings.Length; ++$idx )
{
    $serverKey,$serverValue = $ServerSettings[$idx] | Split-RegSettingLine
    $correctKey,$correctValue = $CorrectSettings[$idx] | Split-RegSettingLine

    if( $serverKey -ne $correctKey )
    {
        Write-Error ('Line {0}: mismatched keys: <{1}> <=> <{2}>' -f $idx,$serverKey,$correctKey)
        continue
    }

    if( $serverValue -ne $correctValue )
    {
        Write-Error ('Line {0}: key {1}: set to <{2}>, should be <{3}>' -f $idx,$serverKey,$serverValue,$correctValue
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2012-10-29
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多