我正在尝试'动态'格式化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事情。
答案 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)"