2

フォルダー構造が深いファイル共有用の CSV ファイルを作成しようとしています。

CSVを次のようにしたい:

filename, filepath, file type, folderStructure

これまでのところ、次のものがあります。

#Get-ChildItem -Path D:\ -Recurse
$directory="d:\"
gci $directory -recurse |
where {$_.psiscontainer} |
foreach {
    get-childitem $_.fullname |
    sort creationtime |
    select -expand fullname -last 1
}
4

3 に答える 3

8

Powershell で再帰を再帰する必要はありません。サブディレクトリのすべてのサブディレクトリを自動的に通過します。

また、あなたが望んでいた情報のいくつかについても少し確信が持てませんが、ここにあなたが望むことをほとんど実行するスクリプトがあり、IMO は少し読みやすくなっています。

Get-ChildItem -Path X:\Test -Recurse |`
foreach{
$Item = $_
$Type = $_.Extension
$Path = $_.FullName
$Folder = $_.PSIsContainer
$Age = $_.CreationTime

$Path | Select-Object `
    @{n="Name";e={$Item}},`
    @{n="Created";e={$Age}},`
    @{n="filePath";e={$Path}},`
    @{n="Extension";e={if($Folder){"Folder"}else{$Type}}}`
}| Export-Csv X:\Test\Results.csv -NoTypeInformation 

これはテスト用に作成したため、パスを変更する必要があります。私の結果はExcelで次のようになります。

+-------------------------------+----------------+-------------------------------------+-----------+
|             Name              |    Created     |              filePath               | Extension |
+-------------------------------+----------------+-------------------------------------+-----------+
|         test2                 | 3/6/2013 19:21 | X:\Test\test2                       | Folder    |
|         Results.csv           | 3/6/2013 19:51 | X:\Test\Results.csv                 | .csv      |
|         test3                 | 3/6/2013 19:21 | X:\Test\test2\test3                 | Folder    |
|         New Text Document.txt | 3/6/2013 19:21 | X:\Test\test2\New Text Document.txt | .txt      |
+-------------------------------+----------------+-------------------------------------+-----------+

拡張機能の「フォルダー」と表示されている場所は、空白ではなくディレクトリであることを返すだけです(拡張子なし)。

于 2013-03-07T02:11:20.027 に答える
1

これが最善のアプローチかどうかはわかりませんが、うまくいきます。ファイルのフルパスを取得するためにコードを短くすることができると感じています。

$myDirectory = "D:\"
Get-ChildItem -Path $myDirectory -Recurse |`
foreach{
$Item = $_
$Type = $_.Extension
$Path = $_.FullName

$ParentS = ($_.Fullname).split("\")
$Parent = $ParentS[@($ParentS.Length - 2)]
$ParentPath = $_.PSParentPath
$ParentPathSplit = ($_.PSParentPath).split("::")
$ParentPathFinal = $ParentPathSplit[@($ParentPathSplit.Length -1)]
#$ParentPath = [io.path]::GetDirectoryName($myDirectory)

$Folder = $_.PSIsContainer
$Age = $_.CreationTime

$Path | Select-Object `
    @{n="Name";e={$Item}},`
    @{n="Created";e={$Age}},`
    @{n="Folder Name";e={if($Parent){$Parent}else{$Parent}}},`
    @{n="filePath";e={$Path}},`
    @{n="Extension";e={if($Folder){"Folder"}else{$Type}}},`
    @{n="Folder Name 2";e={if($Parent){$Parent}else{$Parent}}},`
    #@{n="Folder Path";e={$ParentPath}},`
    @{n="Folder Path 2";e={$ParentPathFinal}}`

}| Export-Csv d:\ResultsC_2_F.csv -NoTypeInformation 
于 2013-03-07T13:32:46.910 に答える
1

OK、親のチェック方法を変更しました。親アトリビュートを直接見ていないので、修正する必要があります。

    Get-ChildItem -Path D:\ -Recurse |`
foreach{
$Item = $_
$Type = $_.Extension
$Path = $_.FullName

$ParentS = ($_.Fullname).split("\")
$Parent = $ParentS[@($ParentS.Length - 2)]

$Folder = $_.PSIsContainer
$Age = $_.CreationTime

$Path | Select-Object `
    @{n="Name";e={$Item}},`
    @{n="Created";e={$Age}},`
    @{n="Folder Name";e={if($Parent){$Parent}else{$Parent}}},`
    @{n="filePath";e={$Path}},`
    @{n="Extension";e={if($Folder){"Folder"}else{$Type}}}`
}| Export-Csv X:\Test\ResultsC.csv -NoTypeInformation 

現在のアイテムへのパスを取得し、\ で分割して配列に変換し、ArryLength - 2 の値を提供します。

于 2013-03-07T12:04:40.937 に答える