相対パスを使用してフォルダとサブフォルダの内容を CSV に取得する

相対パスを使用してフォルダとサブフォルダの内容を CSV に取得する

CSV ファイル内のフォルダーとそのサブフォルダー (ファイルのみ) の内容を取得するには、次の方法を見つけました。

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

ただし、完全なパスではなく、相対パス (コマンドを実行するルートからの相対パス) を取得したいと思います。

誰か助けてくれませんか?

ありがとう!

答え1

適切な CSV ファイルを取得する 1 つの方法は、コメントからの出力をラップすることです。

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 に非常に不慣れであるという印象を与えます。したがって、あなたが確実に遭遇する誤解、悪い習慣、エラー、深刻なフラストレーションを制限/回避するために、PowerShell に慣れておくことが重要です。YouTube/MSDN Channel9 にアクセスして、PowerShell の初級、中級、上級、PowerShell、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  

ここで、親ルートが必要ない場合は、それを削除します。

しかし、それは、それがどのドライブから来たのかわからないだけでなく、ルート親がどのドライブから来たのかもわからないことを意味します。

だから、ただ言ってるだけ。

ちなみに、スクリプトでは完全なコマンドレット名を使用するのがベストプラクティスです。対話型のものには、短縮形やエイリアスでも問題ありません。もちろん、私たちは「dir」を使用するのが習慣になっていますが、Get-ChildItem の短縮形 got は「gci」で、これは did と同じくらい短いのですが、ご存知のとおりです。

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 ユーザーであることは本当に良いことです。

ちなみに、これをスクリプトで実行する場合、この種の処理のための自動変数もあります。スクリプトが実行された場所と、その場所に関連付けられているものを取得します。

この記事を参照してください。

相対ファイルパスでスクリプトの柔軟性を高める

関連情報