如何创建同时包含文件元数据和文件内容的CSV?

时间:2018-10-05 16:13:53

标签: powershell

使用Scripting Guy's code,我可以创建一个显示与计算机上文件相关联的元数据的csv:

enter image description here

我想在此csv中添加一个附加列,其中包含文件的全部内容。我找到了Get-Content cmd并能够使其正常工作,但是我不知道如何将其插入代码中。

我尝试了多种方法:

if($objFolder.getDetailsOf($File, $a))
           {
             $hash += @{$($objFolder.getDetailsOf($objFolder.items, $a))  =
                   $($objFolder.getDetailsOf($File, $a))
                   & $($objFolder.get-content($File, $a)) }
            $FileMetaData | Add-Member $hash
            $hash.clear() 
           } #end if

错误代码:哈希文字不完整。

if($objFolder.getDetailsOf($File, $a))
           {
             $hash += @{$($objFolder.getDetailsOf($objFolder.items, $a))  =
                   $($objFolder.getDetailsOf($File, $a)) }
            $FileMetaData | Add-Member $hash
            $FileMetData | Get-Content($objFolder)
            $hash.clear() 
           } #end if

错误代码:找不到接受参数'recurse'的位置参数

编辑:这是完整的代码:

  Function Get-FileMetaData 
{
Param([string[]]$folder)
 foreach($sFolder in $folder)
  {
   $a = 0
   $objShell = New-Object -ComObject Shell.Application
   $objFolder = $objShell.namespace($sFolder)

   foreach ($File in $objFolder.items())
    { 
     $FileMetaData = New-Object PSOBJECT
      for ($a ; $a  -le 266; $a++)
       { 
  if($objFolder.getDetailsOf($File, $a))
               {
                 $hash += @{$($objFolder.getDetailsOf($objFolder.items, $a))  =
                       $($objFolder.getDetailsOf($File, $a))}
                $FileMetaData | Add-Member $hash
                $hash.clear() 
               } #end if
       } #end for 
     $a=0
     $FileMetaData
    } #end foreach $file
  } #end foreach $sfolder
} #end Get-FileMetaData
$picMetadata  = Get-FileMetaData -folder (Get-childitem C:\Olivia\ -Recurse -Directory).FullName


$picMetadata |

Select Name,'Date created','Folder name'|

Export-CSV -Path C:\Olivia\metadata.csv -NoTypeInformation

1 个答案:

答案 0 :(得分:1)

好的,所以问题出在哪里放置获取内容

您内部有3个循环。

  1. 最向外的是对于参数中的文件夹数组中的每个文件夹。这将创建一个shell com对象并获取有关该文件夹的信息。

  2. 下一个循环遍历文件夹内的每个项目。并创建一个PSObject $ FileMetaData

  3. 最后一个也是最内部的,它通过266个选项循环获得项目详细信息。然后将它们添加到PSObject。

第2圈是我们需要向PS对象添加新属性并添加内容的地方,因此每个Item仅循环一次。我们还需要确保它不是文件夹,因为文件夹没有文件内容。

这是在第二个循环中添加到函数的更改

$FileMetaData | Add-Member -MemberType NoteProperty -Name Content -Value $(
    If($File.IsFolder -eq $false){
        Get-Content $File.Path
    }else{
        $null
    }
)

这是该函数的重制

Function Get-FileMetaData{
Param([string[]]$folder)
foreach($sFolder in $folder){
    $a = 0
    $objShell = New-Object -ComObject Shell.Application
    $objFolder = $objShell.namespace($sFolder)
    foreach ($File in $objFolder.items()){
        $FileMetaData = New-Object PSOBJECT
        for ($a ; $a  -le 266; $a++)
        { 
            if($objFolder.getDetailsOf($File, $a))
            {
            $hash += @{$($objFolder.getDetailsOf($objFolder.items, $a))  =
                    $($objFolder.getDetailsOf($File, $a)) }
            $FileMetaData | Add-Member $hash
            $hash.clear() 
            }
        }
        $a=0
        $FileMetaData | Add-Member -MemberType NoteProperty -Name Content -Value $(
            If($File.IsFolder -eq $false){
                Get-Content $File.Path
            }else{
                $null
            }
        )
         $FileMetaData
        }
    }
}