Get-ChildItem -Exclude返回Fullname而不是short name

时间:2015-03-27 16:54:13

标签: powershell powershell-v3.0

当我运行Get-ChildItem -Exclude时,我遇到了一个奇怪的问题。

我在源位置和目标位置都使用以下命令在我运行副本然后比较2个目录后创建一个文件数组。它一直工作得很好。 (我打算发布图片,但没有足够高的声誉)

$sourcefiles = @(Get-ChildItem -Recurse -path e:\Home\o365.test)

当我运行此命令时,数组会填充文件的短名称。

我从文件副本中排除了PST文件,我还需要在比较中排除它们,所以我在GCI命令中添加了一个排除。

$sourcefiles = @(Get-ChildItem -Recurse -path e:\Home\o365.test -Exclude *.pst)

这将返回所有正确的文件(* .pst实际上被排除在外),但是它返回文件的全名,而不是之前我总是返回的短名称。

这导致compare-object失败,因为目标GCI没有排除(因为* .pst从副本中排除,所以不需要)。此外,它是一个UNC路径,并且无论如何全名都不匹配。

我意识到我可以使用split-path -leaf(我已尝试过 - 似乎也有效)

$sourcefiles = @(Get-ChildItem -Recurse -path e:\Home\o365.test -Exclude *.pst | Split-Path -Leaf) 

但我仍然不明白为什么将-exclude参数添加到GCI会导致它改变它返回的格式。

有没有人知道为什么会发生这种情况?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好吧,我不能复制你在这里看到的东西。在PowerShell中的操作之前放置一个at符号实际上就是数组运算符,只需将它放在带括号的括号之前就不会像你所描述的那样返回单个属性。

现在,如果在括号背面放置属性名称以仅选择一个属性,则可以实现此目的。例如:

$files = @(Get-ChildItem -path c:\temp).BaseName
>LZelda.csv
>msvcr100.dll
>names-0.txt
>names-1.txt
>NOBGW00017.log
>nslookup.exe
>PolicySpy.exe

添加-Exclude括号根本不会改变输出。

$files = @(Get-ChildItem -path c:\temp -exclude *.png)
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        3/18/2015   2:34 PM                Android
da----        9/10/2013   7:17 PM                Bootfiles
d-----       12/13/2014   4:29 PM                camera
d-----         1/6/2015  11:49 AM                CFS
d-----       12/11/2014   1:08 PM                ebay
d-----         2/2/2014   1:55 PM                Finance

我告诉你的原因是我们得到的东西仍然是FileSystem对象。将$文件减少到仅包含一个属性的唯一方法,如FullName,BaseName或以下两种方法中的任何内容:

$files = @(Get-ChildItem -path c:\temp -exclude *.png).BaseName
$files = @(Get-ChildItem -path c:\temp -exclude *.png | Select -Expand BaseName)

两者都会提供相同的输出。