Формат-таблица вывода из openfiles.exe - PullRequest
1 голос
/ 16 марта 2012

Я пытаюсь «на лету» отформатировать вывод openfiles.exe вместо сохранения вывода в файл CSV и его импорта.Если я просто запускаю openfiles /query /s SERVERNAME /fo table, я получаю

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

Теперь я хочу отсортировать результаты «на лету» или «Открыть файл», чтобы я попробовал openfiles /query /s SERVERNAME /fo table | Format-Table "Accessed By","Open File (Path\executable)" -auto, который просто выплевывает то же самое, что ипервая команда.В идеале я хочу только «Доступ к» и «Открыть файл (путь \ исполняемый файл)» и просто иметь возможность сортировать их по одному.Я стараюсь избегать дел с CSV.

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

Это немного сложно, поскольку openfiles не является командлетом PowerShell.Он просто отображает свои данные в таблице, но это не объекты, которые он возвращает.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
      }
    }
  }

Так как это конвейер, вы можете добавлять другие команды в конце по желанию.*

2 голосов
/ 29 августа 2014

После этого вы можете легко преобразовать выход CSV в объект PowerShell, выполнив следующие действия:

$FileList = Invoke-Expression "& C:\Windows\System32\openfiles.exe /query /s SERVERNAME /fo CSV" | 
    ConvertFrom-Csv |
    Select "Accessed By","Open File (Path\executable)"
2 голосов
/ 16 марта 2012

Вы не можете отформатировать вывод, потому что он возвращает массив строк. Вместо этого вы можете попытаться разобрать его, хотя imho проще сохранить как csv и импортировать

$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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...