Recuperar conteúdo de pastas e subpastas para CSV com caminhos relativos

Recuperar conteúdo de pastas e subpastas para CSV com caminhos relativos

Encontrei isso para obter o conteúdo de uma pasta e sua subpasta (somente arquivos) em um arquivo CSV:

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

No entanto, em vez do caminho completo, gostaria de obter o caminho relativo (relativo à raiz de onde executo o comando).

Alguém pode ajudar?

Obrigado!

Responder1

Uma maneira de obter um arquivo CSV adequado é agrupar a saída do meu comentário:

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

Ou use uma propriedade calculada para retirar o diretório inicial da FullNamepropriedade.

$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

Responder2

Esta pergunta se traduz na impressão de que você é muito novo no PowerShell. Portanto, é vital que você se acelere para limitar/evitar equívocos, maus hábitos, erros e frustrações graves que você certamente encontrará. Acesse o YouTube/MSDN Channel9 e pesquise PowerShell inicial, intermediário e avançado, bem como gerenciamento de sistema de arquivos PowerShell e gerenciamento de arquivos e pastas PowerShell.

O PowerShell tentará, em muitos casos, coagir as coisas, mas não tentará descobrir o que você deseja fazer. Você tem que dizer o que fazer. Bem, isso é verdade para qualquer linguagem de computador.

Seu problema aqui é o que você diz ...

(em relação à raiz de onde executo o comando)

... bem, você poderia estar em um caminho com nível X de profundidade a partir da unidade raiz, então, agora você é um filho, e a extrapolação é que você deseja isso apenas do filho. Aqui está o problema com esse processo de pensamento.

Salve isso em um arquivo de texto, então nunca mais terá o caminho da unidade e, como tal, quando voltar a usá-lo, você terá que saber disso e colocá-lo de volta manualmente para poder usar os arquivos novamente.

Então, não tenho certeza de qual é o seu caso de uso para esse esforço, mas logicamente ele voltará para te morder.

Então, digamos, estou aqui:

Push-Location -Path 'E:\Temp'

Então nós executamos isso

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                                        
...  

Então, aqui apenas obtemos a localização atual ...

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

Então, aqui apenas pegamos o caminho atual em que estamos e pedimos apenas o nome do arquivo, não o nome completo

# Results

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

Se enviarmos isso para um CSV, você não tem ideia de qual unidade veio. Então, agora você precisa pesquisar cada unidade da sua máquina para encontrá-los ou lembrar onde você estava quando fez isso.

Cair uma criança, a mesma coisa. Claro, você entendeu, mas onde está realmente? No seu sistema ou em alguma unidade de rede para a qual você mapeou.

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

Então nós executamos isso

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  

E se você está dizendo, aqui, que não quer a raiz pai, então elimine isso.

No entanto, isso significa que você não apenas não sabe de qual unidade veio, mas também não sabe de qual pai raiz veio.

Então, basta dizer.

A propósito, é uma prática recomendada usar o nome completo do cmdlet em scripts. Abreviações/aliases são adequados para coisas interativas. Claro, todos nós temos o hábito de usar 'dir', mas a abreviação obtida por Get-ChildItem é 'gci', que é tão curta quanto, mas, você sabe.

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



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

Mas ei, hábitos são realmente difíceis de quebrar. ;-} --- --- e as decisões prudentes são aquelas que funcionam para nós, independentemente do que os outros pensam. ;-}

Bem, aqueles que te seguem fazem com que você se posicione. Portanto, ser um bom cidadão do PowerShell é realmente uma coisa boa.

Aliás, se você fosse fazer isso em um script, também existe uma variável automática para esse tipo de coisa. Bem, obtendo o local onde o script foi executado e qualquer coisa associada a esse local.

Veja este artigo.

Adicione flexibilidade de script com caminhos de arquivo relativos

informação relacionada