最近我遇到了this问题。经过大量的研究,终于发现问题出在以下方面:
因此请考虑以下功能:
Function Create-Filter($filter)
{
$filter.Split(',') | ForEach-Object {"*.$($_.Trim())"}
return
}
(上述函数获取字符串变量,例如“ csproj,vbproj”,并将其转换为* .csproj * .vbproj)
...下面的代码不起作用,用于-include参数的变量$ filter不喜欢Get-ChildItem,并且什么也不返回:
$filter = "csproj, vbproj"
$filter = Create-Filter ($filter)
Get-ChildItem "D:\Path\To\My\Root\Folder" -Include $filter -Recurse
下面是使用不同的变量来存储并将其作为参数传递的方法:
$filter = "csproj, vbproj"
$formattedfilter = Create-Filter ($filter)
Get-ChildItem "D:\Path\To\My\Root\Folder" -Include $formattedfilter -Recurse
...现在,Get-ChildItem起作用了。
在其他语言中,可以使用相同的变量将其作为参数传递并存储该函数返回的值。那么,您能否解释一下为什么在Powershell中如果使用相同的变量却不起作用?
答案 0 :(得分:3)
不确定您的代码为什么不起作用,因为这种情况下的返回是多余的,并且结果被放在输出流中。
因此,相同的代码但已重构:
function New-Filter
{
param (
[Parameter(Mandatory=$true)]
[String[]] $filter
)
return $filter.Split(',') | ForEach-Object {"*.$($_.Trim())"}
}
$filter = @("csproj, vbproj")
$filter = New-Filter $filter
Get-ChildItem -Path "D:\Path\To\My\Root\Folder" -Include $filter -Recurse