Az utolsó tárgyalt parancssori eszköz az OpenFiles. Ezzel az eszközzel a zárolt fájlokat lehet kilistázni. Alaphelyzetben a megosztott fájlokra működik a dolog, át lehet billenteni a parancs üzemmódját, és akkor egy újraindítás után minden zárolt helyi fájl is listázható vele.
Én egyelőre a megosztáson keresztül megnyitott fájlok elérését akarom megjeleníteni. Ha belenézünk az eszköz súgójába, akkor láthatjuk, hogy ennél az eszköznél is rendelkezésünkre áll a CSV kimenet. Válogatva a parancssori kapcsolók között, ezek tűnnek a legpraktikusabbaknak a céljainknak:
PS C:\training> openfiles /query /FO CSV /V
INFO: The system global flag 'maintain objects list' needs
to be enabled to see local opened files.
See Openfiles /? for more information.
Files opened remotely via local share points:
---------------------------------------------
"Hostname","ID","Accessed By","Type","#Locks","Open Mode","Open File (Path\executable)"
"DC","218","Administrator","Windows","0","No Access.","c:\training\"
"DC","219","Administrator","Windows","0","Read","c:\training\"
"DC","230","Administrator","Windows","0","Read","c:\training\append.txt"
A nehezítés az itt, hogy a CSV kimenet nem rögtön kezdődik, hanem van felette egy kis magyarázat, amit el kell nyelni. Erre több módszer lehet, például nézzük csak az idézőjellel kezdődő sorokat. Én azt választottam, hogy a sok kötőjelet tartalmazó sor utáni részt veszem figyelembe. Innen már az eddig alkalmazott módszerekkel léphetünk tovább, azaz a függvénybe ágyazott OpenFiles eszköz immáron megtisztított CSV kimenetét alakítjuk objektummá a ConvertFrom-CSV segítségével:
function Get-OpenFile {
param(
$name = "*",
$mode = "*",
$user = "*",
[switch] $all
)
$pass = $false
openfiles /query /FO CSV /V | ?{$pass; if($_ -match "------------"){$pass = $true}} |
ConvertFrom-Csv |
Select-Object -Property *, @{n="Name";e={$_."Open File (Path\executable)"}} -ExcludeProperty "Open File (Path\executable)", Type, "#Locks" |
?{$_.name -like $name -and
$_."Open Mode" -like $mode -and
$_."Accessed By" -like $user -and
$_."Open Mode" -ne "No Access." -and
($all -or $_.name -notmatch '\\$')
}
}
A beágyazó függvényemnek –name, -mode és –user paramétert lehet megadni. Az -all kapcsolóval engedélyezem, hogy a mappák is látszódjanak, mert amúgy csak a fájlokat szeretném megjeleníteni. A függvényen belül egy picit átalakítom a nagyon csúnya nevű tulajdonságokat, mint például „Open File (Path\executable)”, kicsit egyszerűbbre, mint például „Name”.
A Get-OpenFile függvényem így már egészen PowerShell-szerű kimenetet ad:
PS C:\training> Get-OpenFile | ft -Wrap
Hostname ID Accessed By Open Mode Name
-------- -- ----------- --------- ----
DC 219 Administrator Read c:\training\
DC 230 Administrator Read c:\training\app
end.txt
DC 243 Administrator Write c:\training\loc
k.txt
DC 251 SoosTibor Read c:\training\
DC 269 SoosTibor Write c:\training\nag
ytext.txt
Természetesen ezt is még lehetne fokozni szép formázó PS1XML fájl hozzárendelésével, de ezt már a tisztelt olvasóra bízom.