为什么这种情况下的输出不是c:\source\temp\test.txt?
PS C:\source\temp> (New-Object IO.FileInfo .\test.txt).FullName
c:\source\test.txt
Run Code Online (Sandbox Code Playgroud)
啊,这经常让人们在PowerShell中绊倒.虽然PowerShell具有当前目录的概念,但这与进程的当前目录不同.原因是,Windows进程只能有一个当前目录,而PowerShell进程可能有多个运行空间/管道,每个运行空间/管道都有自己的当前目录,而PowerShell当前目录甚至可能不是文件位置.
采用相对路径的.NET方法将根据进程的当前目录进行解析.所以为了安全起见,每当调用.NET方法时,都应该使用完全解析的路径.你可以这样做:
PS> (New-Object IO.FileInfo "$PWD\test.txt").FullName
Run Code Online (Sandbox Code Playgroud)
$ PWD在字符串内扩展(因为双引号),它是一个自动变量,总是返回当前工作目录.它实际上返回一个PathInfo对象,因为它嵌入的字符串可能并不总是绝对的物理路径.如果您使用PSDrives(例如,我有一个temp:\ drive映射到我的临时目录),您需要更明确.
PS> (New-Object IO.FileInfo "$($PWD.ProviderPath)\test.txt").FullName
Run Code Online (Sandbox Code Playgroud)
PowerShell大师可能会有更简洁的语法.不可否认,上述情况非常难看.
| 归档时间: |
|
| 查看次数: |
1155 次 |
| 最近记录: |