powershell 3.0 中相同命令的不同结果

Different result from same command in powershell 3.0

既然Get-ChildItem -Path *.exe会显示当前目录下的所有可执行文件,为什么Get-ChildItem -File -Include *.exereturn结果不一样?这两个命令都在同一目录中执行,第一个命令(带 -Path)returns 是一个可执行文件列表,但第二个命令(带 -File)没有。 (gci -File 将列出包括 exe 在内的所有内容)

Get-ChildItem -File | gm  #=> FileInfo
Get-ChildItem *.* | gm    #=> DirectoryInfo and FileInfo

以下所有命令 return FileInfo 类型的对象

Get-ChildItem -File
Get-ChildItem *.* -Include *.exe
Get-ChildItem -Path *.exe

但是混合 -File 和 -Include/-Exclude return 没什么,即使 -include 正在寻找文件类型:

Get-ChildItem -File -Include *.exe    #=> Returns nothing

我在这里错过了什么?

来自 TechNet:

The Include parameter is effective only when the command includes the Recurse parameter or the path leads to the contents of a directory, such as C:\Windows*, where the wildcard character specifies the contents of the C:\Windows directory.

换句话说,当您使用Include 参数时,它不会自动考虑所有文件和目录,除非您使用Path 或Recurse 参数。请注意,当仅使用 Path 参数时,您必须包含一个通配符以强制它考虑该路径下的文件和目录结果。我想不出这是为什么。

为了使您的示例正常工作,您可以使用以下之一(我删除了 File 参数,因为它看起来多余):

Get-ChildItem -Path * -Include *.exe
Get-ChildItem -Include *.exe -Recurse

我对你问题的回答的要点是一个观点——据我所知,应该删除 Include 参数——或者修复它的行为以匹配不带参数使用时 Get-ChildItem cmdlet 的默认行为.可能有一个很好的解释为什么它以这种方式工作,但我不知道这一点。

如果您从示例中删除 Include 参数,behavior/results 更有意义(对我而言):

Get-ChildItem -Path *.exe

在这种情况下,我们只需要Exclude参数就可以有效覆盖所有过滤需求。类似于:

Get-ChildItem -Path *.exe -Exclude *system*