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-Item
try..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
'programing' 카테고리의 다른 글
@Configuration Properties를 @Configuration으로 자동 배선하는 방법은 무엇입니까? (0) | 2023.07.24 |
---|---|
node.js, mysql, 날짜 및 시간 오프셋 (0) | 2023.07.24 |
Node.js - 현재 파일 이름 가져오기 (0) | 2023.07.24 |
wkhtmltopdf Docker 이미지 설치 및 실행 방법 (0) | 2023.07.24 |
영숫자가 아닌 모든 문자, 새 줄 및 여러 공백을 하나의 공백으로 바꾸기 (0) | 2023.07.24 |