如果作为参数传递给函数,PowerShell中的'Get-ChildItem -Include/-Exclude'不会过滤

El *_*ldo 0 powershell include get-childitem

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

以下工作正常,并显示整个文件列表:

c:\temp\Get-ChildItem -Include *deleteme*.txt -Recurse
Run Code Online (Sandbox Code Playgroud)

现在说我有以下脚本

#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
Run Code Online (Sandbox Code Playgroud)

现在尝试运行脚本,

c:\temp.\GetLastFile.ps1 "-Include *deleteme*.txt -Recurse"
Run Code Online (Sandbox Code Playgroud)

没有回报.

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

Kei*_*ill 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
Run Code Online (Sandbox Code Playgroud)

@符号用于将参数中的数组或散列表"splat"为命令.$ 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
Run Code Online (Sandbox Code Playgroud)

当您针对命令splat这样的哈希表时,PowerShell会将键的(例如Recurse)值映射到命令上名为Recurse的参数.