Существует ли эквивалент командлета PowerShell для [System.IO.Path] :: GetFullPath ($ fileName); когда $ fileName не существует?

Если $ fileName существует, то эквивалент командлета _1 _ - это (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>

person Justin Dearing    schedule 23.08.2011    source источник


Ответы (3)


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: разрешить путь, который может не существовать?

person manojlds    schedule 24.08.2011
comment
Join-Path создает свою собственную проблему, она разваливается, когда переданный параметр является абсолютным путем. Если сочетание этого и других командлетов устранит проблему, это будет сложнее, чем включение кода .net. - person Justin Dearing; 24.08.2011
comment
@Justin Dearing - снова обновил мой ответ. - person manojlds; 24.08.2011
comment
Я ничего не имею против вызова методов .NET. Я просто хотел знать, был ли их эквивалент командлета, так же как Test-Path эквивалентен [System.IO.File] :: Exists (). script, который вызвал этот вопрос, фактически делает два вызовы PInvoke, поэтому я ничего не имею против вызова .NET или неуправляемых функций в PowerShell. - person Justin Dearing; 24.08.2011
comment
Также существует [System.IO.Path] :: Combine ($ pwd, $ yourIncompletePath). - person OldFart; 24.08.2011
comment
Split-Path d: folder -IsAbsolute дает $ True, но разрешенный путь выше зависит от текущего каталога на диске d: я бы рискнул предположить, что этот путь является «относительным». По крайней мере, это не полная спецификация пути, поэтому Split-Path -IsAbsolute не работает правильно с целью исключения только абсолютных и полных / полных путей из вышеупомянутой обработки. - person jdw; 11.04.2014
comment
После дальнейшего тестирования: «Уродливый» метод Get-item работает с этим ‹диском:› + ‹относительный путь без точек› (например, x: myfolder вместо x: \ myfolder), тогда как Split-Path -ИсАбсолютного метода нет. - person jdw; 11.04.2014
comment
GetFullPath () разрешит путь, альтернативой будет Join-Path $pwd "..\otherfolder" -Resolve, но это не удастся, если папка не существует. Без -Resolve, Join-Path просто объединяет две строки, добавляя / удаляя \ по мере необходимости - person papo; 07.08.2018

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

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} 
  }
}

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

person Matt    schedule 24.08.2011
comment
Если $fileName не содержит весь путь, возможно, вам придется протестировать и полный путь: $filepath = (Get-Item $fileName).FullName; if (Test-Path $filepath) { #do something with $filepath } - person Torbjörn Bergstedt; 24.08.2011
comment
@tbergstedt этого не должно быть, поскольку либо $ filename является относительным именем файла, и в этом случае Test-Path будет работать, либо он снова является абсолютным, это сработает. Другого выхода не вижу ... - person Matt; 24.08.2011

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

PS > Join-Path $pwd (Split-Path 'c:\config.sys' -NoQualifier)    
C:\Users\zippy\Documents\deleteme\config.sys
person Shay Levy    schedule 24.08.2011
comment
-1 - Это не хочет ОП. Если вы дадите c:\config.sys вывод должен быть самим собой. Если вы даете .\config.sys, выход должен быть C:\Users\zippy\Documents\deleteme\config.sys, если вы даете ..\notexisting.txt, выход должен быть C:\Users\zippy\Documents\notexisting.txt и так далее. И даже для того, что вы показываете -Leaf, это лучший вариант, чем -NoQualifier. - person manojlds; 24.08.2011