我试图编写一个函数来查找.sys文件中的池标记。我创建了一个包含.sys文件的所有目录的数组,然后使用sysinternals Strings实用程序循环遍历它们。
这是数组:
$paths = Get-ChildItem \\$server\c$ *.sys -Recurse -ErrorAction SilentlyContinue |
Select-Object Directory -unique
这是我第一次尝试循环:
foreach ($path in $paths) {
#convert object IO fileobject to string and strip out extraneous characters
[string]$path1 = $path
$path2 = $path1.replace("@{Directory=","")
$path3 = $path2.replace("}","")
$path4 = "$path3\*.sys"
Invoke-Command -ScriptBlock {strings -s $path4 | findstr $string}
}
我发现了一些错误引用,表明在foreach
循环中,所有信息都存储在内存中,直到完成处理。
所以我尝试了这个:
for ($i = 0; $i -lt $paths.count; $i++){
[string]$path1 = $paths[$i]
$path2 = $path1.replace("@{Directory=","")
$path3 = $path2.replace("}","")
$path4 = "$path3\*.sys"
Invoke-Command -ScriptBlock {strings -s $path4 | findstr $string}
}
但它有相同的结果。我已经读过,在整个管道中一次发送一个项目可以防止这个错误/问题,但我不知道如何继续。有什么想法吗?
答案 0 :(得分:1)
是的,通常使用流媒体解决这个问题会更好,所以你不必缓冲一堆对象,例如:
Get-ChildItem \\server\c$ -r *.sys -ea 0 | Foreach {
"Processing $_"; strings $_.Fullname | findstr $string}
另外,当您可以直接调用Invoke-Command
和strings
时,我不确定您使用findstr
的原因。您通常使用Invoke-Command
在远程计算机上运行命令。