PowerShell FileInfo输出子目录中的文件

时间:2010-05-05 01:51:46

标签: powershell

为什么这种情况下的输出不是c:\source\temp\test.txt

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

1 个答案:

答案 0 :(得分:7)

啊,这经常让人们在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大师可能会有更简洁的语法。不可否认,上述情况非常难看。