是否有一个PowerShell cmdlet等效于[System.IO.Path] :: GetFullPath($ fileName);当$ fileName不存在?

时间:2011-08-23 23:05:29

标签: powershell cmdlets

如果$ fileName存在,则等效于[System.IO.Path]::GetFullPath($fileName);的cmdlet为(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>

3 个答案:

答案 0 :(得分:8)

Join-Path将是我相信不存在项目的路径。像这样:

join-path $pwd $filename

更新

我不明白为什么你不想使用.Net“代码”。 Powershell基于.Net。所有cmdlet都是.Net代码。只有正当理由才能避免使用。当您使用.Net Code时,当前目录是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: resolve path that might not exist?

答案 1 :(得分: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} 
  }
}

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

答案 2 :(得分:-1)

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

PS > Join-Path $pwd (Split-Path 'c:\config.sys' -NoQualifier)    
C:\Users\zippy\Documents\deleteme\config.sys