微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取所有扩展文件属性的高效脚本

如何解决获取所有扩展文件属性的高效脚本

我是使用 Powershell 的新手,我有一些可以工作的代码,但我不确定如何将它变成一个有效的例程,以返回我拥有的某些视频文件的所有扩展文件属性

我有

# The basic setup for the next steps
$path = 'C:\test\videotocheck.mp4'
$shell = New-Object -COMObject Shell.Application
$folder = Split-Path $path
$file = Split-Path $path -Leaf
$shellfolder = $shell.Namespace($folder)
$shellfile = $shellfolder.ParseName($file)

# This command gets a list of all the extended attributes available for this file
0..500 | Foreach-Object { '{0} = {1}' -f $_,$shellfolder.GetDetailsOf($null,$_) }

# These commands get the individual attributes picked out of the list above
$shellfolder.GetDetailsOf($shellfile,314)
$shellfolder.GetDetailsOf($shellfile,316)

我想要做的就是提供一个文件名,让它给我一个所有属性及其值的列表(如果有的话。)

示例:

Example Output

我打算在 sql 存储过程中使用它。如果更容易,我可以处理不同类型的输出

我最感兴趣的是维度

任何指导将不胜感激。

解决方法

要获得所有这些扩展元数据,您可以使用下面的函数。 您可以为其指定单个文件的路径,或文件所在文件夹的路径。

function Get-MetaData {
    [CmdletBinding()]
    [OutputType([Psobject[]])]
    Param (
        # Path can be the path to a folder or the full path and filename of a single file
        [Parameter(Mandatory = $true,ValueFromPipeline = $true,Position = 0)]
        [string]$Path,# Pattern is unused if Path is pointing to a single file
        [Alias('Filter')]
        [string]$Pattern = '*.*',[Alias('Indices')]
        [int[]]$Properties = 1..500,# Recurse is unused if Path is pointing to a single file
        [switch]$Recurse,[switch]$IncludeEmptyProperties
    )
    $item = Get-Item -Path $Path -ErrorAction SilentlyContinue
    if (!$item) { Write-Error "$Path could not be found."; return }
    if (!$item.PSIsContainer) {
        # it's a file
        $files = @($item)
        $Path  = $item.DirectoryName
    }
    else {
        # it's a folder
        $files = Get-ChildItem -Path $Path -Filter $Pattern -File -Recurse:$Recurse
    }
    $shell  = New-Object -ComObject "Shell.Application"
    $objDir = $shell.NameSpace($Path)

    foreach($file in $files) {
        $objFile    = $objDir.ParseName($file.Name)
        $mediaFile  = $objDir.Items()

        foreach($index in $Properties) {
            $name  = $objDir.GetDetailsOf($mediaFile,$index)
            if (![string]::IsNullOrWhiteSpace($name)) { 
                $value = $objDir.GetDetailsOf($objFile,$index)
                if (![string]::IsNullOrWhiteSpace($value) -or $IncludeEmptyProperties) {
                    [PsCustomObject]@{
                        Path     = $file.FullName
                        Index    = $index
                        Property = $name
                        Value    = $value
                    }
                }
            }
        }
    }
    # clean-up Com objects
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objFile)
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objDir)
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell)
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
}

您当然可以使用该函数可以采用的不同参数,例如 -Pattern '*.mp4' 仅列出 mp4 文件的属性或添加开关 -IncludeEmptyProperties 以列出该文件类型存在的属性,但是没有指定文件的值。

使用参数 Properties,您可以为函数提供要返回的属性索引的 int32 值数组。如果您保持打开状态,该函数会尝试获取从索引 1 到索引 500(如果可用)的所有属性。

可以在以下位置找到大多数有趣的属性索引:

  • 音频/视频文件:0,1,2,3,4,5,9,11,12,13,14,15,16,17,18,19,20,21,22,26,27,28,36,164,165,194,213,220,223,237,243
  • 字体文件:
    0,25,33,34,166,196,310
  • 图像文件:
    0,31,174,175,176,177,178,196

像这样使用它:

$result = Get-MetaData -Path '<pathToTheFile_OR_pathToTheFolder>'

# output to GridView
$result | Out-GridView

# output to CSV file
$result | Export-Csv -Path '<pathToTheOutput.csv>' -NoTypeInformation
,

这是一个类似于 Theo 的简化版本。它将通过管道或作为参数接受文件/文件夹路径或对象。

Function Get-FileMetaData {
    [cmdletbinding()]
    Param
    (
        [parameter(valuefrompipeline,ValueFromPipelineByPropertyName,Position=1,Mandatory)]
        $InputObject
    )

    begin
    {
        $shell = New-Object -ComObject Shell.Application
    }

    process
    {
        foreach($object in $InputObject)
        {
            if($object -is [string])
            {
                try
                {
                    $object = Get-Item $object -ErrorAction Stop
                }
                catch
                {
                    Write-Warning "Error while processing $object : $($_.exception.message)"
                    break
                }
            }

            try
            {
                Test-Path $object -ErrorAction Stop
            }
            catch
            {
                Write-Warning "Error while processing $($object.fullname) : $($_.exception.message)"
                break
            }

            switch ($object)
            {
                {$_ -is [System.IO.DirectoryInfo]}{
                    write-host Processing folder $object.FullName -ForegroundColor Cyan
                    $currentfolder = $shell.namespace($object.FullName)
                    $items = $currentfolder.items()
                }
                {$_ -is [System.IO.FileInfo]}{
                    write-host Processing file $object.FullName -ForegroundColor Cyan
                    $parent = Split-Path $object
                    $currentfolder = $shell.namespace($parent)
                    $items = $currentfolder.ParseName((Split-Path $object -Leaf))
                }
            }

            try
            {
                foreach($item in $items)
                {
                    0..512 | ForEach-Object -Begin {$ht = [ordered]@{}}{
                        if($value = $currentfolder.GetDetailsOf($item,$_))
                        {
                            if($propname = $currentfolder.GetDetailsOf($null,$_))
                            {
                                $ht.Add($propname,$value)
                            }
                        
                        }    
                    } -End {[PSCustomObject]$ht}
                }
            }
            catch
            {
                Write-Warning "Error while processing $($item.fullname) : $($_.exception.message)"
            }
        }
    }

    end
    {
        $shell = $null
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?