3

我试图编写一个函数来查找 .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}       
}

但它有同样的结果。我已经读过通过管道一次发送一个项目将防止这个错误/问题,但我不知道如何继续。有什么想法吗?

4

1 回答 1

1

是的,通常最好使用流来解决这个问题,这样您就不必缓冲一堆对象,例如:

Get-ChildItem \\server\c$ -r *.sys -ea 0 | Foreach {
    "Processing $_"; strings $_.Fullname | findstr $string}

另外,我不确定您为什么Invoke-Command在可以直接调用时strings使用findstr。您通常用于Invoke-Command在远程计算机上运行命令。

于 2012-10-23T04:45:18.427 回答