1

我正在构建一个 PowerShell 脚本,它将在机器上找到所有 jpeg/jpg 文件。这是我目前所拥有的——

# PowerShell script to list the DLL files under the C drive
$Dir = get-childitem C:\ -recurse
# $Dir |get-member
$List = $Dir | where {$_.extension -eq ".jpg"}
$List |ft fullname |out-file C:\Users\User1\Desktop\dll.txt
# List | format-table name

唯一的问题是我正在寻找的一些文件没有扩展名 jpg/jpeg。我知道您可以查看文件的标题,如果它显示 ÿØÿà 那么它是 jpeg/jpg 但我不知道如何将其合并到脚本中。

任何帮助,将不胜感激。非常感谢!

4

6 回答 6

3

我不确定如何使用 powershell 本机命令来查看文件头,我会对其进行一些研究,因为它听起来很有趣。在此之前,我可以建议您的初始命令的更短版本,将其减少为单行。

Get-ChildItem -Recurse -include *.jpg | Format-table -Property Fullname | Out-file C:\Users\User1\Desktop\Jpg.txt

或者

ls -r -inc *.jpg | ft Fullname

已编辑:删除冗余代码,谢谢@nick。

如果我找到任何东西,我会告诉你我找到了什么。

克里斯

于 2013-01-30T22:05:49.343 回答
3

以下将检索带有.jpg/.jpeg扩展名或在前四个字节中包含 JPEG 标头的文件:

[Byte[]] $jpegHeader = 255, 216, 255, 224;

function IsJpegFile([System.IO.FileSystemInfo] $file)
{
    # Exclude directories
    if ($file -isnot [System.IO.FileInfo])
    {
        return $false;
    }

    # Include files with either a .jpg or .jpeg extension, case insensitive
    if ($file.Extension -match '^\.jpe?g$')
    {
        return $true;
    }

    # Read up to the first $jpegHeader.Length bytes from $file
    [Byte[]] $fileHeader = @(
        Get-Content -Path $file.FullName -Encoding Byte -ReadCount 0 -TotalCount $jpegHeader.Length
    );

    if ($fileHeader.Length -ne $jpegHeader.Length)
    {
        # The length of the file is less than the JPEG header length
        return $false;
    }

    # Compare each byte in the file header to the JPEG header
    for ($i = 0; $i -lt $fileHeader.Length; $i++)
    {
        if ($fileHeader[$i] -ne $jpegHeader[$i])
        {
            return $false;
        }
    }

    return $true;
}

[System.IO.FileInfo[]] $jpegFiles = @(
    Get-ChildItem -Path 'C:\' -Recurse `
        | Where-Object { IsJpegFile $_; }
);

$jpegFiles | Format-Table 'FullName' | Out-File 'C:\Users\User1\Desktop\dll.txt';

请注意,cmdlet-Encoding的和-TotalCount参数仅用于读取每个文件的前四个字节,而不是整个文件。这是一项重要的优化,因为它基本上避免了读取驱动器上文件数据的每个字节。Get-ContentC:

于 2013-01-30T23:15:05.130 回答
2

这应该为您提供以序列“ÿØÿà”开头的所有文件:

$ref = [byte[]]@(255, 216, 255, 224)

Get-ChildItem C:\ -Recurse | ? { -not $_.PSIsContainer } | % {
  $header = [System.IO.File]::ReadAllBytes($_.FullName)[0..3]
  if ( (compare $ref $header) -eq $null ) {
    $_.FullName
  }
} | Out-File "C:\Users\User1\Desktop\dll.txt"
于 2013-01-30T22:33:55.907 回答
1

我建议查询 jpeg 的 Windows 搜索索引,而不是尝试嗅探文件内容。使用文件名搜索系统索引非常快,缺点是您必须搜索索引位置。

我使用 windows sdk \samples\windowssearch\oledb 编写了一个 windows 搜索查询脚本,您可能希望使用成像属性进行查询。但是,我不确定搜索索引是否使用映像 API 来查看未知文件或没有扩展名的文件。Explorer 似乎知道我的 jpeg 缩略图和没有 jpg 扩展名的元数据,所以我猜索引器会像 explorer 一样聪明。

于 2013-02-01T22:29:32.833 回答
1

要查找标题是否以 ÿØÿà 开头,请使用:

[System.String]$imgInfo = get-content $_ # where $_ is a .jpg file such as "pic.jpg"
if($imgInfo.StartsWith("ÿØÿà"))
{
      #It's a jpeg, start processing...
}

希望这可以帮助

于 2013-01-30T22:27:56.763 回答
0

这个怎么样?

jp*g用于匹配 jpg 和 jepg 图像。

$List = Get-ChildItem "C:\*.jp*g" -Recurse
$List |ft fullname |out-file C:\Users\User1\Desktop\dll.txt
于 2021-05-08T03:29:28.377 回答