Таинственное различное преобразование в строку [], казалось бы, одинаковых входных данных - PullRequest
3 голосов
/ 30 апреля 2010

Во время исследования какой-то проблемы я обнаружил, что причиной было неожиданное другое преобразование в строку [], казалось бы, одинаковых входных данных. А именно, в приведенном ниже коде две команды возвращают одинаковые два элемента File1.txt и File2.txt. Но преобразование в строку [] дает разные результаты, см. Комментарии.

Есть идеи, почему? Это может быть ошибкой. Если кто-то тоже так думает, я его отправлю. Но было бы неплохо понять, что происходит, и избегать подобных ловушек.

# *** WARNING
# *** Make sure you do not have anything in C:\TEMP\Test
# *** The code creates C:\TEMP\Test with File1.txt, File2.txt

# Make C:\TEMP\Test and two test files
$null = mkdir C:\TEMP\Test -Force
1 | Set-Content C:\TEMP\Test\File1.txt
1 | Set-Content C:\TEMP\Test\File2.txt

# This gets just file names
[string[]](Get-ChildItem C:\TEMP\Test)

# This gets full file paths
[string[]](Get-ChildItem C:\TEMP\Test -Include *)

# Output:
# File1.txt
# File2.txt
# C:\TEMP\Test\File1.txt
# C:\TEMP\Test\File2.txt

1 Ответ

8 голосов
/ 30 апреля 2010

Ну, у меня есть кое-какие подсказки (вероятно, публикация вопроса стимулировала мои мысли). Да, это своего рода ловушка не только в 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 использует полные пути. Это ошибка? Это выглядит спорным сейчас. Это может быть особенность, сомнительная, но все же с некоторыми основными причинами. Я сомневаюсь, хотя ...

...