2014年8月26日火曜日

◆検索文字列をハイライト表示する

環境変数に目的のパスが含まれているか確認したいことは良くあるが、結構なが~いのが普通なので年寄が目視で確認するのはちと辛い。

メモ帳に貼り付けて検索すれば事足りるのだが、やっぱりここはPowerShellでやってみたい。

幸いファイル群から文字列を検索してハイライト表示するスクリプトが以下で公開されていた。
Wes' Puzzling Blog - Powershell script to find strings and highlight them in the output

(通常はこちらのほうが使いでがあると思われる。)

とりあえずこれをそのまま利用させていただいて単純な文字列からのパターン検索に変更した。
やっつけで変更したので中身はほとんど理解していない・・・。

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
029
030
031
032
033
034

function Write-HostAndHighlightPattern(
  
[string] $pattern = ""
  , [string] $inputtext = ""
  , [switch] $caseSensitive = $false
)
{

 
if ($pattern -eq $null -or $pattern -eq ""
) { 
   
Write-Error "Please provide a search pattern!" ; return
 }

 
$regexPattern = $pattern
  if($caseSensitive -eq $false) { $regexPattern = "(?i)$regexPattern"
 }
 
$regex = New-Object System.Text.RegularExpressions.Regex $regexPattern

  $index = 0
  while($index -lt $inputText.
Length)
  {
   
$match = $regex.Match($inputText, $index
)
   
if($match.Success -and $match.Length -gt 0
)
    {
     
Write-Host $inputText.
SubString(
       
$index, $match.Index - $index) -nonewline
      Write-Host $match.Value.ToString() -Foreground Red -nonewline
      $index = $match.Index + $match.
Length
    }
   
else
    {
     
Write-Host $inputText.SubString($index) -nonewline
      $index = $inputText.
Length
    }
  }
}


Write-HostAndHighlightPattern "system32" $env:path

結果

image

2014年8月22日金曜日

◆Measure-Objectで日付型のMAXは取得できない

WindowsUpadateの最終更新日を取得する。

Get-HotFix | Measure -Maximum -Property InstalledOn

てな感じで取得できそうな気がする。(実際、Windows8では取得できる)

しかし、Windows7では以下のようなエラーが・・・。

image

えぇー、数値しか駄目なの(><)

仕方がないので力技(一旦数値に変換してから戻す)

PS>[datetime][long]((Get-HotFix | select {($_.installedon).ticks} | measure -Maximum -Property '($_.installedon).ticks').Maximum)

まだ、以下のほうが良いか

PS>(Get-HotFix | sort installedon -Des | select -First 1).InstalledOn

ちゃんとやっている方もいらっしゃる
Measure-Latest: finding latest date/time | Dmitry's Blog: Cloud, PowerShell and beyond

 

Windows8が大コケしたおかげで、PowerShellも2.0がまだまだ幅を利かせてしまうので、ちょっと悩ましい。

2014年8月20日水曜日

◆変数の値解決?

ネットで見かけた質問で以下のようなものがあった。

$drive = ""
$cmd = "dir $drive"
$drives = "c:","d:"

foreach($drive in $drives)
{
    Invoke-Expression $cmd
}

なんとなく眺めるとうまくいくような気もする。

Invoke-Expressionをやめて単純に$cmdを表示させると、

PS>$drive = ""
$cmd = "dir $drive"
$drives = "c:","d:"

foreach($drive in $drives)
{
    $cmd
}

-- 以下、結果--

dir
dir

 

これまた意外と嵌れば嵌るのかもね・・・っと思ったり。

要は2行目の、
$cmd = "dir $drive"

のときに、$driveは値解決されちゃうので$cmdの中身は”dir”になっちゃう。

どうすれば良いんですかね・・・。

こんな感じ?

$drive = ""
$cmd = "dir {0}"
$drives = "c:","d:"

foreach($drive in $drives)
{
    Invoke-Expression ($cmd -f $drive)
}


もしかして、こんなのがスマートか?

$drive = ""
$cmd = {dir $drive}
$drives = "c:","d:"

foreach($drive in $drives)
{
   
   & $cmd
}

2014年8月13日水曜日

◆嵌る

ここ数ヶ月、火を噴いている突発的な仕事のお手伝いで忙しく、PowerShellともご無沙汰。

だいぶ老化が進んでいるのでちょっと使っていないとすぐに忘れる。
なんとか過去の投稿を見たりして思い出していかないと・・・。


以下のような何の変哲もないコマンドを打ったところ、
image

結果がこんな感じに表示された。
image

?、なんで?

これは、
image

ちゃんと表示される。
image

scriptpropertyだから?なんて思って「types.ps1xml」なんかを見てみても特に「CPU」が特別という事は無い。

しば~らく考えたが、全く持って検討も付かない。

ふと、こんな感じに入力してみたら、
image

あれ、表示された。
image

あ~、そう。
いや~、素人丸出し?

こいつの結果って、
image

こうなっちゃってるのね・・・。
image

あ~、もう、ヘッダーが見えない時点で気づこうよ(笑)

全く持って余計なところで時間をくってしまったが、やりたかったのは以下のようなスクリプト。
image

むか~し、以下で書いたことはあるのだが、どうも今まで有効に使ってこなかった気がする。
PowerShell: ◆カスタマイズした条件を使ってグルーピングする(Group-Object)

ハッシュテーブル化する方法は便利そうなので、忘れないようにしたい。
っと言っても忘れるのだが・・・。(笑)

----

ちなみに、そもそも今回の嵌りは画面の表示サイズとバッファサイズをずらしたのがいけないのだと思います。

image

2014年8月7日木曜日

◆Windows Automation Snapin for PowerShell(メモ)

WASPなんてのが有ったのでメモしておく。

以下のようなWindow操作関連のコマンドレットを提供してくれるようです。

Get-WindowPosition
Remove-Window
Select-ChildWindow
Select-Control
Select-Window
Send-Click
Send-Keys
Set-WindowActive
Set-WindowPosition

一応インストーラも付いてくるのですが、Windows7環境ではなぜか旨くいかなかったので(3.0が必要?)、展開された「WASP.dll」をマイドキュメントにある「WindowsPowerShell」フォルダに「Module\WASP」フォルダを作ってあげてその中に入れてあげると良さそう。

使うときは「ipmo WASP」とやってあげればOK。