Существует ли командлет powershell, эквивалентный [System.IO.Path] :: GetFullPath ($ fileName); когда $ fileName не существует? - PullRequest
4 голосов
/ 24 августа 2011

Если $ fileName существует, эквивалент командлета [System.IO.Path]::GetFullPath($fileName); равен (Get-Item $fileName).FullName. Тем не менее, исключение выдается, если путь не существует. Мне не хватает их другого командлета?

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 ]

8 голосов
/ 24 августа 2011

Join-Path было бы способом найти путь к несуществующему элементу, я полагаю.Примерно так:

join-path $pwd $filename

Обновление:

Я не понимаю, почему вы не хотите использовать .Net "код".Powershell основан на .Net.Все командлеты имеют код .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: определить путь, который может не существовать?

1 голос
/ 24 августа 2011

Вы можете использовать командлет Test-Path, чтобы проверить его существование перед тем, как получить полное имя.

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

EDIT:

Только что видел ваш комментарий выше о том, что Test-Path является эквивалентом функции [system.io.file] :: exist (), и я думаю, что теперь я понимаю ваш вопрос лучше.

Нет, я вижу ответ, но вы могли бы сделать свой собственный.

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

Вы можете привести в порядок некоторые параметры, приняв параметры конвейера, как строки, так и свойства, но они служат цели.

0 голосов
/ 24 августа 2011

Вы можете удалить квалификатор диска «c: \ config.sys» (используя Split-Path) и затем объединить два пути:

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