PowerShell FileInfo выводит файл в дочерний каталог - PullRequest
5 голосов
/ 05 мая 2010

Почему выход в этом случае не c:\source\temp\test.txt?

PS C:\source\temp> (New-Object IO.FileInfo .\test.txt).FullName
c:\source\test.txt

1 Ответ

7 голосов
/ 05 мая 2010

Ааа, это часто запутывает людей в PowerShell. Хотя PowerShell имеет представление о текущем каталоге, это не то же самое, что текущий каталог процесса. Причина в том, что процесс Windows может иметь только один текущий каталог, в то время как процесс PowerShell может иметь несколько пространств выполнения / конвейеров, каждый со своим собственным текущим каталогом, а текущий каталог PowerShell может даже не быть местоположением файла.

.NET-методы, которые принимают относительные пути, будут разрешены для текущего каталога процесса. Поэтому для безопасности при вызове методов .NET следует использовать полностью разрешенные пути. Вы могли бы сделать:

PS> (New-Object IO.FileInfo "$PWD\test.txt").FullName

$ PWD раскрывается внутри строки (из-за двойных кавычек) и является автоматической переменной, которая всегда возвращает текущий рабочий каталог. На самом деле он возвращает объект PathInfo, поскольку встраиваемая строка не всегда может быть абсолютным физическим путем. Если вы используете PSDrives (например, у меня есть temp: \ drive, сопоставленный с моим временным каталогом), вам нужно быть более явным.

PS> (New-Object IO.FileInfo "$($PWD.ProviderPath)\test.txt").FullName

Гуру PowerShell может иметь более лаконичный синтаксис. Вышесказанное довольно уродливо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...