Почему мой оператор if не читается должным образом?

У меня есть сценарий, который создает резервную копию профиля пользователя с локального или удаленного компьютера и помещает его в общий ресурс: . Я немного подправил его и просто превратил некоторые переменные в глобальные (не уверен, что это проблема - не понимаю, почему это так).

Ладно, по какой-то причине мой оператор не анализирует условие должным образом и продолжает отображать мое окно сообщения до того, как все задания будут выполнены:

              Register-ObjectEvent -InputObject $job -EventName StateChanged -Action {
        #Start-Sleep -Milliseconds 500
            $eventSubscriber | Unregister-Event
            $eventSubscriber.Action | Remove-Job
            if(-not (Get-EventSubscriber)){
                $Profile_Sum = Get-ChildItem -Path $Global:BackUp_Path -Recurse |
                    Measure-Object -Property length -Sum |
                    Select-Object -ExpandProperty Sum
                        $Size = try{if($Profile_Sum -lt 1048576){ $TinyByte = "  {0:N2}" -f ($Profile_Sum / 1KB) + " KB"; $TinyByte }
                        elseif($Profile_Sum -gt 1048576 -and $Profile_Sum -lt 1073741824){ $MediumByte = "  {0:N2}" -f ($Profile_Sum / 1MB) + " MB"; $MediumByte }
                        elseif($Profile_Sum -gt 1073741824){ $GiganticByte = "  {0:N2}" -f ($Profile_Sum / 1GB) + " GB"; $GiganticByte } } Catch {}
            
                $Begin_Time = Get-Item -Path $Global:BackUp_Path | Select-Object -ExpandProperty LastWriteTime
               
                $End_Time = Get-Date -Format G  

                Get-Job | Remove-Job 
                [System.Windows.MessageBox]::Show("Copying Complete!`nStart Time: $Begin_Time  `nEnd Time: $End_Time `nProfile Size copied: $Size")
                       
                        }
                    } | Out-Null 
                }

Я чувствую, что у меня может быть идея из-за того, что само событие зарегистрировано как задание, но я не слишком уверен, как это сделать, и заставить его ждать, пока оно не будет выполнено со ВСЕМИ заданиями, прежде чем отображать окно сообщения, информирующее меня, когда копирование завершено. В остальном сценарий работает отлично, и любой, кто его читает, может использовать его самостоятельно. Вот полный сценарий:

      Function PFL-UserBackUp{
[cmdletbinding()]
    Param(
        [Parameter(Mandatory=$false,
                   ValueFromPipeLine=$true,
                   ValueFromPipeLineByPropertyName=$true)]
        [Alias('CN','Computer','server','node')]
        [ValidateLength(1, 15)]
        [String[]]$ComputerName = $env:COMPUTERNAME )
Begin{
    $Global:Shared_BackupPath = "\\server\share"
    }
Process{
    Foreach($Computer in $ComputerName){
        Try{
            $PSSession  = New-PSSession -ComputerName $Computer -ErrorAction Stop 

            [array]$User_List = Invoke-Command -ScriptBlock { 
                                    Get-ChildItem -Path "C:\Users" -Exclude Public, Default* | 
                                    Sort-Object -Property LastWriteTime -Descending } -Session $PSSession

    $userinfo1 = foreach ($user in $User_List.name) {
      $userinfo = (net user $user /domain | Select-String "Full Name" -ErrorAction SilentlyContinue) -replace "Full Name                    ", "" 2>&1 | Out-String -Stream
        if ($userinfo.Length -lt 4) { "NO DISPLAY NAME in ADUC" }
            elseif($LASTEXITCODE -eq 2) { "ACCOUNT NOT in ADUC" }
            elseif($LASTEXITCODE -eq 0) { $userinfo }
                else { "Error occured" }
                }
 
     $(for($i=0; $i -lt $User_List.Count; $i++){
        [pscustomobject]@{
                'User Display Name    '  = "$($i): $($userinfo1[$i])"
                '    NAME    '           = $User_List.name[$i]
                'Last Modified'          = "$($User_List.LastWriteTime[$i])" 
                'Profile Size '          = Try{
                                             $ProfilePath = $User_List.FullName[$i] 
                                             $Profile_Sum = Invoke-Command -ScriptBlock {
                                                        Get-ChildItem -Path $Using:ProfilePath -Recurse |
                                                                Where-Object {$_.PSParentPath -match "Documents|Desktop|Music|Videos|Downloads|Links|Pictures|Favorites|Contacts" -and $_.DirectoryName -notmatch "OneDrive" } | 
                                                                Measure-Object -Property length -Sum |
                                                                Select-Object -ExpandProperty Sum } -Session $PSSession
                                                                    if($Profile_Sum -lt 1048576){ $TinyByte = "  {0:N2}" -f ($Profile_Sum / 1KB) + " KB"; $TinyByte }
                                                                    elseif($Profile_Sum -gt 1048576 -and $Profile_Sum -lt 1073741824){ $MediumByte = "  {0:N2}" -f ($Profile_Sum / 1MB) + " MB"; $MediumByte }
                                                                    elseif($Profile_Sum -gt 1073741824){ $GiganticByte = "  {0:N2}" -f ($Profile_Sum / 1GB) + " GB"; $GiganticByte } #Profile Size
                                              } Catch { "$($Error[0].Exception.Message.Split('.')[2].Trim())!" }
                                         }
                                    } ) | Out-Host

Write-Host "Press 'Q' to quit."
$ii = Read-Host -Prompt "Enter Number of Profile to Back-Up"
$i  = $ii.Trim() -split ","
    if([String]::IsNullOrEmpty($i) -eq $true) { "Null string"; Break }
    elseif($i.ToLower() -like "q*") {"Q was selected. Stopping script."; Break }


<#    
    " "    
    "     Following Profiles will be Saved:"
    "     ------------------------------------"
        foreach($i in $index) { "$($i.trim()): $($userinfo1[$i])" }
    " "


$Confirm = Read-Host -Prompt "Are you sure you want to continue? [Y/N]"
    if($Confirm.ToLower().TrimStart() -like "n*" -or $Confirm.ToLower() -like "q*"){Break} 
    if([String]::IsNullOrEmpty($Confirm.Trim()) -eq $true) { "Null string"; Break }#>


        $Profile_Path       = "C:\Users\$($User_List.name[$i])"
        $Literal_Name       = $userinfo1[$i].Replace('/','-')
        $Global:BackUp_Path = "$Global:Shared_BackupPath$Literal_Name"
        $Test_Path          = Test-Path -Path $Global:BackUp_Path 
            if($Test_Path -eq $false){
                New-Item -Path $Global:BackUp_Path -ItemType Directory | Out-Null
                Start-Process $Global:BackUp_Path}
            elseif($Test_Path -eq $true){
                $Find_OldName  = Get-ChildItem -Path "$Global:Shared_BackupPath" -Filter "$Literal_Name" -Directory |
                                     Sort-Object -Property LastWriteTime -Descending |
                                     Select-Object -ExpandProperty BaseName -First 1

                 $New_PathName = $Find_OldName + "1"
                    New-Item -Path "$Global:Shared_BackupPath" -Name $New_PathName -ItemType Directory -OutVariable Global:BackUp_Path | Out-Null #Global:BackUp_Path variable declared
                    $Global:BackUp_Path = $Global:BackUp_Path.FullName
                    Start-Process $Global:BackUp_Path}


$Global:Start_Time = Get-Date -Format G


#Favorites Copy   
$FireFox_Favorites = "C:\Users\$($User_List.name[$i])\AppData\Roaming\Mozilla\Firefox\Profiles\*.default\places.sqlite"
$Chrome_Favorites  = "C:\Users\$($User_List.name[$i])\AppData\Local\Google\Chrome\User Data\Default\Bookmarks"
$Chrome_Favorites2 = "C:\Users\$($User_List.name[$i])\AppData\Local\Google\Chrome\User Data\Default\Bookmarks.bak"
$Sticky_Notes      = "C:\Users\$($User_List.name[$i])\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite"

$Favorites_Array   = @($FireFox_Favorites,$Chrome_Favorites,$Chrome_Favorites2,$Sticky_Notes)
    Foreach($File in $Favorites_Array){
        $Test_File = Invoke-Command -ScriptBlock { Test-Path -Path $File }
            if($Test_File -eq $true){
                Copy-Item -Path $File -Destination $Global:BackUp_Path -Force -Recurse -FromSession $PSSession 
                        }
                    }                     

#Folders Copy
$Folders = @('Desktop','Documents','Favorites','Links','Downloads','Music','Videos','Pictures','Contacts') 
    Foreach($Folder in $Folders){
        #Create Arugments for seperate thread
        $ArgumentsArray = $null

        $ArgumentsArray = @()
        $ArgumentsArray += "\\$Computer\c$\Users\$($User_List.name[$i])\$Folder"
        $ArgumentsArray += $Global:BackUp_Path
        $job = Start-Job -ScriptBlock { Copy-Item -Path $args[0] -Destination $args[1] -Force -Recurse } -Name $Folder -ArgumentList $ArgumentsArray 

        
        Register-ObjectEvent -InputObject $job -EventName StateChanged -Action {
        #Start-Sleep -Milliseconds 500
            $eventSubscriber | Unregister-Event
            $eventSubscriber.Action | Remove-Job
            if(-not (Get-EventSubscriber)){
                $Profile_Sum = Get-ChildItem -Path $Global:BackUp_Path -Recurse |
                    Measure-Object -Property length -Sum |
                    Select-Object -ExpandProperty Sum
                        $Size = try{if($Profile_Sum -lt 1048576){ $TinyByte = "  {0:N2}" -f ($Profile_Sum / 1KB) + " KB"; $TinyByte }
                        elseif($Profile_Sum -gt 1048576 -and $Profile_Sum -lt 1073741824){ $MediumByte = "  {0:N2}" -f ($Profile_Sum / 1MB) + " MB"; $MediumByte }
                        elseif($Profile_Sum -gt 1073741824){ $GiganticByte = "  {0:N2}" -f ($Profile_Sum / 1GB) + " GB"; $GiganticByte } } Catch {}
            
                $Begin_Time = Get-Item -Path $Global:BackUp_Path | Select-Object -ExpandProperty LastWriteTime
               
                $End_Time = Get-Date -Format G  

                Get-Job | Remove-Job 
                [System.Windows.MessageBox]::Show("Copying Complete!`nStart Time: $Begin_Time  `nEnd Time: $End_Time `nProfile Size copied: $Size")
                       
                        }
                    } | Out-Null 
                }

" "
Write-Output -InputObject "Copying will be done in background."
Write-Output -InputObject "You will be notified when copying is done."

            } catch [System.Management.Automation.Remoting.PSRemotingTransportException]{
                "Unable to connect to PC: $Computer `nError: $($Error[0].Exception.Message.Split('.')[2].Trim())!"
                }
            }
        }
    }

Я удалил некоторую информацию, которая могла вызвать у меня проблемы, но это все косметика.(:

1 ответ

Чтобы просто ответить на ваш вопрос:

Почему мой оператор if не читается должным образом?

Незадолго до того, как вы оцените вы отменяете подписку на мероприятие и тем самым удаляете подписчика на мероприятие. Get-EventSubscriber поэтому возвращается $null что оценивается как $true, при отрицании. В заключение код после вашего if Оператор всегда будет выполняться немедленно.

Прокомментированный код:

      Register-ObjectEvent -InputObject $job -EventName StateChanged -Action {
    $eventSubscriber | Unregister-Event    # Here you cancel your event subscription
    $eventSubscriber.Action | Remove-Job
    if (-not (Get-EventSubscriber)) {      # Therefore, Get-EventSubscriber returns $null; not $null evaluates to $true
        ...

Соответствующая часть в документации :

В Unregister-Event командлет отменяет подписку на событие, созданную с помощью Register-EngineEvent, Register-ObjectEvent, или же Register-WmiEvent командлет.

Когда подписка на событие отменяется, подписчик на событие удаляется из сеанса, и подписанные события больше не добавляются в очередь событий. При отмене подписки на событие, созданное с помощью New-Event командлет, новое событие также удаляется из сеанса.

Другие вопросы по тегам