2014年11月28日金曜日

◆検索文字列の前後の行を表示する2

以下で表示したサンプルを最近見直したところ非常に見づらい。
PowerShell: ◆検索文字列の前後の行を表示する(Select-String)

マッチした塊ごとに区切りが欲しいところ。

Select-Stringの機能自体では難しそうなので、区切りを追加するロジックを入れてみた。

001
002
003
004
005
006
007
008
009
010

filter SelStrDlim{
 
$_.context.
precontext
 
">" + $_.
line
 
$_.context.
postcontext
 
"-" * 10
}
Get-Help Get-ChildItem -Full |
 
 
Out-String -Stream  |
  Select-String パイプライン -Context 7,1 |
  SelStrDlim

image

2014年11月11日火曜日

◆more関数のレスポンスタイムを改善する

以下のブログで「more」関数を使うより、「Out-Host  -Paging」を使ったほうが良いよ。
って話が出ている。
Use Out-Host instead of More - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

「more」はパイプライン入力の結果が全て出力されてから処理されるので時間が掛かる。

PS> dir c:\windows -Recurse -ErrorAction SilentlyContinue | more

こんなコマンドを打つとフリーズでもしたような感じになってしまう。

「Out-Host  -Paging」に変えて

PS> dir c:\windows -Recurse -ErrorAction SilentlyContinue | Out-Host  -Paging

で、めでたしめでたしなのだが、やはりここは関数にしてみたい。

単純に考えると、こんな感じ?

001
002
003
004
005
006

Function more2
{
  $input | Out-Host -Paging
}

dir c:\windows -Recurse -ea 0 | more2

と思うのだが、これだと通常の「more」と同じ動作に戻ってしまう。

しからば、こんなん?

001
002
003
004
005
006
007
008
009

Function more2
{
 
process
  {
   
$_ | Out-Host -Paging
  }
}


dir c:\windows -Recurse -ea 0 | more2

ん~、これだと1ファイルごとに表示されてしまい、Pigingも1ファイル毎の指定に解釈されて意味を成していない・・・。

あぁー、なんとなくこのパターンは見覚えがある。
すでに詳細は忘れてしまったが(笑)以下の技が使えそうな気がする。

PowerShell: ◆パイプライン入力・パラメータ入力対応のGridView出力関数を作る

自分で書いていおいて良く思い出せないのだが、適当にまねて作ってみた。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028

function more2
{
  
begin
   {
     
$scriptCmd = {Out-Host  -Paging
 }
     
$steppablePipeline = $scriptCmd.
GetSteppablePipeline()
     
$steppablePipeline.Begin($true
)
   }

  
process
   {
     
try
      {
        
$steppablePipeline.Process($_
)
      }
     
catch
      {
       
break
;
      }
   }

  
end
   {
     
$steppablePipeline.
End()
   }
}


dir c:\windows -Recurse | more2

自信は無いがとりあえずは使い物になりそう。

2014年11月7日金曜日

◆コンピュータの説明を設定する

コンピュータの説明とは以下の部分。

image

 

>$op = gwmi Win32_OperatingSystem
>$op.Description = "仕事用コンピュータ"
>$op.Put()

 

Set-WmiInstanceを使ってもできる。

が、ヘルプを見ると以下のような感じで出来そうなのだが、旨くいかない。

>Set-WmiInstance -Class Win32_OperatingSystem -arguments @{Description="会社のコンピュータ"}

 

Set-WmiInstance : サポートされていないパラメーターです
発生場所 C:\Users\kumagai_mitsugu\AppData\Local\Temp\b67c3bf9-5b3d-4e70-bd99-d0ace79a285f.ps1:1 文字:16
+ Set-WmiInstance <<<<  -Class Win32_OperatingSystem -arguments @{Description="会社のコンピュータ"}
    + CategoryInfo          : InvalidOperation: (:) [Set-WmiInstance]、ManagementException
    + FullyQualifiedErrorId : SetWMIManagementException,Microsoft.PowerShell.Commands.SetWmiInstance

仕方が無いので、とりあえずこんな感じで。

>gwmi Win32_OperatingSystem | Set-WmiInstance -arguments @{Description="会社のコンピュータ"}