Invoke-Parallel icon indicating copy to clipboard operation
Invoke-Parallel copied to clipboard

Calling custom functions from inside Invoke-Parallel

Open bab5470 opened this issue 9 years ago • 4 comments

I'm trying to call some custom functions inside of Invoke-Parrallel as such:

if ($xmlfile.configuration.DBAndFilesBackup.item("MSSQL").haschildnodes) {
    foreach ($backup in $xmlfile.configuration.DBAndFilesBackup.MSSQL.backup) {     

        Invoke-Parallel -ImportVariables -Throttle 2 {

            # Create a unique log file for this particular backup job
            $log="$ScriptDir\logs\corebackup\$ScriptName $($backup.Name) $DateStamp.log"

            # Begin the Backup
            BeginBackup $backup.Name $log

            # Backup the mssql database
            MSSQLBackup $backup.Name $backup.DBPath 

            # Backup the files
            FilesBackup $backup.Name $backup.FolderName $backup.FilesPath 

            # End the Backup
            EndBackup $backup.FolderName $backup.Name $log $emailTo

                }
    }
}

However when I do this I get the following error:

Get-RunspaceData : The term 'BeginBackup' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\scripts\includes\invoke-parallel.ps1:591 char:13
+             Get-RunspaceData -wait
+             ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (BeginBackup:String) [Write-Error], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException,Get-RunspaceData

Get-RunspaceData : The term 'MSSQLBackup' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\scripts\includes\invoke-parallel.ps1:591 char:13
+             Get-RunspaceData -wait
+             ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (MSSQLBackup:String) [Write-Error], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException,Get-RunspaceData

Get-RunspaceData : The term 'FilesBackup' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\scripts\includes\invoke-parallel.ps1:591 char:13
+             Get-RunspaceData -wait
+             ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (FilesBackup:String) [Write-Error], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException,Get-RunspaceData

Get-RunspaceData : The term 'EndBackup' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\scripts\includes\invoke-parallel.ps1:591 char:13
+             Get-RunspaceData -wait
+             ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (EndBackup:String) [Write-Error], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException,Get-RunspaceData

What am I doing wrong and how can I avoid this error?

As a side note - how to i avoid entering an input variable? I don't think I necessarily have anything to input if that makes sense?

Thanks Brad

bab5470 avatar Aug 17 '15 16:08 bab5470

Hi Brad!

Invoke-Parallel won't pull in function definitions - as a workaround, if you import the module or load up the functions inside the Invoke-Parallel scriptblock, it should work.

I'll look at adding a parameter to allow including functions from the current PowerShell session, but might take a bit of time.

I still use Invoke-Parallel for a number of ad-hoc tasks and scripts, but do check out @proxb's PoshRSJob; it includes this functionality already, if I recall correctly.

Thanks!

Warren

RamblingCookieMonster avatar Aug 17 '15 17:08 RamblingCookieMonster

I'll look at adding a parameter to allow including functions from the current PowerShell session, but might take a bit of time.

That would be great - thanks.

My reservation with using a PS module is portability of the script. I'd like to keep the code all self contained in one folder so that migrating it to a new server is as simple as copying the script folder.

Having the extra step of having to install a custom module isn't the end of the world but also not ideal either - particularly if a future maintainer isn't familiar with the script.

The reason for trying to use Invoke-Parallel is that I need to kick off a number of backjob jobs (as you may have guessed from my function names) but I also need transcription (powershell logging).

I was attempting to use the powershell start-job native function but I guess that doesn't support transcription when running jobs. :(

Would invoke-parallel support powershell transcripts if i created a POSH module with my custom functions? Any idea if PoshRSJob does either?

Thanks, Brad

bab5470 avatar Aug 17 '15 17:08 bab5470

Alrighty! This was added in #46. You can now use -ImportFunctions

Now that I think about it... there might be some oddities for functions defined in modules - will have to revisit that.

Cheers!

RamblingCookieMonster avatar May 13 '17 18:05 RamblingCookieMonster

Hi, I am trying to use this function to call my custom function in parallel, but it fails.. 1: I am not able to pass multiple input parameters to my custom function 2. Custom Function doesnt respond correctly when invoke using this function

Invoke-Parallel -ScriptBlock { Get-vspherevmname -vmname $_.NAME -org "12345" -vapp "12345"} -InputObject $vm -ImportFunctions

Below is how i call the function individually and using invoke-parallel

PS C:\Users\e554> Get-vspherevmname -vmname $vmv[0].Name -org $org.Name -vapp $Vappp.Name output: R511-SRVA-WyU3

PS C:\Users\e554> $bab = Invoke-Parallel -ScriptBlock { Get-vspherevmname -vmname $_.NAME -org "ID14434-1-1231231" -vapp "12345"} -InputObject $vmv -ImportFunctions Output:Catch Block

Can you please help

pathaknikhil87 avatar Jul 17 '19 12:07 pathaknikhil87