Я новичок 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