상대 경로를 사용하여 폴더 및 하위 폴더 콘텐츠를 CSV로 검색합니다.

상대 경로를 사용하여 폴더 및 하위 폴더 콘텐츠를 CSV로 검색합니다.

CSV 파일에서 폴더와 하위 폴더(파일만)의 내용을 가져오는 방법을 찾았습니다.

dir -recurse | Where-Object { !$_.PSIsContainer } | Select FullName |
convertto-csv | out-file "test.csv"

그러나 전체 경로보다는 상대 경로(명령을 실행한 루트를 기준으로 함)를 얻고 싶습니다.

누구든지 도와줄 수 있나요?

감사해요!

답변1

적절한 Csv 파일을 얻는 한 가지 방법은 내 주석의 출력을 래핑하는 것입니다.

Get-ChildItem -Recurse -Name -File | 
  ForEach-Object -begin {'"RelativePath"'}{'"{0}"' -f $_}|
    Out-File "test.csv"

또는 계산된 속성을 사용하여 속성에서 시작 디렉터리를 제거합니다 FullName.

$StartDir = "$ENV:USERPROFILE\Documents\"
Get-ChildItem -Path $StartDir -File -Recurse |
  Select-Object @{n='RelativePath';e={$_.FullName -replace [regex]::escape($StartDir)}}|
    Export-Csv 'test.csv' -NoTypeInformation

답변2

이 질문은 귀하가 PowerShell을 처음 접한다는 인상을 줍니다. 따라서 당신이 직면하게 될 오해, 나쁜 습관, 오류 및 심각한 좌절을 제한/피하기 위해 그것에 힘쓰는 것이 중요합니다. YouTube/MSDN Channel9를 방문하여 초급, 중급, 고급 PowerShell은 물론 PowerShell 파일 시스템 관리, PowerShell 파일 및 폴더 관리를 검색하세요.

PowerShell은 대부분의 경우 강제로 시도하지만 사용자가 원하는 작업을 파악하려고 시도하지는 않습니다. 무엇을 해야할지 말해야합니다. 글쎄, 이것은 모든 컴퓨터 언어에 해당됩니다.

여기서 당신의 문제는 당신이 말하는 것입니다 ...

(명령을 실행한 루트를 기준으로 함)

...글쎄, 루트 드라이브에서 X 레벨 깊이의 경로에 있을 수 있으므로 이제 하위에 있으며 추정에 따르면 하위에서만 이를 원합니다. 여기에 그 사고 과정의 문제가 있습니다.

이것을 텍스트 파일로 저장하면 드라이브 경로가 전혀 생기지 않으므로 다시 사용하기 위해 돌아갈 때 파일을 다시 사용하려면 이를 알고 수동으로 다시 넣어야 합니다.

따라서 이러한 노력에 대한 귀하의 사용 사례가 무엇인지 잘 모르겠지만 논리적으로는 다시 물릴 것입니다.

그래서, 내가 여기 있다고 가정해 봅시다:

Push-Location -Path 'E:\Temp'

그럼 우리는 이것을 실행

Get-ChildItem -recurse | 
Where-Object { !$_.PSIsContainer } | Select-Object -Property  FullName 

# Results

FullName                                                            
--------                                                            
E:\Temp\about_ReGet-ChildItemection  Microsoft Docs.url                       
...                                     
E:\Temp\ZipMultiFolder.zip                                          
E:\Temp\Folder\Log_20190419.txt                                     
...                               
E:\Temp\Reports\NewFiles.zip                                        
...  

그럼 여기서 현재 위치를 알아봅시다...

Get-ChildItem -recurse | 
Where-Object { !$_.PSIsContainer } | 
Select-Object -Property  @{Name = 'RelativePath';Expression = {"\$($pwd.Drive.CurrentLocation)\$($PSItem.Name)"}}

따라서 여기서는 현재 경로를 가져오고 전체 이름이 아닌 파일 이름만 요청합니다.

# Results

RelativePath 
------------                                                            
\Temp\about_ReGet-ChildItemection  Microsoft Docs.url                       
...                                     
\Temp\ZipMultiFolder.zip                                          
\Temp\Folder\Log_20190419.txt                                     
...                               
\Temp\Reports\NewFiles.zip                                        
... 

이를 CSV로 출력하면 이것이 어떤 드라이브에서 왔는지 알 수 없습니다. 따라서 이제 컴퓨터의 모든 드라이브를 검색하여 찾거나 이 작업을 수행할 때 어디에 있었는지 기억해야 합니다.

아이를 쓰러뜨리는 것도 마찬가지다. 물론이죠, 알겠지만 실제로는 어디에 있나요? 시스템 또는 매핑된 일부 네트워크 드라이브에서.

Push-Location -Path 'E:\Temp\Folder'

그럼 우리는 이것을 실행

Get-ChildItem -recurse | 
Where-Object { !$_.PSIsContainer } | Select-Object -Property  FullName 

# Results

FullName                                   
--------                                   
E:\Temp\Folder\Log_20190419.txt            
E:\Temp\Folder\New Bitmap Image.bmp        
E:\Temp\Folder\New Text Document - Copy.txt
E:\Temp\Folder\New Text Document.txt  


Get-ChildItem -recurse | 
Where-Object { !$_.PSIsContainer } | 
Select-Object -Property  @{Name = 'RelativePath';Expression = {"\$($pwd.Drive.CurrentLocation)\$($PSItem.Name)"}}


RelativePath                             
------------                             
\Temp\Folder\Log_20190419.txt            
\Temp\Folder\New Bitmap Image.bmp        
\Temp\Folder\New Text Document - Copy.txt
\Temp\Folder\New Text Document.txt  

그리고 여기에서 부모 루트를 원하지 않는다고 말하면, 그것을 제거합니다.

그러나 이는 해당 드라이브가 어떤 드라이브에서 왔는지 알 수 없을 뿐만 아니라 어떤 루트 상위 부모도 어디에서 왔는지 알 수 없음을 의미합니다.

그러니 그냥 말씀하세요.

그런데 스크립트에서 전체 cmdlet 이름을 사용하는 것이 가장 좋습니다. 속기/별칭은 대화형 작업에 적합합니다. 물론, 우리는 모두 'dir'을 사용하는 습관이 있지만 Get-ChildItem의 약칭은 'gci'입니다. 이 역시 마찬가지로 짧습니다.

Get-Alias -Definition Get-ChildItem | 
Format-Table -AutoSize



CommandType Name                 Version Source
----------- ----                 ------- ------
Alias       dir -> Get-ChildItem               
Alias       gci -> Get-ChildItem               
Alias       ls -> Get-ChildItem  

하지만 습관은 정말 고치기 어렵습니다. ;-} --- --- 그리고 신중한 결정은 다른 사람이 어떻게 생각하든 상관없이 우리에게 도움이 되는 결정입니다. ;-}

글쎄, 당신을 따르는 사람들은 입장을 취합니다. 따라서 훌륭한 PowerShell 시민이 되는 것은 정말 좋은 일입니다.

그런데 스크립트에서 이 작업을 수행하려는 경우 이러한 종류의 작업에 대한 자동 변수도 있습니다. 글쎄, 스크립트가 실행된 위치와 해당 위치와 관련된 모든 것을 가져옵니다.

이 기사를 참조하십시오.

상대 파일 경로로 스크립트 유연성 추가

관련 정보