0

2 つのテキスト ファイルがあります。1 つはリモート サーバーからのレジストリ設定のリストを含み、もう 1 つは優先レジストリ設定を含みます。ファイルのフォーマットは同じです。つまり、次のようになります。

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

正しい値.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

これら 2 つのファイルを比較するための powershel スクリプトを作成しようとしています。不一致 (3 行目と 4 行目など) が見つかったら、次のような新しいログ ファイルを作成します。

不一致.txt

RemoteSever >HKLM:\software\Wow6432Node\Policies\Citrix\、ICAPolicies、1 に設定された ACRLogEvents は 0 である必要があります

RemoteServer >>HKLM:\software\Wow6432Node\Policies\Citrix\、ICAPolicies、ACRRequireAuth を 0 に設定、2 にする必要があります

任意の行の最後のコンマの後の値のみを比較しています。残りは同じであると想定されています。私は困惑しています、何かヒントはありますか?

4

1 に答える 1

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
    }
}
于 2013-07-04T19:40:55.387 に答える