Изменение значения параметра функции без изменений от моего имени - PullRequest
0 голосов
/ 28 апреля 2020

Я новичок PowerShell и в настоящее время сталкиваюсь с глупой проблемой (по крайней мере, для меня), которую я постараюсь объяснить ниже.

У меня возникли проблемы с тем, что, по-видимому, является предыдущими значениями для параметра функции, который предварительно добавляется к этому же параметру при следующем вызове функции. Этот или два моих параметра для функции объединяются, и происходит что-то еще, о чем я не знаю. Прохождение через отладчик ISE не помогло с решением этой проблемы. Я добавлю свой код и текстовые файлы, которые я читаю, затем объясню проблему ниже.

[CmdletBinding()]
Param(
    #Path to file containing weak ACL's before software installation
    [Parameter(Mandatory = $false)] [string]$BeforeInstallACL = "./Before.txt", 

    #Path to file containing weak ACL's after software installation
    [Parameter(Mandatory = $false)] [string]$AfterInstallACL = "./After.txt",

    #Folder location of output file
    [Parameter(Mandatory = $false)] [string]$OutputPath = "./"
)

$latestRegPath = $null

function ReadFromBeforeInstallation ($line, $newRegisteryItem) {
    # Checks if the param (file, dir, or registery key path) exists in $BeforeInstallACL 
    $regItem = $newRegistryItem
    $isPath = CheckIfPath($line)
    Write-Host $line
    $pathFound = $false
    if ($isPath) {
        $content = Get-Content $BeforeInstallACL
        $content | ForEach-Object {
            if ($_.ToString().Trim() -eq $line) {
                $pathFound = $true
                break
            }
       }
       if (!$pathFound) {
           # We have a path that only showed up after installation and want to output this
           $regItem = $line
           WriteToOutput("`r`n{0}`r`n" -f $regItem)
       }
   }
   return $regItem
}

function ReadFromAfterInstallation {
    $content = Get-Content $AfterInstallACL
    $newRegistryItem = $null
    $content | ForEach-Object {
        $_ = $_.Trim()
        if ($_) {
            if ($newRegistryItem) {
                WriteToOutput($_)
            }
            $newRegistryItem = ReadFromBeforeInstallation($_, $newRegistryItem)
        }
        else {
            $newRegistryItem = $null
        }
    }            
}

function WriteToOutput {
    param (
        # Line of a File, Dir or Registery Key from $AfterInstallACl
        [Parameter(Mandatory=$true, Position=0)]
        [string] $Line
    )
    $Line | Out-File -FilePath $OutputFile -Append
}

function CheckIfPath($line) {
    # Check if the line paramater is a path or not
    $isMatch = $false
    if ($line -match "HKEY_LOCAL_MACHINE") {
        $isMatch = $true
    }
    return $isMatch
}

#Create the empty output file we're going to use for logging
$OutputFile = Join-Path -Path $OutputPath -ChildPath difference_output.txt
New-Item $OutputFile -type File -force >$null


Get-Date | Out-File -FilePath $OutputFile 
ReadFromAfterInstallation
Get-Date | Out-File -FilePath $OutputFile -Append

Здесь after.txt

Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DRM
Everyone
SetValue, CreateSubKey, CreateLink, ReadKey, ChangePermissions, TakeOwnership


Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Function Discovery\RegistryStore\Publication\Explorer
Everyone
SetValue, CreateSubKey, ReadKey
BUILTIN\Users
SetValue, CreateSubKey, ReadKey


Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Input\HwkSettings
BUILTIN\Users
SetValue, CreateSubKey, ReadKey

, а здесь before.txt

Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Function Discovery\RegistryStore\Publication\Explorer
Everyone
SetValue, CreateSubKey, ReadKey
BUILTIN\Users
SetValue, CreateSubKey, ReadKey


Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Input\HwkSettings
BUILTIN\Users
SetValue, CreateSubKey, ReadKey


Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Input\Locales
BUILTIN\Users
SetValue, CreateSubKey, ReadKey


Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Input\Locales\loc_0039
BUILTIN\Users
SetValue, CreateSubKey, ReadKey

Проблема в ReadFromBeforeInstallation (), которая вызывается в ReadFromAfterInstallation (). В ReadFromAfterInstallation я перебираю строки в файле after.txt, передавая их в ReadFromBeforeInstallation, а затем проверяю, содержит ли строка «HKEY_LOCAL_MACHINE». Если это так, и эта строка отсутствует в before.txt, я хочу записать строку в мой выходной файл.

Звучит достаточно просто. Я просто пытаюсь найти ключи реестра HKLM, которые находятся в after.txt, но не до .txt. Я заметил, что параметр $ line в ReadFromBeforeInstallation содержал результаты прошлых функциональных вызовов. Простой оператор Write-Host будет показывать строки вроде следующего:

Everyone Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DRM
SetValue, CreateSubKey, ReadKey Everyone Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Function Discovery\RegistryStore\Publication\Explorer 

У меня никогда не было таких строк в after.txt. Наведение указателя мыши на параметр $ line в ReadFromBeforeInstallation в ISE при запуске программы показало, что $ line - это то, чем она должна быть, но когда я достигну вызова CheckifPath (), к нему будет добавлен путь HKEY. Я действительно озадачен тем, что здесь может происходить. Я понимаю, что это был длинный пост, но если бы кто-нибудь мог мне помочь, я был бы очень признателен.

Кстати, моя версия PowerShell 5.1

1 Ответ

1 голос
/ 28 апреля 2020

Вы используете неправильный синтаксис вызова

Измените это:

ReadFromBeforeInstallation($_, $newRegistryItem)

на это:

ReadFromBeforeInstallation $_ $newRegistryItem
# or
ReadFromBeforeInstallation -line $_ -newRegisteryItem $newRegistryItem

В противном случае PowerShell интерпретирует выражение ($_, $newRegistryItem) в качестве 1 аргумента и связывайте его только с первым позиционным параметром функции!

Следующие разделы справки могут быть полезны для лучшего понимания синтаксиса вызова команд PowerShell:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...