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-path
2시 정각 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.-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
'programing' 카테고리의 다른 글
개체 'DF__*'이(가) '*' 열에 종속됨 - int를 이중으로 변경 (0) | 2023.04.08 |
---|---|
현재 PowerShell 스크립트의 위치를 확인하는 가장 좋은 방법은 무엇입니까? (0) | 2023.04.08 |
링크와 같은 기능을 하는HTML 버튼을 작성하려면 어떻게 해야 하나요? (0) | 2023.04.08 |
PowerShell에서 문자열이 null인지 빈지 확인하는 방법은 무엇입니까? (0) | 2023.04.08 |
중복 행을 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.08 |