从openfiles.exe输出格式表

时间:2012-03-15 21:47:49

标签: powershell

我正在尝试'动态'格式化openfiles.exe的输出,而不是将输出保存为CSV并导入它。 如果我只是运行openfiles /query /s SERVERNAME /fo table我就

ID       Accessed By          Type       Open File (Path\executable)
======== ==================== ========== =====================================
1558     AUSERNAME            Windows    D:\..\Imaging\Itool.ldb

现在我想通过Accessed By或Open File来动态排序结果,所以我试过了 openfiles /query /s SERVERNAME /fo table | Format-Table "Accessed By","Open File (Path\executable)" -auto 这只是吐出与第一个命令相同的东西。理想情况下,我只想要“访问者”和“打开文件(路径\可执行文件)”,并且只能通过其中任何一个对em进行排序。我试图避免做CSV事情。

3 个答案:

答案 0 :(得分:3)

这有点棘手,因为openfiles不是PowerShell cmdlet。它只是在表中显示其数据,但它不是它返回的对象。 PowerShell只是将它们作为字符串。

$item = New-Object PSObject
switch -regex (openfiles /query /s SERVERNAME /fo list) {
    '([^:]+):\s+(.*)$' {
        $item | Add-Member NoteProperty $Matches[1] $Matches[2]
    }
    '^$' {
        if ($item) { $item }
        $item = New-Object PSObject
    }
}

这使用列表格式,解析它并构造您可以使用的对象。将其包装在函数(或带有$(...)的子表达式)中,您可以使用Format-Table

$(
    $item = New-Object PSObject
    switch -regex (openfiles /query /s SERVERNAME /fo list) {
        '([^:]+):\s+(.*)$' {
            $item | Add-Member NoteProperty $Matches[1] $Matches[2]
        }
        '^$' {
            if ($item) { $item }
            $item = New-Object PSObject
        }
    }
) | ft 'Accessed By','Open File (Path\executable)' -auto

或者您只是稍微更改命令。我使用switch的内在迭代功能,但你可以用显式管道做同样的事情:

openfiles /query /s SERVERNAME /fo list |
  ForEach-Object {
    $item = New-Object PSObject
  } {
    switch -regex ($_) {
      '([^:]+):\s+(.*)$' {
        $item | Add-Member NoteProperty $Matches[1] $Matches[2]
      }
      '^$' {
        if ($item) { $item }
        $item = New-Object PSObject
      }
    }
  }

由于这是一个管道,你可以随意添加更多命令。

答案 1 :(得分:2)

您无法格式化输出,因为它返回字符串数组。相反,您可能会尝试解析它,尽管它更容易保存为csv和import

$out = openfiles /query /s SERVERNAME /fo table
$out | 
    Select-Object -Skip 2 | 
    Foreach-Object { 
        if ($_ -match '([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+(.*)') {
            New-Object PsObject -prop @{
                Id=[int]$matches[1]; 
                AccessedBy=$matches[2]
                Type=$matches[3]
                OpenFile=$matches[4]
            }
        }
    } | 
    Sort-Object OpenFile

(我没有机会测试openfiles)

答案 2 :(得分:2)

刚刚完成此操作后,您可以通过执行以下操作轻松将CSV输出转换为PowerShell对象

$FileList = Invoke-Expression "& C:\Windows\System32\openfiles.exe /query /s SERVERNAME /fo CSV" | 
    ConvertFrom-Csv |
    Select "Accessed By","Open File (Path\executable)"