首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.IO.FileInfo与相对路径

System.IO.FileInfo与相对路径
EN

Stack Overflow用户
提问于 2021-12-07 02:01:46
回答 2查看 1K关注 0票数 4

我想知道是否有人能帮助我理解为什么System.IO.FileInfo在处理相对路径时在Windows上的行为与在Linux上的行为不同。

示例

  • On Linux

代码语言:javascript
复制
PS /home/user/Documents> ([System.IO.FileInfo]'./test.txt').FullName
/home/user/Documents/test.txt

Windows上的

代码语言:javascript
复制
PS C:\Users\User\Documents> ([System.IO.FileInfo]'.\test.txt').FullName
C:\Users\User\test.txt

编辑

为了澄清上面的问题,System.IO.FileInfo在Windows或Linux上处理相对路径的方式没有什么不同。该问题与[System.IO.Directory]::GetCurrentDirectory()未被Push-LocationSet-Location更新有关。

一个简单的例子:

代码语言:javascript
复制
PS /home/user> [System.IO.Directory]::GetCurrentDirectory()
/home/user
PS /home/user> cd ./Documents/
PS /home/user/Documents> [System.IO.Directory]::GetCurrentDirectory()
/home/user

假设这是一种预期的行为,那么在脚本和函数上处理我们的param(...)块以接受这两种情况(绝对和相对)的最佳方法是什么。我过去常常将path参数输入到System.IO.FileInfo,但现在我可以看到它显然是错误的。

这就是我遇到的,但我想知道是否有更好的方法。

我相信Split-Path -IsAbsolute也会带来问题,如果使用网络路径,请纠正我,如果我错了。

代码语言:javascript
复制
param(
    [ValidateScript({ 
        if(Test-Path $_ -PathType Leaf) {
            return $true
        }
        throw 'Invalid File Path'
    })]
    [string] $Path
)

if(-not (Split-Path $Path -IsAbsolute)) {
    [string] $Path = Resolve-Path $Path
}
EN

回答 2

Stack Overflow用户

发布于 2022-03-29 15:21:55

最简单的选择是使用Convert-Path来:

  • 处理UNC、相对路径、绝对路径和根路径。
  • 与Windows和Linux
  • Be

兼容。

如果我们使用[cmdletbinding()],另一个很好的选择是使用$PSCmdlet.GetUnresolvedProviderPathFromPSPath(..) method

代码语言:javascript
复制
function ResolvePath {
    [cmdletbinding()]
    param($path)
    $PSCmdlet.GetUnresolvedProviderPathFromPSPath($path)
}

ResolvePath \\server01\test         # => \\server01\test
ResolvePath C:\Users\user\Documents # => C:\Users\user\Documents
ResolvePath C:Documents             # => C:\Documents
(ResolvePath .) -eq $PWD.Path       # => True
(ResolvePath ~) -eq $HOME           # => True
票数 1
EN

Stack Overflow用户

发布于 2022-07-19 07:58:54

另一种选择:

由于您希望将强制转换的结果转换为[System.IO.FileInfo],所以可以使用Get-Item,这也将返回[System.IO.FileInfo]对象,但可以按照预期使用解析的相对路径。它还将包含一些错误检测(无效字符或不存在的路径等)。

示例:

代码语言:javascript
复制
PS C:\Users\User\Documents> (Get-Item -LiteralPath '.\test.txt').FullName
C:\Users\User\Documents\test.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70254096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档