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 >