2016年5月25日水曜日

PowerShellメモ(高速化、参照型変数)

関数を使って、文字列をどんどん連結していったり、ArrayListに値を追加していったり、ということを繰り返して、サイズが大きくなってくると、動作が遅くなってくる。
引数として渡す、戻り値として渡すときに、コピーが行われるからだ。
こういう場合は、参照型変数を使う。

function addArray {
  param( $fileName, [ref]$arrayRef)
  #参照型変数(引数)のValueで使う
  $array = $arrayRef.Value
  $content = Get-Content $fileName

  foreach( $line in $content) {
    if( $line.StartWith( "username")) {
      $array.add( $line)
    }
  }
}
$logArray = New-Object -TypeName ArrayList
$files = Get-ChildItem -Filter *.log
foreach( $oneFile in $files) {
  #参照型として渡すには頭に[ref]をつけて()で囲む
  addArray( $oneFile, ([ref]$logArray))
}

2016年5月7日土曜日

PowerShellメモ(テキストファイル、高速化)

サイズの大きいテキストファイルを扱うとき、Get-Contentを使用すると最初に全部読み込むので読み込み時間がかかって遅い。
そんな場合は、Get-Itemで取得したオブジェクトから、OpenText()でStreamReaderを取得して一行づつ処理する。

$fileItem = Get-Item .\list.txt
$reader = $fileItem.OpenText()
$line = $reader.ReadLine()
while( $null -ne $line) {
  Write-Host $line
   $line = $reader.ReadLine()
}
$reader.Close()

最後のClose()は絶対忘れないこと。