0

我在函数中获取 Get-ChildItem的过滤器参数时遇到问题。

以下工作正常并显示完整的文件列表:

c:\temp\Get-ChildItem -Include *deleteme*.txt -Recurse

现在说我有以下脚本

#file starts here
#filename = GetLastFile.ps1

param([string] $filter)

$files = Get-ChildItem $filter

Write-Host $files #should print all matching files but prints nothing

$file = $files | Select-Object -Last 1;


$file.name  #returns filename
#File ends here

现在尝试运行脚本,

c:\temp.\GetLastFile.ps1 "-Include *deleteme*.txt -Recurse"

什么都不返回。

提供过滤器*.*,工作正常。-Include由于or ,它似乎失败了-Exclude。有任何想法吗?

4

3 回答 3

5

您开始进入 Powershell 2.0 代理功能可以提供帮助的领域。但是,除此之外,这里有一个 PowerShell 2.0 中的简单方法来执行此操作,假设您只需要 -Include 和 -Recurse。实际上,我建议使用 -Filter 来代替它,它会做你想做的事,坦率地说,它更快(在我的一些测试中是 4 倍),因为 -filter 使用操作系统提供的文件系统过滤,而 -include 由 PowerShell 处理。

param([string]$Filter, [switch]$Recurse)

$files = Get-ChildItem @PSBoundParameters

Write-Host $files #should print all matching files but prints nothing

$file = $files | Select-Object -Last 1;

$file.name #returns filename

@符号用于将一个数组或哈希表“分解”到一个命令的参数中。$PSBoundParameters 变量是在函数中定义的 PowerShell 2.0 新的自动变量。这是一个包含所有有界(命名和位置)参数的哈希表,例如:

PS> function foo($Name,$LName,[switch]$Recurse) { $PSBoundParameters }
PS> foo -Name Keith Hill -Recurse

Key                                                         Value
---                                                         -----
Name                                                        Keith
Recurse                                                     True
LName                                                       Hill

当您将这样的哈希表与命令相匹配时,PowerShell 会将键的(例如 Recurse)值映射到命令上名为 Recurse 的参数。

于 2010-02-10T17:52:07.023 回答
0

您可以使用 Invoke-Expression 执行存储在变量中的命令。例如:

param([string] $filter)
$files = Invoke-Expression "Get-ChildItem $filter"

Write-Host $files

$file = $files | Select-Object -Last 1

$file.name
于 2014-12-02T23:41:12.743 回答
0

我相信正在发生的事情是您的 $filter 参数被视为 Get-ChildItem 命令的单个字符串参数。因此,除非您有一个名为“-Include deleteme.txt -Recurse”的目录,否则该命令将始终不返回任何内容。

至于解决你的问题,嗯,有很多方法可以解决它。如果传递了 $filter 参数,可能更通用的方法之一是切换程序行为,而不是传递整个过滤器字符串,只需传递“deleteme.txt”字符串。

于 2010-02-09T15:43:11.543 回答