5

如果 $fileName 存在,则 cmdlet 等效于[System.IO.Path]::GetFullPath($fileName);is (Get-Item $fileName).FullName。但是,如果路径不存在,则会引发异常。他们是我缺少的另一个 cmdlet 吗?

Join-Path是不可接受的,因为它在传递绝对路径时不起作用:

C:\Users\zippy\Documents\deleteme> join-path $pwd 'c:\config.sys'
C:\Users\zippy\Documents\deleteme\c:\config.sys
C:\Users\zippy\Documents\deleteme>
4

3 回答 3

8

Join-Path我相信这是为不存在的项目找到路径的方法。像这样的东西:

join-path $pwd $filename

更新:

我不明白你为什么不想使用.Net“代码”。Powershell 基于.Net。所有 cmdlet 都是 .Net 代码。避免它的唯一正当理由是,当您使用 .Net 代码时,当前目录是启动 Powershell 的目录,而不是$pwd

我只是列出了我认为可以做到这一点的方式,以便您可以处理绝对路径和相关路径。他们似乎没有一个比GetFullPath()一个更简单:

$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($filename)

如果您担心是否通过绝对路径,您可以执行以下操作:

if(Split-Path $filename -IsAbsolute){
    $filename
}
else{
    join-path $pwd $filename  # or join-path $pwd (Split-Path -Leaf $filename)
}

这是最丑的

 $item = Get-Item $filename -ea silentlycontinue
 if (!$item) {
 $error[0].targetobject
 } else{
 $item.fullname
 }

类似的问题,类似的答案:Powershell:解决可能不存在的路径?

于 2011-08-24T00:15:34.823 回答
1

在获取全名之前,您可以使用 Test-Path cmdlet 检查它是否存在。

if (Test-Path $filename) {(Get-Item $fileName).FullName}

编辑:

刚刚看到您上面关于 Test-Path 等同于 [system.io.file]::exists() 函数的评论,我相信我现在更好地理解了您的问题。

在我看来,答案是不,但你可以自己做。

function Get-Fullname {
  param($filename)
  process{
      if (Test-Path $filename) {(Get-Item $fileName).FullName} 
  }
}

您可以通过使参数接受管道(字符串和属性)来整理它,但它可以达到目的。

于 2011-08-24T06:09:34.700 回答
-1

您可以删除 'c:\config.sys' 的驱动器限定符(使用拆分路径),然后加入两个路​​径:

PS > Join-Path $pwd (Split-Path 'c:\config.sys' -NoQualifier)    
C:\Users\zippy\Documents\deleteme\config.sys
于 2011-08-24T08:07:28.020 回答