2017-07-19 31 views
3

我有一個PowerShell腳本,其目的是獲取文件列表,然後在每個文件上做一些工作。在工作流旁邊使用遞歸函數

文件的列表由一個遞歸函數產生這樣的:

從該函數我這樣做的工作流上的每個文件需要的文件的列表,並執行工作(並行)
function Recurse($path) 
{ 
    .. create $folder 

    foreach ($i in $folder.files) { 
     $i 
    } 
    foreach ($i in $folder.subfolders) { 
     Recurse($i.path) 
    } 
} 

獨立。該代碼看起來是這樣的:

workflow Do-Work { 
    param(
     [parameter(mandatory)][object[]]$list 
    ) 
    foreach -parallel ($f in $list) { 
     inlinescript { 
      .. do work on $Using:f 
     } 
    } 
} 

這兩部分,然後用下面的邏輯組合:

$myList = Recurse($myPath) 
Do-Work -list $myList 

的問題是,這會產生一個錯誤:

A workflow cannot use recursion. 
    + CategoryInfo   : ParserError: (:) [], ParseException 
    + FullyQualifiedErrorId : RecursiveWorkflowNotSupported 

爲什麼這發生在遞歸函數和工作流是分開的時候嗎? 有什麼辦法解決這個問題?

+1

$ myList = Recurse($ myPath)不應該是遞歸$ myPath(沒有括號)? –

+0

我不知道:)林新的PowerShell,我想我曾經調用這樣的功能 –

回答

0

我最終(當然只是張貼問題後幾分鐘)解決了這個由剛提取功能到其自身的模塊:

GET-files.psm1:

function Recurse() 
{ 
    params(
     [parameter(mandatory)][string]$path 
    ) 
    .. create $folder 

    foreach ($i in $folder.files) { 
     $i 
    } 
    foreach ($i in $folder.subfolders) { 
     Recurse($i.path) 
    } 
} 

Export-ModuleMember -Function Recurse 

GET- files.psd1:

@{ 
... 
FunctionsToExport = @(Recurse) 
... 
} 

script.ps1:

workflow do-work { 
    params(
     [parameter(mandatory)][object[]]$files 
    ) 
    ... 
} 
Import-Module -Name "path\to\module\get-files.psm1" 
$files = Recurse -path $myPath 

do-work -files $files 

這似乎已經使主腳本錯過了Recurse使用遞歸,它的工作原理。

1

在工作流程中不允許遞歸調用。

給你的直接路徑:

取而代之的是:

Recurse($myPath) 

做到這一點:

Recurse $myPath 

你可以參考這篇文章:

Adding Nested functions and Nested Workflows

+0

調用'Recurse'裏面的'Recurse'實際上(遞歸)獲取所有子目錄中的所有文件的關鍵點。這會繼續嗎? –

+0

應該實際工作。讓我們看看你是否面臨任何問題。 –

+0

它似乎是導致錯誤的非常功能定義。儘管我以另一種方式解決了這個問題,但是將該功能移至自己的模塊,然後導入該功能。我確實放棄了'Recurse $ myPath'的'Recurse($ myPath)'語法:) –