2012年1月30日月曜日

◆コンソール出力に下線(アンダーライン)を引く

以下を参考にアンダーラインを引くサンプルを作って見ました。
固定ピッチフォントの環境じゃないとずれてしまうような気はしますが・・・。

Multiply PowerShell Strings to Customize Text Underlines - Hey, Scripting Guy! Blog - Site Home - TechNet Blogs

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022

Function New-Underline
{
 
[CmdletBinding()]
  param
(
     
[Parameter(Mandatory = $true,Position = 0,valueFromPipeline=$true)]
      [string]
      $stringIN,
      [string]
      $char = " ̄"
  )
 
$encSjis = [System.Text.Encoding]::GetEncoding("Shift-JIS"
)
 
$x = $encSjis.GetByteCount($stringIN
)
 
$y = $encSjis.GetByteCount($char
)
 
$underLine = $char * ([Math]::Ceiling($x / $y
))

 
Write-Host $stringIn
  Write-Host $underLine -ForegroundColor Red
} 

New-Underline "abcd" -char "-"
New-Underline 
"原辰徳"
"AAAAA"
 | New-Underline

image

2012年1月20日金曜日

◆CSVの項目を数値としてソートする

こんなCSVファイルが有ったとして、

PS>Import-Csv test.txt

id     name    
--     ----    
3      sato    
5      suzuki  
13     yosida  
1      hara    
11     kubo    

これをidでソートすると、

PS>import-csv test.txt | sort id

id    name
--    ----
1     hara
11    kubo
13    yosida
3     sato
5     suzuki

文字列として解釈されているので、ちょっと残念な結果になってしまう。

こういう時は、PowerShell: ◆ソートのカスタマイズで使ったのと同じ方法で集計プロパティを使うと良い。

PS>Import-Csv test.txt | sort @{e={$_.id -as [int]}}

id    name   
--    ----   
1     hara   
3     sato   
5     suzuki 
11    kubo   
13    yosida 

2012年1月18日水曜日

◆グループ化して明細出力

グループ化というとどうしてもGroup-Objectコマンドレットを使ってしまいがちだが、

001
002
003
004

gsv | group status | %{
 
Write-host $_.name ("-" * 20) -ForegroundColor Green
  $_.group | select -expandprop name
}

image

Format-Tableコマンドレットなどにもグループ化機能があるので、そちらを使ったほうが便利な時もありそうだ。

001
gsv | sort status,name | ft name -GroupBy status

image

2012年1月6日金曜日

◆イメージファイルを変換する

イメージファイルのフォーマットを変換する関数を作って見ました。

とりあえず、bmp、jpg、pngに対応していますが、以下の種類に対応可能なようなので、
ImageFormat メンバ
必要に応じてパラメータを増やすか、上記メンバーを直接指定するように変更すると良いでしょう。

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

function Convert-Image
{
 
[CmdletBinding(DefaultParametersetName="png")]
 
 
param
(
   
[parameter(Mandatory=$true)]
    [ValidateScript({Test-Path $_})]
    $path,
    [Parameter(ParameterSetName="bmp")]
 
   
[switch]$ToBmp,
    [Parameter(ParameterSetName="jpeg")]
 
   
[switch]$ToJpg,
    [Parameter(ParameterSetName="png")]
 
   
[switch]$ToPng
  )
 
 
$toimage = [System.Drawing.Imaging.ImageFormat]::($PsCmdlet.
ParameterSetName)
 
dir $path | %
{
   
$fname = $_.
fullname
   
$newExtension = "." + $PsCmdlet.
ParameterSetName
   
if($_.Extension -eq $newExtension){"not target:$($_.Extension)";exit
}
   
$newFileName =
 
     
$fname -replace $_.Extension , $newExtension
    $img = new-object system.drawing.bitmap $fname
    $img.save($newFileName,$toimage
)
   
$img.
Dispose()
   
Remove-Item $fname -Confirm
  }
}


Convert-Image  -path d:\Desktop\*.png -ToBmp