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

3

Windows 8.1企业版

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

这是我看到的内容。在子目录“level2”中有一个名为“commands2.txt”的文件。为了简便,它是“testing”结构中唯一的文件。 完整路径为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-item预期结果。

有点奇怪,所以这就是我感到困惑的地方。

    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

显示它们是相同的。 我知道我可以通过将 "*" 放在路径中来解决这个问题。 但为什么变量不同,我该如何判断? 为什么 InputObject 不同? 有没有办法查看两个变量 $stuff 和 $stuff2 之间的差异? 更新:Vesper 基本上已经解决了这个问题。使用 get-childitem 和 tostring 在此处搜索会返回有用的问题。我的问题似乎是其他一些问题的变体。 神秘的不同转换为 string[] 的输入数据 显示了发生了什么。此外,基于先前的链接,这里还有一个来自 2010 年的错误报告:https://connect.microsoft.com/PowerShell/feedback/details/556004/get-childitem-gets-fileinfo-constructed-in-different-ways-depending-on-parameters。美好的时光。

你应该使用 get-item $stuff.FullName 或者 get-item $stuff.PSPath,而不是仅仅使用 get-item $stuff - user4003407
1
我会说那是一个 bug,因为行为不一致。 - majkinetor
@Petseral 是的,我可以做到。我还可以执行 $stuff = (gci c:\users\chris\testing\ -Recurse command*.txt).fullname 命令。问题不在于修复它,而在于“为什么会这样?”和“你如何看到两者之间的实际差异?” - Chris G
1个回答

0
差别非常微小,您可以通过它们的 toString() 结果区分它们。
 PS > $stuff.toString()
 commands2.txt    
 PS > $stuff2.toString()
 C:\users\chris\testing\level2\commands2.txt 

在 MSDN 这里 有一些数据表明 toString() 不会始终返回文件的完整名称。你似乎遇到了这个问题。我认为这是一个 bug,但有一种方法可以确定是否出现了 bug,通过查询 toString() 并检查其是否与 fullName 匹配。

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

tostring()正是我所需要的!我仍然不太满意,并且很痛苦的是,你无法轻松地公开变量的所有属性以进行比较。谢谢。 - Chris G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接