programing

Powershell: 존재하지 않을 수 있는 경로를 확인하시겠습니까?

css3 2023. 7. 24. 22:43

Powershell: 존재하지 않을 수 있는 경로를 확인하시겠습니까?

최신 상태이거나 최신 상태가 아닐 수도 있고 존재하지 않거나 존재하지 않을 수 있는 파일 목록을 처리하려고 합니다.그러면 항목이 상대 경로로 지정되어 있더라도 항목의 전체 경로를 확인해야 합니다. 하만지,Resolve-Path중요하지 않은 파일과 함께 사용하면 오류가 인쇄됩니다.

를 들어, Powershell에서 해결할 수 있는 가장 간단하고 깨끗한 방법은 무엇입니까?

:System.IO.Path의 정적 메서드는 프로세스의 작업 디렉터리와 함께 사용됩니다. 이 디렉터리는 powershell 현재 위치가 아닙니다.

원하는 항목:

c:\path\exists\> $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(".\nonexist\foo.txt")

반환:

c:\path\exists\nonexists\foo.txt

따라서 기본 파일 시스템 경로가 아닌 PSP 경로로 작업할 수 있습니다.PSP 경로는 파일 시스템 경로에 1-1을 매핑하지 못할 수 있습니다. 예를 들어 다중 문자 드라이브 이름으로 apsdrive를 마운트하는 경우입니다.

pspath가 뭐죠?

ps c:\> new-psdrive temp filesystem c:\temp
...
ps c:\> cd temp:
ps temp:\> 

temp:\는 드라이브 인증 pspath로, c:\cisco의 win32(네이티브) 경로에 매핑됩니다.

-오이신

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
}

당신이 옳은 길을 가고 있다고 생각합니다.[환경]만 사용하면 됩니다.: 설정할 CurrentDirectory.프로세스의 현재 방향에 대한 NET의 개념:

[Environment]::CurrentDirectory = $pwd
[IO.Path]::GetFullPath(".\xyz")
Join-Path (Resolve-Path .) newdir\newfile.txt

이렇게 하면 CLR 환경의 현재 디렉터리를 설정할 필요가 없습니다.

[IO.Path]::Combine($pwd,"non\existing\path")

메모

이것은 x0n의 답변과 기능적으로 동일하지 않습니다.System.IO.Path.Combine문자열 경로 세그먼트만 결합합니다.주요 유틸리티는 개발자가 슬래시에 대해 걱정할 필요가 없도록 하는 것입니다.GetUnresolvedProviderPathFromPSPath는 에따현작디에상입경통대인과력다합니로를적리에 현재 합니다..의 모래..

저는 다음이 충분히 효과가 있다는 것을 알았습니다.

$workingDirectory = Convert-Path (Resolve-Path -path ".")
$newFile = "newDir\newFile.txt"
Do-Something-With "$workingDirectory\$newFile"

Convert-Path를 사용하여 경로를 문자열로 가져올 수 있지만 항상 그렇지는 않습니다.자세한 내용은 CONvert-Path의 이 항목을 참조하십시오.

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

저는 제 경우에 이 코드를 갖게 되었습니다.스크립트 후반부에 파일을 만들어야 했기 때문에 이 코드는 대상 폴더에 대한 쓰기 액세스 권한이 있다고 가정합니다.

$File = ".\newdir\newfile.txt"
If (Test-Path $File) {
    $Resolved = (Resolve-Path $File).Path
} else {
    New-Item $File -ItemType File | Out-Null
    $Resolved = (Resolve-Path $File).Path
    Remove-Item $File
}

는 또한 또한동다니합봉다를 동봉했습니다.New-Itemtry..catch차단합니다. 하지만 그건 이 질문에서 벗어납니다.

생성할 새 폴더의 이름을 결정하기 위해 아직 존재하지 않는 폴더에서 3단계 이상의 폴더를 찾아야 하는 유사한 문제가 있었습니다.복잡해요.어쨌든, 이것이 제가 하게 된 것입니다.

($path -split "\\" | select -SkipLast 3) -join "\\"

여기에 허용된 답변이 있지만, 상당히 길고 더 간단한 대안이 있습니다.

Powershell의 최신 버전에서는 다음을 사용할 수 있습니다.Test-Path -IsValid -Path 'C:\Probably Fake\Path.txt'

이렇게 하면 경로에 잘못된 문자가 없는지, 경로를 사용하여 파일을 저장할 수 있는지 확인할 수 있습니다.목표물이 존재하지 않는다면,Test-Path이 경우에는 상관 없습니다. 제공된 경로가 잠재적으로 유효한지 여부만 테스트하도록 요청됩니다.

가장 일반적인 두 가지 답변 모두 기존 드라이브가 아닌 경로에서 올바르게 작동하지 않습니다.

function NormalizePath($filename)
{
    $filename += '\'
    $filename = $filename -replace '\\(\.?\\)+','\'
    while ($filename -match '\\([^\\.]|\.[^\\.]|\.\.[^\\])[^\\]*\\\.\.\\') {
        $filename = $filename -replace '\\([^\\.]|\.[^\\.]|\.\.[^\\])[^\\]*\\\.\.\\','\'
    }
    return $filename.TrimEnd('\')
}

-errorAction을 "SilentContinue"로 설정하고 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 >

확인하기 전에 파일이 있는지 확인합니다.

if(Test-Path .\newdir\newfile.txt) { (Resolve-Path .\newdir\newfile.txt).Path }

언급URL : https://stackoverflow.com/questions/3038337/powershell-resolve-path-that-might-not-exist