Where-Object在存储在变量中时不对ScriptBlock进行过滤

时间:2014-04-21 20:55:56

标签: powershell powershell-v3.0

我想过滤一个文件夹中的一组文件,其中包含where子句:

$fileParams = @{
    Path = C:\Files\*
    Include = '*.cs'
    Recurse = $true
}    
Get-ChildItem @fileParams | where {$_.Name -match `
    '^(?!Status|Answer|Question).*'}

这可以按预期工作。

问题

我的问题是我想将正则表达式存储在配置文件中并将其传递给我的函数。这意味着过滤器脚本必须以字符串形式开始。当我执行以下两项操作以尝试让PowerShell执行过滤器脚本时,它不会过滤:

Option 1:
[String]$Filter = '^(?!Status|Answer|Question).*'
Get-ChildItem @fileParams | where {$_.Name -match $Filter}

Option 2:
$filterText = '{$_.Name -match "^(?!Status|Answer|Question).*"}'
[ScriptBlock]$filter = [ScriptBlock]::Create($filterText)
Get-ChildItem @fileParams | where -FilterScript $filter

我已经将变量中存储的内容粘贴到变量中,并按预期过滤掉文件。

如何将这些文件过滤下来,以便过滤器的详细信息存储在配置文件中?我必须相信我有一个缺少的选择。

1 个答案:

答案 0 :(得分:1)

这对我有用:

$a='^(?!2008|2011|2012).*'
$a | out-file .\filter.config
$b = gc .\filter.config
Get-ChildItem @FileParams | where {$_.Name -match $b}

(我的过滤器与我在HD上的文件不同,但模式类似)。

你能详细说明选项1不工作吗?