简体   繁体   中英

Send variables from inside Invoke-Command scriptblock back to host

The below is a script that is collecting information about SQL-jobs on remote servers.
However, I want to send the information inside the catch-block back to the host. As the script is written now the script is printing to a logfile on each remote server.

How can I send the information back to the host?

$sqlServers = @("SERVER1","SERVER2")

$runningHost = "$env:computername"
$filePath = "C:\SQLJobInventory"
$desktopPath = [Environment]::GetFolderPath("Desktop")

$output = Invoke-Command -ComputerName $sqlServers -ArgumentList $filePath,$dateToday,$dateTodayFile -ScriptBlock{

    param
    (
        $filePath,
        $dateToday,
        $dateTodayFile
    )  

    $runningHostRemote = $env:computername

    Try
    {
        Import-Module sqlserver -ErrorAction Stop
        $instances = $runningHostRemote | Foreach-Object {Get-ChildItem -Path "SQLSERVER:\SQL\$_"} -ErrorAction Stop
    }
    Catch
    {
        Write-Output "$dateToday [ERROR] $runningHostRemote" |
            Out-File "$filePath\Log$dateTodayFile.txt" -Append
        Exit
    }

    ForEach ($instance in $instances)
    {
        Try
        {
        $instanceName = $instance.InstanceName
        Get-SqlAgentJob -ServerInstance "$runningHostRemote\$instanceName" -ErrorAction Stop |
            Where-Object {$_.IsEnabled -eq "True" -and $_.LastRunDate -gt [DateTime]::Today.AddDays(-2) -and $_.OwnerLoginName -match "LKL"} |
                Select-Object @{Name=‘Job name‘;Expression={$_.Name}},
                    @{Name=‘Description‘;Expression={$_.Description}},
                    @{Name=‘Instance‘;Expression={$_.Parent -Replace '[][]'}},
                    @{Name=‘Run outcome‘;Expression={$_.LastRunOutcome}},
                    @{Name=‘Run date‘;Expression={$_.LastRunDate}},
                    @{Name=‘Run duration‘;Expression={$_.LastRunDuration}},
                    @{Name=‘Job creator‘;Expression={$_.OwnerLoginName}},
                    @{Name=‘Runs on a schedule‘;Expression={$_.HasSchedule}},
                    @{Name='Schedule Type';Expression={$_.JobSchedules -join ','}}
        }
        Catch
        {
            Write-Output "$dateToday [ERROR] $runningHostRemote\$instanceName" |
                Out-File "$filePath\Log$dateTodayFile.txt" -Append
            Exit
        }
    }
}

$output | Select-Object -Property * -ExcludeProperty PSComputerName,RunSpaceID,PSShowComputerName |
    Sort-Object "Job name" |
        Export-Csv $filePath\SQLJobInvent$dateTodayFile.csv -NoTypeInformation -Delimiter ";" -Encoding UTF8

Write-Output "$dateToday [INFO] $filePath\Log$dateTodayFile.txt" |
    Out-File "$filePath\Log$dateTodayFile.txt" -Append

Change write-output to return

        Catch
    {
        Return "$dateToday [ERROR] $runningHostRemote\$instanceName"
    }

Return will exit the script block and pass your string back to the output variable.

I have solved it by creating my own properties of the output-variable with New-Object. There is probably a better way to do it but this was the most convinient.

The Return-method did not work for me in this particular script.

$runningHost = "$env:computername"
$filePath = "C:\SQLJobInventory"
$lastResortPath = [Environment]::GetFolderPath("Desktop")

$dateToday = Get-Date -Format “yyMMdd HH:mm"
$dateTodayFile = Get-Date -Format “yyMMdd"

$output = Invoke-Command -ComputerName $sqlServers -ArgumentList $filePath,$dateToday,$dateTodayFile -ScriptBlock{

    param
    (
        $filePath,
        $dateToday,
        $dateTodayFile
    )  

    $runningHostRemote = $env:computername

    Try
    {
        Import-Module sqlserver -ErrorAction Stop

        $instances = $runningHostRemote | Foreach-Object {Get-ChildItem -Path "SQLSERVER:\SQL\$_"} -ErrorAction Stop
    }
    Catch
    {
        $moduleError = @{moduleError="$dateToday [ERROR] $runningHostRemote"}
        New-Object -Type PSObject -Property $moduleError
        Exit
    }

    ForEach ($instance in $instances){

        Try
        {
            $instanceName = $instance.InstanceName

            $jobSuccess = @{jobSuccess="$dateToday [INFO]"}
            New-Object -Type PSObject -Property $jobSuccess

            Get-SqlAgentJob -ServerInstance "$runningHostRemote\$instanceName" -ErrorAction Stop |
                Where-Object {$_.IsEnabled -eq "True" -and $_.LastRunDate -gt [DateTime]::Today.AddDays(-2) -and $_.OwnerLoginName -match "LKL"} |
                    Select-Object @{Name=‘Job name‘;Expression={$_.Name}},
                        @{Name=‘Description‘;Expression={$_.Description}},
                        @{Name=‘Instance‘;Expression={$_.Parent -Replace '[][]'}},
                        @{Name=‘Run outcome‘;Expression={$_.LastRunOutcome}},
                        @{Name=‘Run date‘;Expression={$_.LastRunDate}},
                        @{Name=‘Run duration‘;Expression={$_.LastRunDuration}},
                        @{Name=‘Job creator‘;Expression={$_.OwnerLoginName}},
                        @{Name=‘Runs on a schedule‘;Expression={$_.HasSchedule}},
                        @{Name='Schedule Type';Expression={$_.JobSchedules -join ','}}
        }
        Catch
        {
            $jobError = @{jobError="$dateToday [ERROR] $runningHostRemote\$instanceName"}
            New-Object -Type PSObject -Property $jobError
            Exit
        }
    }
}

$output | Select-Object -ExpandProperty moduleError -ErrorAction SilentlyContinue | Out-File "$filePath\Log$dateTodayFile.txt" -Append
$output | Select-Object -ExpandProperty Jobsuccess -ErrorAction SilentlyContinue | Out-File "$filePath\Log$dateTodayFile.txt" -Append
$output | Select-Object -ExpandProperty jobError -ErrorAction SilentlyContinue | Out-File "$filePath\Log$dateTodayFile.txt" -Append

$output | Select-Object -Property * -ExcludeProperty PSComputerName,RunSpaceID,PSShowComputerName |
    Sort-Object "Job name" |
        Export-Csv $filePath\SQLJobInvent$dateTodayFile.csv -NoTypeInformation -Delimiter ";" -Encoding UTF8

Write-Output "$dateToday [INFO] $filePath\Log$dateTodayFile.txt" |
    Out-File "$filePath\Log$dateTodayFile.txt" -Append

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM