使用Get-ChildItem和路径中的通配符的Powershell奇怪行为

时间:2015-06-03 12:11:28

标签: powershell

Windows 8.1 Enterprise

    $PSVersionTable.PSVersion
    Major  Minor  Build  Revision
    -----  -----  -----  --------
    4      0      -1     -1

这是我所看到的。我有一个文件" commands2.txt"在子目录" level2"。为简单起见,它是"测试"中的唯一文件。结构体。 完整路径c:\ users \ chris \ testing \ level2 \ commands2.txt

设置 从c:\ users \ chris \ testing作为当前目录。

    $stuff  = gci c:\users\chris\testing\ -Recurse command*.txt
    $stuff2 = gci c:\users\chris\testing\* -Recurse command*.txt

现在,

    get-item $stuff 

返回" get-item:找不到路径' C:\ Users \ chris \ testing \ commands2.txt'因为它不存在。"注意" level2"不见了。看起来它只是将.Name附加到当前路径。

但是

    get-item $stuff2 

返回完整路径文件的get项的预期结果。

奇怪吧?所以我在这里感到困惑。

    Compare-Object $stuff $stuff2

显示它们不同。

    InputObject                                                 SideIndicator
    -----------                                                 -------------
    C:\users\chris\testing\level2\commands2.txt                 =>
    commands2.txt                                               <=

可是:

    $a = $stuff | select *
    $b = $stuff2 | select *
    compare-object $a $b -includeEqual

显示它们是相同的。 我知道我可以通过放置&#34; *&#34;来解决这个问题。在路上。

但为什么变量不同,我该怎么说?

为什么InputObject不同?

有没有办法看到两个变量$ stuff和$ stuff2之间的区别?

更新:Vesper基本上钉了它。使用get-childitem和tostring搜索此处返回了有用的问题。我似乎是其他一些变种。 Mysterious different conversion to string[] of seemingly same input data显示了最新情况。此外,2010年还有一个错误报告:https://connect.microsoft.com/PowerShell/feedback/details/556004/get-childitem-gets-fileinfo-constructed-in-different-ways-depending-on-parameters 基于之前的链接。好时光。

1 个答案:

答案 0 :(得分:0)

差异非常微妙,您可以通过toString()结果区分它们。

 PS > $stuff.toString()
 commands2.txt    
 PS > $stuff2.toString()
 C:\users\chris\testing\level2\commands2.txt 

Threre是MSDN here上的一些数据,表明toString()不会始终返回文件的全名。你好像遇到了这个问题。我说这是一个错误,但有一种方法可以通过查询toString()并检查fullName来查找错误是否已触发。

 if ($stuff.toString() -ne $stuff.fullName) { Write-Host "Bug!" }