结束,未调用循环外函数,添加 运行 计数
Ending, out of loop function not being called, adding run counts
所以,我有一个包含 8 个函数的长脚本。最后,在执行部分,我在 ForEach 循环中调用了这些函数,其中有两个。我想要做的是在循环之后和循环之外调用其中之一。
5 Log-Write
行就是我所说的。现在,如果我 运行 我的脚本只有第 5 行出现在日志文件中。我知道我的语法很复杂,但我不知道如何在循环处理后的脚本末尾以摘要方式调用该函数。
代码如下:
#---------------------------------------------------------[Initializations]--------------------------------------------------------
Param (
[Parameter(Mandatory=$false)]
[Switch]$LogOnly
)
# Dot Source required Function Libraries
#. "\server\scripts\Logging_Functions.ps1"
. "c:\users\documents\powershell\Functions\Logging_Functions.ps1"
# Error Action
$ErrorActionPreference = 'silentlycontinue'
# Debug preference
$global:DebugPreference = "continue"
# WhatIf Preference, uncomment to run script in a logging only function
#$WhatIfPreference = $true
#----------------------------------------------------------[Declarations]----------------------------------------------------------
# Script Version
$sScriptVersion = "1.0"
Import-Module ActiveDirectory
# Log File Info
$sLogPath = "C:\Users\Documents\powershell\Logs"
#$sLogPath = "\server\e$\Logs"
$sLogName = "Set-LitmosGroups_$(get-date -f yyyy-MM-dd_HH-mm-ss).log"
$sLogOnlyPath = "C:\Users\Documents\powershell\Logs"
$sLogOnlyName = "\Set-LitmosGroups (Log Only)_$(get-date -f yyyy-MM-dd_HH-mm-ss).log"
$sLogFile = Join-Path -Path $sLogPath -ChildPath $sLogName
$sLogOnlyFile = Join-Path -Path $sLogOnlyPath -ChildPath $sLogOnlyName
$LogLine = $null
#$logonly = $null
# Variable Initializations
# Org Unit where the target groups reside (Litmos)
$OU = "ou=test_litmos, ou=test accounts, ou=domain, dc=net"
# Org unt containing the All Managers security group
$OU2 = "CN=All Managers,OU=Organizational,OU=Groups,OU=domain,DC=net"
# Get member of the 'ALL Managers' security group
$Managers = Get-ADGroupMember -identity $OU2 | Select-Object -expandproperty samaccountname
# Get AD groups with Report to in the name in $ou
$ReportsTo = Get-adgroup -searchbase $ou -filter "Name -like 'Report to *'" |
Select-Object -expandproperty name
$samecount = 0
$addgroupcount = 0
$addusercount = 0
$LogOnlyAdduserCount = 0
$LogOnlyGroupCount = 0
#----------------------------------------------------------[Functions]-------------------------------------------------------------
Function Get-DirectReport {
#requires -Module ActiveDirectory
[CmdletBinding()]
param(
[Parameter(
Mandatory = $false,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true
)]
[string] $SamAccountName,
[switch] $NoRecurse
)
BEGIN {}
PROCESS {
$UserAccount = Get-ADUser $SamAccountName -Properties DirectReports, DisplayName
$UserAccount | select -ExpandProperty DirectReports | ForEach-Object {
$User = Get-ADUser $_ -Properties DirectReports, DisplayName, Title, EmployeeID
if ($null -ne $User.EmployeeID) {
if (-not $NoRecurse) {
Get-DirectReport $User.SamAccountName
}
[PSCustomObject]@{
SamAccountName = $User.SamAccountName
UserPrincipalName = $User.UserPrincipalName
DisplayName = $User.DisplayName
Manager = $UserAccount.DisplayName
}
}
}
}
END {}
}
Function New-bhReportToGroup {
[CmdletBinding(SupportsShouldProcess)]
$Log1 = "New group for " + $manager + " has been created."
$Log2 = "Group for " + $manager + " already exists."
#From on when you see the below line $script:<variable> that sets the scope for that variable to the entire script which means other functions can use the value
$script:ReportsTo = $ReportsTo -replace ("Report to ", "")
if ($manager -notin $ReportsTo) {
$LogLine = $Log1
$addgroupcount = $addcount + 1
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
else {
$LogLine = $Log2
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
}
Function New-bhReportToGroup_logonly {
#[CmdletBinding(SupportsShouldProcess)]
$Log1 = "New group for " + $manager + " would have been created in $OU."
$Log2 = "Group for " + $manager + " already exists in $OU."
$script:ReportsTo = $ReportsTo -replace ("Report to ", "")
if ($manager -notin $ReportsTo) {
$Script:addcount = $addcount +1
$LogLine = $Log1
$LogOnlyGroupCount = $LogOnlyGroupCount + 1
Log-Write -LogPath $LogOnlyFile -LineValue $LogLine
}
else {
$Script:samecount = $samecount + 1
$LogLine = $Log2
Log-Write -LogPath $LogOnlyFile -LineValue $LogLine
}
}
Function Get-bhDReports {
[CmdletBinding(SupportsShouldProcess)]
$directreports = Get-Directreport $manager -norecurse | Select-Object samAccountName
if ($null -ne $directreports) {
$LogLine = "Gathering direct reports for " + $manager
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
else {
$LogLine = $manager + " has no reports."
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
}
Function Set-bhRTGmembers {
[CmdletBinding(SupportsShouldProcess)]
# Get manager's 'report to <manager>' group again to update members
$managerReportToGroup = Get-ADGroup -SearchBase $OU -Filter "Name -like 'Report to $Manager'"
$directreports = Get-Directreport $manager -norecurse | Select-Object samAccountName
if ($managerReportToGroup) {
Add-ADGroupMember -identity $managerReportToGroup.Name -members $DirectReports
Add-ADGroupMember -identity $managerReportToGroup.name -members $Manager
$LogLine = "Report to " + $Manager + " updated."
$Addusercount = $Addusercount +1
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
else {
$LogLine = "Could not find group for " + $Manager
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
}
Function Set-bhRTGmembers_logonly {
# Get manager's 'report to <manager>' group again to update members
$managerReportToGroup = Get-ADGroup -SearchBase $OU -Filter "Name -like 'Report to $Manager'"
if ($managerReportToGroup) {
$LogOnlyAdduserCount = $LogOnlyAddUserCount +1
$LogLine = "Report to " + $Manager + " would be updated with "+ $LogOnlyAddUserCount + " " + $DirectReports.name
Log-Write -LogPath $LogOnlyFile -LineValue $LogLine
}
else {
$LogLine = "Could not find group for " + $Manager
Log-Write -LogPath $LogOnlyFile -LineValue $LogLine
}
}
Function Remove-bhOOSGroups {
[CmdletBinding(SupportsShouldProcess)]
$report = $report -replace ("Report to ", "")
if ($Report -notin $managers) {
Remove-ADGroup -Identity "Report to $Report" -confirm:$false
$LogLine = $report + " user has fell out of scope, Report group removed."
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
else {
Continue
}
}
Function Remove-bhOOSGroups_logonly {
$report = $report -replace ("Report to ", "")
if ($Report -notin $managers) {
$LogLine = $report + " user has fell out of scope, Report group would be removed."
Log-Write -LogPath $sLogOnlyFile -LineValue $LogLine
}
else {
Continue
}
}
#----------------------------------------------[ Execution ]------------------------------------------------
#Managers | Foreach-Object -Parallel {
Foreach ($Manager in $Managers) {
if (-not $LogOnly) {
$Directreports = Get-Directreport $manager -norecurse | Select-Object -expand samAccountName
Ttime = (Get-Date).ToString('T')
Log-Write -LogPath $sLogFile -LineValue $Manager + "'s" + "Direct reports are: " $Directreports
New-bhReportToGroup
Get-bhDReports
Set-bhRTGmembers
Log-Write -LogPath $sLogFile -LineValue "========================[$Time ]==============================="
} else {
New-bhReportToGroup_logonly
Get-bhDReports
Set-bhRTGmembers_logonly
Log-Write -LogPath $LogOnlyFile -LineValue "========================[ LogOnly ]==============================="
}
}
Foreach ($Report in $ReportsTo) {
If (-not $LogOnly){
Remove-bhOOSGroups
} else {
#ForEach ($Report in $ReportsTo) {
Remove-bhOOSGroups_logonly
}
}
#}
Log-Write -LogPath $sLogPath -Linevalue $addgroupcount + " New groups added"
Log-Write -Logpath $sLogPath -Linevalue $AddUserCount + " New users added to groups"
Log-Write -Logpath $sLogOnlyPath -Linevalue $LogOnlyAdduserCount + " Users who would be added"
Log-Write -Logpath $sLogOnlyPath -Linevalue $LogOnlyGroupCount + " Groups that would be added"
Log-Write -LogPath $sLogPath -Linevalue "====[END]====="
这是一个猜测,因为我看不到您的日志写入功能,但由于只有第 5 行有效,我敢打赌您可以通过将字符串传递给 linevalue 来显示其他行参数(通过将整行放在双引号中,使其采用变量值)。像这样:
Log-Write -Logpath $sLogOnlyPath -Linevalue "$LogOnlyGroupCount Groups that would be added"
所以,我有一个包含 8 个函数的长脚本。最后,在执行部分,我在 ForEach 循环中调用了这些函数,其中有两个。我想要做的是在循环之后和循环之外调用其中之一。
5 Log-Write
行就是我所说的。现在,如果我 运行 我的脚本只有第 5 行出现在日志文件中。我知道我的语法很复杂,但我不知道如何在循环处理后的脚本末尾以摘要方式调用该函数。
代码如下:
#---------------------------------------------------------[Initializations]--------------------------------------------------------
Param (
[Parameter(Mandatory=$false)]
[Switch]$LogOnly
)
# Dot Source required Function Libraries
#. "\server\scripts\Logging_Functions.ps1"
. "c:\users\documents\powershell\Functions\Logging_Functions.ps1"
# Error Action
$ErrorActionPreference = 'silentlycontinue'
# Debug preference
$global:DebugPreference = "continue"
# WhatIf Preference, uncomment to run script in a logging only function
#$WhatIfPreference = $true
#----------------------------------------------------------[Declarations]----------------------------------------------------------
# Script Version
$sScriptVersion = "1.0"
Import-Module ActiveDirectory
# Log File Info
$sLogPath = "C:\Users\Documents\powershell\Logs"
#$sLogPath = "\server\e$\Logs"
$sLogName = "Set-LitmosGroups_$(get-date -f yyyy-MM-dd_HH-mm-ss).log"
$sLogOnlyPath = "C:\Users\Documents\powershell\Logs"
$sLogOnlyName = "\Set-LitmosGroups (Log Only)_$(get-date -f yyyy-MM-dd_HH-mm-ss).log"
$sLogFile = Join-Path -Path $sLogPath -ChildPath $sLogName
$sLogOnlyFile = Join-Path -Path $sLogOnlyPath -ChildPath $sLogOnlyName
$LogLine = $null
#$logonly = $null
# Variable Initializations
# Org Unit where the target groups reside (Litmos)
$OU = "ou=test_litmos, ou=test accounts, ou=domain, dc=net"
# Org unt containing the All Managers security group
$OU2 = "CN=All Managers,OU=Organizational,OU=Groups,OU=domain,DC=net"
# Get member of the 'ALL Managers' security group
$Managers = Get-ADGroupMember -identity $OU2 | Select-Object -expandproperty samaccountname
# Get AD groups with Report to in the name in $ou
$ReportsTo = Get-adgroup -searchbase $ou -filter "Name -like 'Report to *'" |
Select-Object -expandproperty name
$samecount = 0
$addgroupcount = 0
$addusercount = 0
$LogOnlyAdduserCount = 0
$LogOnlyGroupCount = 0
#----------------------------------------------------------[Functions]-------------------------------------------------------------
Function Get-DirectReport {
#requires -Module ActiveDirectory
[CmdletBinding()]
param(
[Parameter(
Mandatory = $false,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true
)]
[string] $SamAccountName,
[switch] $NoRecurse
)
BEGIN {}
PROCESS {
$UserAccount = Get-ADUser $SamAccountName -Properties DirectReports, DisplayName
$UserAccount | select -ExpandProperty DirectReports | ForEach-Object {
$User = Get-ADUser $_ -Properties DirectReports, DisplayName, Title, EmployeeID
if ($null -ne $User.EmployeeID) {
if (-not $NoRecurse) {
Get-DirectReport $User.SamAccountName
}
[PSCustomObject]@{
SamAccountName = $User.SamAccountName
UserPrincipalName = $User.UserPrincipalName
DisplayName = $User.DisplayName
Manager = $UserAccount.DisplayName
}
}
}
}
END {}
}
Function New-bhReportToGroup {
[CmdletBinding(SupportsShouldProcess)]
$Log1 = "New group for " + $manager + " has been created."
$Log2 = "Group for " + $manager + " already exists."
#From on when you see the below line $script:<variable> that sets the scope for that variable to the entire script which means other functions can use the value
$script:ReportsTo = $ReportsTo -replace ("Report to ", "")
if ($manager -notin $ReportsTo) {
$LogLine = $Log1
$addgroupcount = $addcount + 1
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
else {
$LogLine = $Log2
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
}
Function New-bhReportToGroup_logonly {
#[CmdletBinding(SupportsShouldProcess)]
$Log1 = "New group for " + $manager + " would have been created in $OU."
$Log2 = "Group for " + $manager + " already exists in $OU."
$script:ReportsTo = $ReportsTo -replace ("Report to ", "")
if ($manager -notin $ReportsTo) {
$Script:addcount = $addcount +1
$LogLine = $Log1
$LogOnlyGroupCount = $LogOnlyGroupCount + 1
Log-Write -LogPath $LogOnlyFile -LineValue $LogLine
}
else {
$Script:samecount = $samecount + 1
$LogLine = $Log2
Log-Write -LogPath $LogOnlyFile -LineValue $LogLine
}
}
Function Get-bhDReports {
[CmdletBinding(SupportsShouldProcess)]
$directreports = Get-Directreport $manager -norecurse | Select-Object samAccountName
if ($null -ne $directreports) {
$LogLine = "Gathering direct reports for " + $manager
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
else {
$LogLine = $manager + " has no reports."
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
}
Function Set-bhRTGmembers {
[CmdletBinding(SupportsShouldProcess)]
# Get manager's 'report to <manager>' group again to update members
$managerReportToGroup = Get-ADGroup -SearchBase $OU -Filter "Name -like 'Report to $Manager'"
$directreports = Get-Directreport $manager -norecurse | Select-Object samAccountName
if ($managerReportToGroup) {
Add-ADGroupMember -identity $managerReportToGroup.Name -members $DirectReports
Add-ADGroupMember -identity $managerReportToGroup.name -members $Manager
$LogLine = "Report to " + $Manager + " updated."
$Addusercount = $Addusercount +1
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
else {
$LogLine = "Could not find group for " + $Manager
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
}
Function Set-bhRTGmembers_logonly {
# Get manager's 'report to <manager>' group again to update members
$managerReportToGroup = Get-ADGroup -SearchBase $OU -Filter "Name -like 'Report to $Manager'"
if ($managerReportToGroup) {
$LogOnlyAdduserCount = $LogOnlyAddUserCount +1
$LogLine = "Report to " + $Manager + " would be updated with "+ $LogOnlyAddUserCount + " " + $DirectReports.name
Log-Write -LogPath $LogOnlyFile -LineValue $LogLine
}
else {
$LogLine = "Could not find group for " + $Manager
Log-Write -LogPath $LogOnlyFile -LineValue $LogLine
}
}
Function Remove-bhOOSGroups {
[CmdletBinding(SupportsShouldProcess)]
$report = $report -replace ("Report to ", "")
if ($Report -notin $managers) {
Remove-ADGroup -Identity "Report to $Report" -confirm:$false
$LogLine = $report + " user has fell out of scope, Report group removed."
Log-Write -LogPath $sLogFile -LineValue $LogLine
}
else {
Continue
}
}
Function Remove-bhOOSGroups_logonly {
$report = $report -replace ("Report to ", "")
if ($Report -notin $managers) {
$LogLine = $report + " user has fell out of scope, Report group would be removed."
Log-Write -LogPath $sLogOnlyFile -LineValue $LogLine
}
else {
Continue
}
}
#----------------------------------------------[ Execution ]------------------------------------------------
#Managers | Foreach-Object -Parallel {
Foreach ($Manager in $Managers) {
if (-not $LogOnly) {
$Directreports = Get-Directreport $manager -norecurse | Select-Object -expand samAccountName
Ttime = (Get-Date).ToString('T')
Log-Write -LogPath $sLogFile -LineValue $Manager + "'s" + "Direct reports are: " $Directreports
New-bhReportToGroup
Get-bhDReports
Set-bhRTGmembers
Log-Write -LogPath $sLogFile -LineValue "========================[$Time ]==============================="
} else {
New-bhReportToGroup_logonly
Get-bhDReports
Set-bhRTGmembers_logonly
Log-Write -LogPath $LogOnlyFile -LineValue "========================[ LogOnly ]==============================="
}
}
Foreach ($Report in $ReportsTo) {
If (-not $LogOnly){
Remove-bhOOSGroups
} else {
#ForEach ($Report in $ReportsTo) {
Remove-bhOOSGroups_logonly
}
}
#}
Log-Write -LogPath $sLogPath -Linevalue $addgroupcount + " New groups added"
Log-Write -Logpath $sLogPath -Linevalue $AddUserCount + " New users added to groups"
Log-Write -Logpath $sLogOnlyPath -Linevalue $LogOnlyAdduserCount + " Users who would be added"
Log-Write -Logpath $sLogOnlyPath -Linevalue $LogOnlyGroupCount + " Groups that would be added"
Log-Write -LogPath $sLogPath -Linevalue "====[END]====="
这是一个猜测,因为我看不到您的日志写入功能,但由于只有第 5 行有效,我敢打赌您可以通过将字符串传递给 linevalue 来显示其他行参数(通过将整行放在双引号中,使其采用变量值)。像这样:
Log-Write -Logpath $sLogOnlyPath -Linevalue "$LogOnlyGroupCount Groups that would be added"