在PowerShell 3.0中使用相同命令的结果不同

时间:2015-04-03 11:38:54

标签: powershell powershell-v3.0

鉴于Get-ChildItem -Path *.exe将显示当前目录中的所有可执行文件,为什么Get-ChildItem -File -Include *.exe不返回相同的结果?两个命令都在同一目录中执行,第一个命令(带-Path)返回可执行文件列表,但第二个命令(带-File)不返回。 (gci -File将列出所有内容,包括exe)

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

所有命令都返回FileInfo类型的对象

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

但混合-File和-Include / -Exclude什么都不返回,即使-include正在查找文件类型:

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

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

来自TechNet:

  

Include参数仅在命令包含时有效   Recurse参数或路径指向目录的内容,   例如C:\ Windows *,其中通配符指定了   C:\ Windows目录的内容。

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

要使您的示例正常工作,您可以使用以下方法之一(我正在删除File参数,因为它似乎是多余的):

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

我对你的问题的回答的主旨是一个观点 - 从我看到的应该删除Include参数 - 或者修改它的行为以匹配Get-ChildItem cmdlet在没有参数的情况下的默认行为。可能有一个很好的解释为什么它以这种方式工作,但我没有意识到这一点。

如果从示例中删除Include参数,行为/结果会更有意义(对我而言):

Get-ChildItem -Path *.exe

在这种情况下,我们只需要Exclude参数来有效地覆盖所有过滤要求。类似的东西:

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