在 powershell 中调用函数时使用相同的变量作为参数和存储
Using the same variable as parameter and storage when calling a function in powershell
最近我遇到了 问题。调查了很多小时后,我终于发现问题出在对以下变量使用相同的变量:
- 存储函数返回的值
- 将其作为参数传递给函数
所以考虑到以下功能:
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 中如果使用相同的变量这不起作用吗?
不确定为什么您的代码不起作用,因为您的 return 是多余的,结果放在输出流中。
所以相同的代码但是重构了:
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
最近我遇到了
- 存储函数返回的值
- 将其作为参数传递给函数
所以考虑到以下功能:
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 中如果使用相同的变量这不起作用吗?
不确定为什么您的代码不起作用,因为您的 return 是多余的,结果放在输出流中。
所以相同的代码但是重构了:
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