如果$ 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>
答案 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
}
答案 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