Почему вывод в этом случае нет c:\source\temp\test.txt
?
PS C:\source\temp> (New-Object IO.FileInfo .\test.txt).FullName
c:\source\test.txt
Ах, это часто сбивает людей с толку в PowerShell. Хотя в PowerShell есть понятие текущего каталога, это не то же самое, что текущий каталог для процесса. Причина в том, что процесс Windows может иметь только один текущий каталог, тогда как процесс PowerShell может иметь несколько пространств выполнения / конвейеров, каждый со своим собственным текущим каталогом, а текущий каталог PowerShell может даже не быть местоположением файла.
Методы .NET, использующие относительные пути, будут разрешены относительно текущего каталога процесса. Поэтому, чтобы быть в безопасности, при вызове методов .NET вы должны использовать полностью разрешенные пути. Вы можете сделать:
PS> (New-Object IO.FileInfo "$PWD\test.txt").FullName
$ PWD раскрывается внутри строки (из-за двойных кавычек) и является автоматической переменной, которая всегда возвращает текущий рабочий каталог. Фактически он возвращает объект PathInfo, потому что встроенная строка не всегда может быть абсолютным физическим путем. Если вы используете PSDrives (например, у меня есть диск temp: \, сопоставленный с моим временным каталогом), вам нужно будет более явным.
PS> (New-Object IO.FileInfo "$($PWD.ProviderPath)\test.txt").FullName
Гуру PowerShell может иметь более сжатый синтаксис. Вышеупомянутое, по общему признанию, довольно уродливо.