Sas*_*sha 6 powershell grep binaryfiles string-matching powershell-core
有没有办法在powershell中判断指定文件是否包含指定的字节数组(在任意位置)?
\n\n就像是:
\n\nfgrep --binary-files=binary "$data" "$filepath"\nRun Code Online (Sandbox Code Playgroud)\n\n当然,我可以写一个简单的实现:
\n\nfunction 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.\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\x94 但速度非常慢。
\n我确定以下方法可以作为解决方法:
\n\n(Get-Content $filepath -Raw -Encoding 28591).IndexOf($fragment)\nRun 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
在旧版 PowerShell 上,您可以使用:
\n\n[System.Text.Encoding]::GetEncoding(28591).\n GetString([System.IO.File]::ReadAllBytes($filepath)).\n IndexOf($fragment)\nRun Code Online (Sandbox Code Playgroud)\n\n遗憾的是,我还没有找到一种普遍匹配序列的方法(即,将序列与任何项目类型匹配的常用方法:整数、对象等)。我相信它一定存在于 .NET 中(特别是存在字符序列的特定实现)。希望有人会建议它。
\n| 归档时间: |
|
| 查看次数: |
3595 次 |
| 最近记录: |