Выходной файл PowerShell FileInfo в дочернем каталоге

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

PS C:\source\temp> (New-Object IO.FileInfo .\test.txt).FullName
c:\source\test.txt
5
задан Eric Schoonover 5 May 2010 в 01:51
поделиться

1 ответ

Ах, это часто сбивает людей с толку в 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 может иметь более сжатый синтаксис. Вышеупомянутое, по общему признанию, довольно уродливо.

7
ответ дан 14 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: