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呼び出すことができるときになぜ使用しているのかわかりません。通常、リモート コンピューターでコマンドを実行するために使用します。stringsfindstrInvoke-Command

于 2012-10-23T04:45:18.427 に答える