programing

Join-Path를 사용하여 3개 이상의 문자열을 하나의 파일 경로에 결합하려면 어떻게 해야 합니까?

padding 2023. 4. 8. 08:01
반응형

Join-Path를 사용하여 3개 이상의 문자열을 하나의 파일 경로에 결합하려면 어떻게 해야 합니까?

파일 경로에 두 문자열을 결합하려면 다음과 같이 사용합니다.

$path = Join-Path C: "Program Files"
Write-Host $path

은 that prints that"C:\Program Files" 이의 문자열에 할 경우

$path = Join-Path C: "Program Files" "Microsoft Office"
Write-Host $path

PowerShell에서 다음 오류가 발생합니다.

Join-Path : 'Microsoft Office' 입니다.
1 D:\users\my_script.ps1:1 문자:18
$= " Files" " Office" + $path = join-path << C: "Program Files" "Microsoft Office"
+ "Info : : ( ) [ - Path ], ParameterBindingException ] : [ InvalidArgument : ( : ) [ Join - Path ], ParameterBindingException
Qualified Error Id : Parameter Not Found,. + Fully Qualified Error Id : Positional Parameter Not Found, Microsoft .PowerShell
" Path Command Join 경로"

문자열 배열을 사용해 보았습니다.

[string[]] $pieces = "C:", "Program Files", "Microsoft Office"
$path = Join-Path $pieces
Write-Host $path

, 은 ('PowerShell'을 때문에) 됩니다.-childpath "somepath" 등 경로를 .

C:\somepath
Program Files\somepath
Microsoft Office\somepath

그것도 옳지 않아요

를 사용할 수 있습니다.NET 경로 클래스:

[IO.Path]::Combine('C:\', 'Foo', 'Bar')

Join-Path는 경로 값을 파이핑할 수 있으므로 여러 Join-Path 문을 함께 파이핑할 수 있습니다.

Join-Path "C:" -ChildPath "Windows" | Join-Path -ChildPath "system32" | Join-Path -ChildPath "drivers"

아마 여러분이 원하는 만큼 간결하지는 않지만, 완전한 PowerShell로 비교적 읽기 쉽습니다.

PowerShell 6.0 이후 Join-Path에는 다음과 같은 새로운 파라미터가 있습니다.-AdditionalChildPath패스 내의 여러 부분을 즉시 조합할 수 있습니다.추가 매개 변수를 제공하거나 요소 목록을 제공하기만 하면 됩니다.

문서의 예:

Join-Path a b c d e f g
a\b\c\d\e\f\g

PowerShell 6.0 이상에서는 직관적으로 추측할 수 있습니다.

$path = Join-Path C: "Program Files" "Microsoft Office"

예상대로 동작합니다!

Join-Path는 당신이 찾고 있는 것이 아닙니다.여러 가지 용도가 있지만 찾으시는 용도가 아닙니다.Join-Path를 사용파티의 예:

Join-Path C:\hello,d:\goodbye,e:\hola,f:\adios world
C:\hello\world
d:\goodbye\world
e:\hola\world
f:\adios\world

문자열 배열을 받아 자녀 문자열을 각각 전체 경로를 만듭니다.예에서는 " " 입니다.$path = join-path C: "Program Files" "Microsoft Office"와 3개의 위치 인수를 하고 있습니다.join-path2시 정각 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.-join그리고 나는 이것이 오해라는 것을 알 수 있었다.대신 예를 들어 다음과 같은 사항을 고려하십시오.

"C:","Program Files","Microsoft Office" -join "\"

-Join한다.\한 줄로 묶다.

C:\Program Files\Microsoft Office

인양에 대한 작은 시도

네, 이 답변이 더 낫다는 에는 동의하지만, 제 답변은 여전히 유효할 수 있습니다.댓글에 따르면 슬래시에 문제가 있을 수 있으므로 제 연결 방식을 계속 유지하기 위해 이 작업도 수행할 수 있습니다.

"C:","\\Program Files\","Microsoft Office\" -join "\" -replace "(?!^\\)\\{2,}","\"

따라서 추가 슬래시에 문제가 있는 경우 문자열의 선두에 없는 한 처리할 수 있습니다(UNC 경로 허용). [io.path]::combine('c:\', 'foo', '\bar\')기대했던 대로 되지 않을 것이고, 내 것이 그것을 설명해 줄 것이다.모든 시나리오를 고려할 수는 없기 때문에 둘 다 적절한 입력 문자열이 필요합니다.두 가지 방법을 모두 고려해보세요. 하지만, 네, 더 높은 평가를 받은 다른 답은 더 간결하고, 저는 그것이 존재하는지조차 몰랐습니다.

또, 지적하고 싶은 것은, 핵심 문제에 대처하기 위한 제안을 제공하는 것 외에, OP가 한 일이 어떻게 잘못되었는지를 설명하는 것입니다.

를 사용하고 있는 는, 「 」를 참조해 주세요.2.0,그 후 © NET 2.0[IO.Path]::Combine 갖지 못하다params string[]두 개 이상의 파트를 결합해야 하는 오버로드에 "Cannot find overload for "Combine" 오류와 인수 개수: "3"이 표시됩니다.

약간 덜 우아하지만 순수한 PowerShell 솔루션은 수동으로 경로 부품을 집약하는 것입니다.

Join-Path C: (Join-Path  "Program Files" "Microsoft Office")

또는

Join-Path  (Join-Path  C: "Program Files") "Microsoft Office"

여기에는 임의의 수의 구성 요소를 경로에 결합하기 위해 순수 PowerShell 함수를 작성하는 두 가지 방법이 더 있습니다.

이 첫 번째 함수는 단일 배열을 사용하여 모든 컴포넌트를 저장하고 다음으로 포어치 루프를 사용하여 컴포넌트를 결합합니다.

function Join-Paths {
    Param(
        [Parameter(mandatory)]
        [String[]]
        $Paths
    )
    $output = $Paths[0]
    foreach($path in $Paths[1..$Paths.Count]) {
        $output = Join-Path $output -ChildPath $path
    }
    $output
}

경로 구성 요소는 배열의 요소이며 단일 인수의 모든 부분이므로 쉼표로 구분해야 합니다.사용 방법은 다음과 같습니다.

PS C:\> 참여 경로 'C:', '프로그램 파일', 'Microsoft Office'C:\Program Files\Microsoft Office


를 쓰는 은 기본 기능을 사용하는 입니다.$args마이크 페어 포어치

function Join-Paths2 {
    $path = $args[0]
    $args[1..$args.Count] | %{ $path = Join-Path $path $_ }
    $path
}

이전 버전의 함수와 달리 각 경로 구성요소는 별도의 인수이므로 인수를 구분하기 위해 공백만 필요합니다.

PS C:\> Join-Paths 2 'C:' '프로그램 파일' 'Microsoft Office'C:\Program Files\Microsoft Office

ChildPath에 문자열 배열을 사용할 때 원하는 작업을 수행할 수 있습니다.

$path = "C:"
@( "Program Files", "Microsoft Office" ) | %{ $path = Join-Path $path $_ }
Write-Host $path

어떤 출력

C:\Program Files\Microsoft Office

유일하게 주의할 점은 $path의 초기값에는 값이 있어야 한다는 것입니다(null 또는 공백일 수 없습니다).

다음 접근법은 파이프 Join-Path 문보다 더 간결합니다.

$p = "a"; "b", "c", "d" | ForEach-Object -Process { $p = Join-Path $p $_ }

$p는 연결된 경로 "a\b\c\d"를 유지합니다.

(Mike Fair와 완전히 동일한 접근 방식이라는 것을 방금 알았습니다. 죄송합니다.)

다음과 같이 사용할 수 있습니다.

$root = 'C:'
$folder1 = 'Program Files (x86)'
$folder2 = 'Microsoft.NET'

if (-Not(Test-Path $(Join-Path $root -ChildPath $folder1 | Join-Path -ChildPath $folder2)))
{
   "Folder does not exist"
}
else 
{
   "Folder exist"
}

또는 직접 함수를 작성할 수도 있습니다(결국 그렇게 되었습니다).

function Join-Path-Recursively($PathParts) {
    $NumberOfPathParts = $PathParts.Length;

    if ($NumberOfPathParts -eq 0) {
        return $null
    } elseif ($NumberOfPathParts -eq 1) {
        return $PathParts[0]
    } else {
        return Join-Path -Path $PathParts[0] -ChildPath $(Join-Path-Recursively -PathParts $PathParts[1..($NumberOfPathParts-1)])
    }
}

그러면 함수를 다음과 같이 호출할 수 있습니다.

Join-Path-Recursively -PathParts  @("C:", "Program Files", "Microsoft Office")
Join-Path-Recursively  @("C:", "Program Files", "Microsoft Office")

이것은, 에 의존하지 않고, 통상의 Join-Path 기능과 완전하게 같은 동작을 할 수 있는 장점이 있습니다.NET 프레임워크

언급URL : https://stackoverflow.com/questions/25880122/how-do-i-use-join-path-to-combine-more-than-two-strings-into-a-file-path

반응형