PowerShell에서 파일의 전체 경로 가져 오기


145

특정 유형에 속하는 하위 폴더에있는 파일을 포함하여 모든 파일을 가져와야합니다.

Get-ChildItem을 사용하여 이와 같은 작업을 수행하고 있습니다 .

Get-ChildItem "C:\windows\System32" -Recurse | where {$_.extension -eq ".txt"}

그러나 전체 경로가 아닌 파일 이름 만 반환합니다.

답변:


219

| select FullName위 줄 끝에 추가하십시오 . 나중에 실제로 무언가를 해야하는 경우 다음과 같이 foreach 루프에 파이프해야 할 수도 있습니다.

get-childitem "C:\windows\System32" -recurse | where {$_.extension -eq ".txt"} | % {
     Write-Host $_.FullName
}

101

늦은 필터링을 사용하는 것보다 훨씬 빠르게 수행해야합니다.

Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName }

14
사실입니다. 경고 :이 명령은 실제로 *.txt*( -FilterCMD 와일드 카드 사용) 과 같은 파일을 가져옵니다 . 이것이 원하는 것이 아닌 경우를 사용하십시오 -Include *.txt.
Roman Kuzmin

26

Select-Object를 다음 과 같이 사용할 수도 있습니다 .

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName

5
문자열이 아닌 을 Select-Object반환 PSCustomObject합니다. 다른 프로그램에 대한 매개 변수로 결과를 사용하는 경우이 작동하지 않을 수 있습니다
Chintsu

5
@Chintsu가 말한 것에 예. 대신에 문자열을 얻으려면 간단히 대신을 PSCustomObject사용하십시오 . 내가 이해하는 한 매개 변수를 사용하면 cmdlet이 결과를 일부 사용자 지정 개체 대신 지정된 속성의 기본 형식으로 반환합니다. -ExpandProperty FullNameFullName-ExpandProperty
doubleDown

나도 시간이 필요했다 (프로그램의 소스를 망 쳤고 나중에 소스 제어를 시작해야한다고 생각했지만 설치 이후 파일을 가져 와서 "마스터"에 대한 첫 번째 커밋에 대한 아이디어를 얻을 수있다.Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
닐 가이 린드버그

19

더 짧은 것이 여기 있습니다 :

(Get-ChildItem C:\MYDIRECTORY -Recurse).fullname > filename.txt

23
여기 더 짧은 것이 있습니다 :(gci -r c:\).fullname
Chris N

11
여기에 더 짧은 것이 있습니다 :(ls -r c:\).fullname
Kalamane

15
여기 더 짧은 것이 있습니다 :(ls -r c:).fullname
Valiante

9

상대 경로가 원하는 경우 -Name플래그를 사용할 수 있습니다 .

Get-ChildItem "C:\windows\System32" -Recurse -Filter *.txt -Name


5
Get-ChildItem -Recurse *.txt | Format-Table FullName

그것이 내가 사용한 것입니다. 루프 구문이 포함되어 있지 않기 때문에 더 이해하기 쉽다고 생각합니다.


5

PS 5에서 정말 성가신 것은 $ _가 foreach 내에서 전체 경로가 아닐 것입니다. FileInfo 및 DirectoryInfo 객체의 문자열 버전입니다. 어떤 이유로 경로의 와일드 카드가이를 수정하거나 Powershell 6 또는 7을 사용합니다. 중간에 항목을 가져 오기 위해 파이프 할 수도 있습니다.

Get-ChildItem -path C:\WINDOWS\System32\*.txt -Recurse | foreach { "$_" }

Get-ChildItem -path C:\WINDOWS\System32 -Recurse | get-item | foreach { "$_" }

이것은 .Net Core (Powershell 7)에서 해결 된 .Net의 문제 인 것 같습니다 : FileInfo / Directory 인스턴스의 문자열 화 동작이 v6.0.2 # 7132 이후로 변경되었습니다.


4

이것은 나를 위해 일했고 이름 목록을 생성합니다.

$Thisfile=(get-childitem -path 10* -include '*.JPG' -recurse).fullname

get-member -membertype properties엄청나게 유용한 명령 인 을 사용하여 찾았습니다 . 당신을 제공하는 대부분의 옵션은 함께 추가됩니다 .<thing>처럼 fullname여기에있다. 같은 명령을 수행 할 수 있습니다.

  | get-member -membertype properties 

명령이 끝날 때 수행 할 수있는 작업 및 액세스 방법에 대한 자세한 정보를 얻으려면 다음을 수행하십시오.

get-childitem -path 10* -include '*.JPG' -recurse | get-member -membertype properties

3

이 시도:

Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName

2
시도와 다른 점과 다른 점이 왜 효과가 없는지 약간의 정보를 추가하십시오.
Uwe Allner

2

왜 아무도 foreach 루프를 사용하지 않았습니까? 여기서 프로는 변수의 이름을 쉽게 지정할 수 있다는 것입니다.

# Note that I'm pretty explicit here. This would work as well as the line after:
# Get-ChildItem -Recurse C:\windows\System32\*.txt
$fileList = Get-ChildItem -Recurse -Path C:\windows\System32 -Include *.txt
foreach ($textfile in $fileList) {
    # This includes the filename ;)
    $filePath = $textfile.fullname
    # You can replace the next line with whatever you want to.
    Write-Output $filePath
}

fileList에서 foreach 텍스트 파일을 사용하지 않고 텍스트 파일의 개별 파일 경로를 얻는 방법은 무엇입니까? textfile = $ fileList [$ i] .fullname과 같은 것입니다. 가장 최적의 방법은 아니지만 다음과 같이해야합니다. (
Heber Solis

$앞에 textfile:을 추가 하십시오 $textfile = $fileList[$i].FullName. $i숫자 값이 있다고 가정합니다 .
NostraDavid

1
gci "C:\WINDOWS\System32" -r -include .txt | select fullname

6
제공하는 솔루션에 대한 설명을 조금 더 추가하여 답변을 더 자세히 설명해 주시겠습니까?
abarisone

1

[대체 구문]

어떤 사람들에게는 방향성 파이프 운영자는 취향이 아니라 체인을 선호합니다. roslyn issue tracker : dotnet / roslyn # 5445 에서 공유 된이 주제에 관한 흥미로운 의견을보십시오 .

사례와 상황에 따라이 방법 중 하나는 암시 적 (또는 간접)으로 간주 될 수 있습니다. 예를 들어,이 경우 열거 가능한 파이프에 파이프를 사용하면 특수 토큰 $_(일명 PowerShell's "THIS" token)이 일부에게는 불쾌한 것처럼 보일 수 있습니다.

그러한 친구들에게는 다음과 같이 점 체인을 사용 하는보다 간결하고 간단한 방법이 있습니다 .

(gci . -re -fi *.txt).FullName

(<이 호언 장담> PowerShell을의 명령 인수 파서가 부분적인 매개 변수 이름을 허용하도록 외에 주. -recursive, -recursiv, -recursi, -recurs, -recur, -recu, -rec-re수용,하지만 불행히도되지 않은 -r하나에 의미가있는 유일한 올바른 선택이다 .. -(문자 우리의 경우 POSIXy 유닉스 관례에 따라 이동하십시오!) </ rant>)


1
맹세에주의 : -r짧은 형태의 -Recurse작품은 나에게 잘 작동합니다.
Polymorphix

@Polymorphix, 맞습니다 .Windows 10에서 나를 위해 일하고 있습니다 (이전에 시도한 버전이 확실하지 않음). 그러나 샘플의 -File스위치 -fi에서도 마찬가지 -fil이며 -file작동하지만 작동하지 않습니다 -f. POSIX 스타일로 가면 --file(다중 문자) 및 -f(단일 문자, -f가 다른 것을 위해 예약 되지 않은 한 단일 문자 옵션이 아닌 경우 단일 문자 옵션 force이어야 함)이어야합니다 -l.
vulcan raven

1

아래 스크립트를 사용하여 모든 폴더 경로를 명시하고 있습니다.

Get-ChildItem -path "C:\" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object FullName | Out-File "Folder_List.csv"

전체 폴더 경로가 오지 않습니다. 113 자 이후 :

Example - C:\ProgramData\Microsoft\Windows\DeviceMetadataCache\dmrccache\en-US\ec4d5fdd-aa12-400f-83e2-7b0ea6023eb7\Windows...

0

이 줄 명령을 사용하여 "C : \ Temp"의 ".xlm"파일을 검색하고 "result.txt"파일의 결과 전체 경로를 인쇄했습니다.

(Get-ChildItem "C:\Temp" -Recurse | where {$_.extension -eq ".xml"} ).fullname > result.txt 

내 테스트 에서이 구문은 나에게 아름답게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.