Powershell 二进制 grep

Sas*_*sha 6 powershell grep binaryfiles string-matching powershell-core

有没有办法在powershell中判断指定文件是否包含指定的字节数组(在任意位置)?

\n\n

就像是:

\n\n
fgrep --binary-files=binary "$data" "$filepath"\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,我可以写一个简单的实现:

\n\n
function posOfArrayWithinArray {\n    param ([byte[]] $arrayA, [byte[]]$arrayB)\n    if ($arrayB.Length -ge $arrayA.Length) {\n        foreach ($pos in 0..($arrayB.Length - $arrayA.Length)) {\n            if ([System.Linq.Enumerable]::SequenceEqual(\n                $arrayA,\n                [System.Linq.Enumerable]::Skip($arrayB, $pos).Take($arrayA.Length)\n            )) {return $pos}\n        }\n    }\n    -1\n}\n\nfunction posOfArrayWithinFile {\n    param ([byte[]] $array, [string]$filepath)\n    posOfArrayWithinArray $array (Get-Content $filepath -Raw -AsByteStream)\n}\n\n// They return position or -1, but simple $false/$true are also enough for me.\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x94 但速度非常慢。

\n

Sas*_*sha 1

我确定以下方法可以作为解决方法:

\n\n
(Get-Content $filepath -Raw -Encoding 28591).IndexOf($fragment)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x94 即当我们指定二进制安全编码string时,PowerShell (实际上是.NET )可以成功匹配任何字节。当然,我们需要对文件和片段使用相同的编码,并且编码必须是真正的二进制安全的(例如1250、1000和28591适合,但是各种Unicode(包括默认的BOM-less UTF-8) ) 不这样做,因为它们将任何格式不正确的代码单元转换为相同的替换字符 (U+FFFD) )。感谢西奥的澄清。System.String

\n\n

在旧版 PowerShell 上,您可以使用:

\n\n
[System.Text.Encoding]::GetEncoding(28591).\n    GetString([System.IO.File]::ReadAllBytes($filepath)).\n    IndexOf($fragment)\n
Run Code Online (Sandbox Code Playgroud)\n\n

遗憾的是,我还没有找到一种普遍匹配序列的方法(即,将序列与任何项目类型匹配的常用方法:整数、对象等)。我相信它一定存在于 .NET 中(特别是存在字符序列的特定实现)。希望有人会建议它。

\n