Powershell: разрешить путь, который может не существовать?
Я пытаюсь обработать список файлов, которые могут быть или не быть актуальными и могут или не могут существовать. При этом мне нужно разрешить полный путь элемента, хотя элемент может быть указан с относительными путями. Тем не менее, Resolve-Path
печать и ошибка при использовании с несуществующим файлом.
Например, Самый простой и самый чистый способ разрешить ".\newdir\newfile.txt"
до "C:\Current\Working\Directory\newdir\newfile.txt"
в Powershell?
Обратите внимание, что статический метод System.IO.Path
используется с рабочим каталогом процесса - это не текущее местоположение powershell.
Ответы
Ответ 1
Вы хотите:
c:\path\exists\> $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(".\nonexist\foo.txt")
возвращает:
c:\path\exists\nonexists\foo.txt
Это имеет то преимущество, что работает с PSPaths, а не с собственными файловыми путями. PSPAth не может отображать 1-1 в путь файловой системы, например, если вы устанавливаете psdrive с именем с несколькими буквами.
-Oisin
Ответ 2
Когда Resolve-Path
выходит из строя из-за отсутствия файла, полностью разрешенный путь доступен из созданного объекта ошибки.
Для исправления Resolve-Path
вы можете использовать функцию, подобную приведенной ниже, и заставить ее работать так, как вы ожидаете.
function Force-Resolve-Path {
<#
.SYNOPSIS
Calls Resolve-Path but works for files that don't exist.
.REMARKS
From http://devhawk.net/blog/2010/1/22/fixing-powershells-busted-resolve-path-cmdlet
#>
param (
[string] $FileName
)
$FileName = Resolve-Path $FileName -ErrorAction SilentlyContinue `
-ErrorVariable _frperror
if (-not($FileName)) {
$FileName = $_frperror[0].TargetObject
}
return $FileName
}
Ответ 3
Я думаю, что ты на правильном пути. Просто используйте [Environment]:: CurrentDirectory, чтобы установить представление .NET для текущего текущего каталога:
[Environment]::CurrentDirectory = $pwd
[IO.Path]::GetFullPath(".\xyz")
Ответ 4
Это имеет то преимущество, что не нужно устанавливать текущий каталог среды среды CLR:
[IO.Path]::Combine($pwd,"non\existing\path")
Примечание
Это не функционально эквивалентно x0n answer. System.IO.Path.Combine
объединяет только сегменты цепочки. Его основная утилита не позволяет разработчику беспокоиться о косе. GetUnresolvedProviderPathFromPSPath
будет пересекать входной путь относительно текущего рабочего каталога в соответствии с .
и ..
.
Ответ 5
Я обнаружил, что следующее работает достаточно хорошо.
$workingDirectory = Convert-Path (Resolve-Path -path ".")
$newFile = "newDir\newFile.txt"
Do-Something-With "$workingDirectory\$newFile"
Convert-Path может использоваться для получения пути как строки, хотя это не всегда так. Подробнее см. эту запись на COnvert-Path.
Ответ 6
Join-Path (Resolve-Path .) newdir\newfile.txt
Ответ 7
Проверьте, существует ли файл до разрешения:
if(Test-Path .\newdir\newfile.txt) { (Resolve-Path .\newdir\newfile.txt).Path }
Ответ 8
function Get-FullName()
{
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeline = $True)] [object[]] $Path
)
Begin{
$Path = @($Path);
}
Process{
foreach($p in $Path)
{
if($p -eq $null -or $p -match '^\s*$'){$p = [IO.Path]::GetFullPath(".");}
elseif($p -is [System.IO.FileInfo]){$p = $p.FullName;}
else{$p = [IO.Path]::GetFullPath($p);}
$p;
}
}
}
Ответ 9
Здесь есть принятый ответ, но он довольно длинный и есть более простая альтернатива.
В любой новой версии Powershell вы можете использовать Test-Path -IsValid -Path 'C:\Probably Fake\Path.txt'
Это просто проверяет, что в пути нет незаконных символов и что путь может использоваться для хранения файла. Если цель не существует, Test-Path
в этом случае будет неактуально - ее попросят проверить, действительно ли предоставленный путь потенциально действителен.
Ответ 10
Вы можете просто установить -errorAction в "SilentlyContinue" и использовать Resolve-Path
5 > (Resolve-Path .\AllFilerData.xml -ea 0).Path
C:\Users\Andy.Schneider\Documents\WindowsPowerShell\Scripts\AllFilerData.xml
6 > (Resolve-Path .\DoesNotExist -ea 0).Path
7 >