Сценарий запуска-задания Powershell не может распознать функцию, определенную в том же файле? - PullRequest
12 голосов
/ 06 января 2012

У меня есть следующий код.

function createZip
{
Param ([String]$source, [String]$zipfile)
Process { echo "zip: $source`n     --> $zipfile" }
}

try {
    Start-Job -ScriptBlock { createZip "abd" "acd" } 
}
catch {
    $_ | fl * -force
}
Get-Job | Wait-Job 
Get-Job | receive-job 
Get-Job | Remove-Job 

Однако скрипт возвращает следующую ошибку.

Id              Name            State      HasMoreData     Location             Command                  
--              ----            -----      -----------     --------             -------                  
309             Job309          Running    True            localhost            createZip "a...
309             Job309          Failed     False           localhost            createZip "a...
Receive-Job : The term 'createZip' 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 line:17 char:22
+ Get-Job | receive-job <<<<  
    + CategoryInfo          : ObjectNotFound: (function:createZip:String) [Receive-Job], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Кажется, имя функции не может быть распознано внутри блока скрипта start-job.Я тоже пытался function:createZip.

Ответы [ 2 ]

15 голосов
/ 06 января 2012

Start-Job на самом деле раскручивает другой экземпляр PowerShell.exe, в котором нет функции createZip. Вам нужно включить все это в блок скрипта:

$createZip = {
    param ([String]$source, [String]$zipfile)
    Process { echo "zip: $source`n     --> $zipfile" }
}

Start-Job -ScriptBlock $createZip  -ArgumentList "abd", "acd"

Пример возврата сообщения об ошибке из фонового задания:

$createZip = {
    param ([String] $source, [String] $zipfile)

    $output = & zip.exe $source $zipfile 2>&1
    if ($LASTEXITCODE -ne 0) {
        throw $output
    }
}

$job = Start-Job -ScriptBlock $createZip -ArgumentList "abd", "acd"
$job | Wait-Job | Receive-Job

Также обратите внимание, что при использовании throw объект задания State будет «Сбой», поэтому вы можете получить только задания, которые не удалось: Get-Job -State Failed.

6 голосов
/ 16 мая 2013

Если вы все еще не знакомы с использованием start-job и receive-job и хотите более легко отлаживать свою функцию, попробуйте следующую форму:

   $createZip = { 
   function createzipFunc {
     param ([String]$source, [String]$zipfile)
     Process { echo "zip: $source`n     --> $zipfile" }
     }
     #other funcs and constants here if wanted...
   }
   # some secret sauce, this defines the function(s) for us as locals
   invoke-expression $createzip

   #now test it out without any job plumbing to confuse you
   createzipFunc "abd" "acd"

   # once debugged, unfortunately this makes calling the function from the job  
   # slightly harder, but here goes...
   Start-Job -initializationScript $createZip -scriptblock {param($a,$b) `
createzipFunc $a $b } -ArgumentList "abc","def"

Все не упрощается тем, что я этого не делалопределил мою функцию как простой фильтр, как у вас, но я сделал это, потому что в конце я хотел передать несколько функций в мою работу.

Извините, что выкопал эту ветку, но это также решило мою проблемуи так элегантно в этом.И поэтому мне просто нужно было добавить немного соуса, который я написал во время отладки своей работы в PowerShell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...