工作流不尊重函数中定义的文件路径变量



我正在尝试使用工作流并行运行两个函数。这个脚本到达我的Nuget包存储库,获取版本,然后将这些版本号插入到下载URL中。我想设置$directory,这样我就可以轻松地更改文件路径。当运行以下操作时,作业可以正确地并行运行,但它们将文件夹部署到C:\而不是C:\Temp。如果我将路径定义为它的字面路径,它可以正常工作,如果我只是在没有工作流的情况下执行函数,它也可以正常工作。有什么想法吗?

$directory = 'C:Temp'
function getPackage1 {
param ()
$api = 'http://localhost/nuget/PackageName/Packages()?$format=json&$filter=id%20eq%20%27Package.Dotnet%27%20&$select=Version'
$responses = (Invoke-RestMethod $api).d.results.Version
foreach($response in $responses)
{
Invoke-WebRequest http://localhost/nuget/PackageName/package/Package.Dotnet/$response -OutFile (New-Item "$($directory)package$response.nupkg" -Force)
}
}
function getPackage2 {
param ()
$api = 'http://localhost/nuget/PackageName2/Packages()?$format=json&$filter=id%20eq%20%27Package.Dotnet2%27%20&$select=Version'
$responses = (Invoke-RestMethod $api).d.results.Version
foreach($response in $responses)
{
Invoke-WebRequest http://localhost/nuget/PackageName2/package/Package.Dotnet/$response -OutFile (New-Item "$($directory)package2$response.nupkg" -Force)
}
}
workflow getAllPackages {
param ()
parallel {
getPackage1
getPackage2
}  
}
try { getAllPackages }
catch {'An unspecifed error occurred while downloading the files'}

工作流对于"加速"事情来说非常糟糕,请参见下文


您需要明确地将所有输入传递给工作流

工作流被设计为与调用进程分开执行,因此命令和输入值在执行之前被序列化(基本上转换为XML(。

因此,您必须明确地将工作流中引用的所有内容作为参数传递,它在运行时无法直接访问调用范围:

function getPackage1 {
param($directory)
# ...
}
function getPackage2 {
param($directory)
#...
}
workflow getAllPackages {
param($directory)
parallel {
getPackage1 $directory
getPackage2 $directory
}  
}
try { getAllPackages $PWD.Path } catch { <# ... #> }

正如第一个标题所暗示的,工作流程非常缓慢(而且很复杂(,所以如果你只是想加快下载所有文件的速度,你还不如用Start-Job:将请求分配给新的进程

function Get-PackageVersions
{
param ([string]$Destination)
$api = 'http://localhost/nuget/PackageName/Packages()?$format=json&$filter=id%20eq%20%27Package.Dotnet%27%20&$select=Version'
$responses = (Invoke-RestMethod $api).d.results.Version
$Jobs = foreach($response in $responses)
{
Start-Job { Invoke-WebRequest http://localhost/nuget/PackageName/package/Package.Dotnet/$using:response -OutFile (New-Item "$($using:Destination)package$using:response.nupkg" -Force) }
}
# Wait 30 seconds for jobs to complete
$completedJobs = $Jobs |Wait-Job -Timeout 30
$Jobs |Remove-Job 
if(-not $completedJobs){
throw "Did not finish downloading all $($Jobs.Count) versions in time"
}
}

然后像这样传递你的论点:

$directory = "C:targetfolder"
Get-PackageVersions $directory

最新更新