Ну, у меня есть кое-какие подсказки (вероятно, публикация вопроса стимулировала мои мысли). Да, это своего рода ловушка не только в PowerShell (но PowerShell делает это возможным).
Очевидно, PowerShell просто использует ToString()
для преобразования. И это было неверное предположение, что System.IO.FileInfo.ToString()
возвращает FullName
. Отражатель показывает, что он возвращает base.OriginalPath
, то есть именно то, что было передано в конструкторе, а не полный путь.
Вот демо:
Set-Location C:\TEMP\Test
[string](New-Object IO.FileInfo File1.txt)
[string](New-Object IO.FileInfo C:\TEMP\Test\File1.txt)
[string](New-Object IO.FileInfo ./..//Test///..Test\File1.txt)
# Output:
# File1.txt
# C:\TEMP\Test\File1.txt
# ./..//Test///..Test\File1.txt
Таким образом, похоже, что первый Get-ChildItem
использует только имена при создании FileInfo
объектов, а второй Get-ChildItem
с параметром –Include
использует полные пути. Это ошибка? Это выглядит спорным сейчас. Это может быть особенность, сомнительная, но все же с некоторыми основными причинами. Я сомневаюсь, хотя ...