Windows_PowerShell_iconjest kilka takich narzędzi commanline w Linux, których braqje w Windows. jednym jest ‘du’ czyli Disk Usage liczący wielkość katalogu. to można sobie łatwo oprogramować:

(ls -r -force <dir> -ea silentlycontinue|measure -property length -sum).sum/1GB

to oczywiście na szybko, można to upiększać, dodać skrypt dostępny globalnie – prościzna. drugim bardzo często narzędziem, z którego często korzystałem było ‘locate’. w Linuxie super przydatne głównie z tego powodu, że każde distro się różni i pliki są rozpizgane po setkach katalogów. Linuxowa masakra. ale locate przeważnie jest a to poważnie ułatwia życie. idea jest taka sama jak w Windows – działa sobie indexer, który skanuje katalogi i tworzy indexy dla pliqw. można go wymusić do odświeżenia przy pomocy ‘updatedb’. w Windows jest ‘Windows Search’, czyli WSearch [w wXP był Indexing Service]. problem polega na tym, że nie ma standardowych narzędzi commandline. co prawda jest od jakiegoś czasu moduł WindowsSearch ale służy wyłącznie do konfiguracji usługi. w starym Windows Desktop Search był trick na skorzystanie z linii poleceń. jeśli jest w nowej wersji – nie znam go.

oczywiście jest API. a to daje możliwość oprogramowania sobie searcher. doqmentacja dot. tworzenia zapytań jest na MSDN. a przykładowy draft skryptu tu:

locate-File.ps1

<#
.SYNOPSIS
  locate function to quickly find files using windows search index
.NOTES
  author: nExoR 2o14
  version: 03.11.2o14
.IDEAS
    add search parameters:
     - search for file contents
     - only in specyfic files [doc/pdf]
.EXAMPLE
    locate-file *hidden*.ps1
.LINK
  https://w-files.pl
  http://blogs.technet.com/b/heyscriptingguy/archive/2010/05/30/hey-scripting-guy-weekend-scripter-using-the-windows-search-index-to-find-specific-files.aspx
  https://msdn.microsoft.com/en-us/library/bb231256%28v=VS.85%29.aspx
#>

param(
  [parameter(mandatory=$true)][string]$fileName,
  [int]$pageSize=20000
)

$fileName=$fileName.Replace('*','%')
$query = "SELECT `
    System.ItemName, system.ItemPathDisplay, System.ItemTypeText,System.DateCreated,System.DateModified,`
    System.FileAttributes,System.FileOwner,System.Size `
        FROM SystemIndex where system.fileName LIKE '$fileName'"

#https://social.technet.microsoft.com/Forums/scriptcenter/en-US/c262d5de-da6b-4e9e-9aab-2965f3109b8a/vbs-looking-for-script-to-change-windows-search-property?forum=ITCG        
$ADOCommand = New-Object -ComObject adodb.command
$ADOConnection = New-Object -ComObject adodb.connection
$RecordSet = New-Object -ComObject adodb.recordset
$ADOConnection.open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';")
$RecordSet.pageSize=$pageSize
$RecordSet.open($query, $ADOConnection)
Try { $RecordSet.MoveFirst() }
Catch [system.exception] { "no records returned" }
while(-not($RecordSet.EOF))
{
  if($locatedFile){Remove-variable locatedFile}
  $locatedFile=new-object -typeName PSObject
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Name' -Value ($RecordSet.Fields.Item("System.ItemName")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Path' -Value ($RecordSet.Fields.Item("System.ItemPathDisplay")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Type' -Value ($RecordSet.Fields.Item("System.ITemTypeText")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'DateCreated' -Value ($RecordSet.Fields.Item("System.DateCreated")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'DateModified' -Value ($RecordSet.Fields.Item("System.DateModified")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'FileAttributes' -Value ($RecordSet.Fields.Item("System.FileAttributes")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'FileOwner' -Value ($RecordSet.Fields.Item("System.FileOwner")).value
  add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Size' -Value ($RecordSet.Fields.Item("System.Size")).value
  $locatedFile
 $RecordSet.MoveNext()
}

$RecordSet.Close()
$ADOConnection.Close()
$RecordSet = $null
$ADOConnection = $null
[gc]::collect()

to oczywiście wersja robocza. proof of concept. napisane tak, żeby zwracało ładne obiekty. ogólna idea to podłączenie się do bazy zawierającej indexy przy pomocy ADO i wykonanie kwerendy. wyniki podawane są niemal natychmiast tylko trzeba pamiętać, że są tam wyłącznie katalogi zindexowane – jeśli chcemy móc wyszukiwać po całym dysq, to trzeba dodać cały dysk do indexowania…

…a jeśli nie zależy nam na czasie to można szukać ‘po staremu’:

ls <dir> -r -force -ea silentlycontinue <file-to-search>

eN.

 

 

Spread the love

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.