PowerShellで半角カタカナを全角カタカナに変換してみる

| 2009年4月27日月曜日
必要になったので…
使い方:
> ConvertTo-HankakukatakanaFromZenkakukatakana "デジタルハイビジョンテレビ"

--- ConvertTo-HankakukatakanaFromZenkakukatakana.ps1 ---

  1. function ConvertTo-HankakukatakanaFromZenkakukatakana([string]$value) {
  2. $zenkakukatakana = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛゜ァィゥェォャュョッ"
  3. $hanakakukatakana = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゙゚ァィゥェォャュョッ"
  4. $dakutenZenkakukatakana = "ガギグゲゴザジズゼゾダヂヅデドバビブベボ"
  5. $dakutenHankakukatakana = "カキクケコサシスセソタチツテトハヒフヘホ"
  6. $handakutenZenkakukatakana = "パピプペポ"
  7. $handakutenHankakukatakana = "ハヒフヘホ"
  8. for ($i = 0; $i -lt $dakutenZenkakukatakana.Length;$i++) {
  9. $value = $value.Replace($dakutenHankakukatakana[$i] + "゙", $dakutenZenkakukatakana[$i])
  10. }
  11. for ($i = 0; $i -lt $handakutenZenkakukatakana.Length; $i++) {
  12. $value = $value.Replace($handakutenHankakukatakana[$i] + "゚", $handakutenZenkakukatakana[$i])
  13. }
  14. for ($i = 0; $i -lt $zenkakukatakana.Length; $i++) {
  15. $value = $value.Replace($hanakakukatakana[$i], $zenkakukatakana[$i])
  16. }
  17. return $value
  18. }

PowerShellでゴミ箱を操作するには

| 2009年3月18日水曜日
まずは、準備。
> $shell = New-Object -comObject Shell.Application
> $shell.NameSpace(10)

Title                      : ごみ箱
Application                : System.__ComObject
Parent                     :
ParentFolder               : System.__ComObject
Self                       : System.__ComObject
OfflineStatus              :
HaveToShowWebViewBarricade : False
ShowWebViewBarricade       : False

ゴミ箱の中のファイル数を取得する。
> $shell.NameSpace(10).Items().Count

3

ごみ箱の中のファイル名の一覧を取得する。
> $shell.NameSpace(10).Items() | % { $_.Name }

新規 Microsoft Office Word 文書.docx
新しいテキスト ドキュメント.txt
新規 Microsoft Office Excel ワークシート.xlsx

一つ目のファイルの情報を取得する。ここでは、$itemに入れている。
> $item = $shell.NameSpace(10).Items().Item(0)
> $item

Application  : System.__ComObject
Parent       : System.__ComObject
Name         : 新規 Microsoft Office Word 文書.docx
Path         : C:\$Recycle.Bin\S-1-5-21-2464054850-802308169-2795062852-1001\$R95HRWN.docx
GetLink      :
GetFolder    : System.__ComObject
IsLink       : False
IsFolder     : False
IsFileSystem : True
IsBrowsable  : False
ModifyDate   : 2009/03/18 21:07:06
Size         : 0
Type         : Microsoft Office Word 文書

上記だけでは、ファイル自身の情報が今一わからないのでGetDetailsOfを使ってもっと細かい情報を取得する。
GetDetailsOfで取得できる情報は、ごみ箱を開いた時に表示される列の順なので、0から順に9列目まで取得する。
> 0..8 | % { $shell.NameSpace(10).GetDetailsOf( $item, $_ ) }

新規 Microsoft Office Word 文書.docx
C:\Test
 2009/ 03/ 18   21:07
0 バイト
Microsoft Office Word 文書
 2009/ 03/ 18   21:07
 2009/ 03/ 18   21:07
 2009/ 03/ 18   21:07
A

ゴミ箱からファイルを削除する。
> Remove-Item $item.Path

指定したファイルを元に戻す、元の場所じゃなくてもいいけど。
> Move-Item $item.Path ( Join-Path $shell.NameSpace(10).GetDetailsOf( $item, 1 ) $item.Name )

PowerShellでPDFのサイズを取得する。

| 2009年3月4日水曜日
PDFの扱うために、iTextSharpからitextsharp-4.1.2-dll.zipを落としてくる。
itextsharp.dllが入っているので適当な場所に配置する。

PowerShellからitextsharp.dllのあるフォルダでDLLを読み込む。

> [System.Reflection.Assembly]::LoadFrom(( Join-Path $pwd itextsharp.dll))

GAC    Version        Location
---    -------        --------
False  v1.1.4322      C:\itextsharp-4.1.2-dll\itextsharp.dll

これで準備ができたので、PdfReaderを使ってサイズを取得したいPDFファイルを読み込む。

> $pdfReader = New-Object iTextSharp.text.pdf.PdfReader(( Join-Path $pwd foo.pdf))

1ページめのサイズを取得する。

> $pdfReader.GetPageSize(1)

Type               : 30
Chunks             : {}
Top                : 841.875
Border             : -1
GrayFill           : 0
Left               : 0
Right              : 595.275
Bottom             : 0
BorderColorBottom  :
BorderColorTop     :
BorderColorLeft    :
BorderColorRight   :
Width              : 595.275
Height             : 841.875
BorderWidth        : -1
BorderColor        :
BackgroundColor    :
Rotation           : 0
BorderWidthLeft    : -1
BorderWidthRight   : -1
BorderWidthTop     : -1
BorderWidthBottom  : -1
UseVariableBorders : False

このファイルのページサイズは、

>$pdfReader.GetPageSize(1).Height #高さ
841.875
>$pdfReader.GetPageSize(1).Width #幅
595.275

このファイルはA4縦なわけだけど、数字だけみてもわからないのでiTextSharpで定義されているA4縦と比較する。
定義されているA4縦はこれでわかる。

> [ITextSharp.text.PageSize]::A4

Top                :
Border             :
GrayFill           :
Left               :
Right              :
Bottom             :
BorderColorBottom  :
BorderColorTop     :
BorderColorLeft    :
BorderColorRight   :
BorderWidth        :
BorderColor        :
BackgroundColor    :
BorderWidthLeft    :
BorderWidthRight   :
BorderWidthTop     :
BorderWidthBottom  :
UseVariableBorders :
Type               : 30
Chunks             : {}
Width              : 595
Height             : 842
Rotation           : 0

上記の値を使って、ファイルのページサイズをint型にキャストして比較する。

> [iTextSharp.text.PageSize]::A4.Height -eq [int]$pdfReader.GetPageSize(1).Height
True

ちなみに、A4横の高さと幅を得るには、

> [iTextSharp.text.PageSize]::A4.Rotate().Height #高さ
595

> [iTextSharp.text.PageSize]::A4.Rotate().Width #幅
842

で、取得できる。

PowerShellでStringTemplateを使ってみる

| 2009年1月29日木曜日
まず、StringTemplateのサイトからDLLを落としてくる。

その中から、
・ antlr.runtime.dll
・ StringTemplate.dll
の二つを、適当なフォルダにコピーしておく。

テンプレートファイルはfoo.stというファイル名で
foo : $foo$
みないなのを作る。

先ほど、コピーした二つのファイルとfoo.stのあるフォルダで下記を実行する。

> [void][System.Reflection.Assembly]::LoadFrom(( Join-Path $pwd StringTemplate.dll))
> $sr = New-Object System.IO.StreamReader(
>> ( Join-Path $pwd foo.st ) ,
>> [System.Text.Encoding]::GetEncoding("shift-jis"))
>>
> $t = New-Object antlr.StringTemplate.StringTemplate($sr.ReadToEnd())
> $sr.Close()
> $t.SetAttribute("foo","テスト")
> $t.ToString()

結果:

foo : テスト

みたいに返ってくる。

PowerShellでリモートのイベントログを取得する

| 2008年12月3日水曜日
PowerShellでサーバーのイベントログを取得する必要があったので試してみた。

> $e = New-Object System.Diagnostics.EventLog
> $e.Log = "application"
> $e.MachineName = "RemoteServerName"  #リモートのサーバー名を指定する
> $e.Entries

Index Time          Type Source                EventID Message
----- ----          ---- ------                ------- -------
  886 9 04 11:30    Info Windows Search Se...     1013 Windows Search サービスが正常に停止しまし...
  887 9 04 11:30    Info Service1                    0 サービスが正常に終了しました。

ついでに、CSVに出力
> $e.Entries | Export-Csv -Encoding default application.csv

文字コードを変えてあげないと、開いた時に文字化けする・・・

PowerShellでExcel操作した時に残るプロセスについて

| 2008年10月17日金曜日
PowerShellでExcelを操作するとプロセスが残ってしまっていました。
ComObjectなので最後までちゃんと面倒見てあげてなかったのが原因です。

Excel Cook Book in Windows PowerShellにちゃんと廃棄してあげるようにRelease-Refが紹介されていました。

$excel.Quit() した後に、この関数に今まで参照していた$excel、$workBooks、$workSheet、$rengeなどを渡してあげると、無事逝ってくれます。

これを知るまで、Stop-Prosess -Name "EXCEL"で皆殺しにしていたので・・・
これで、すっきりしました。

PowerShellでExcelの値を取得してXMLにしてみる

| 2008年10月5日日曜日

foo.xlsが右の見たいなのとして
 









foo.ps1 > foo.xml
で
<?xml version="1.0" encoding="utf-8"?>
<excel>
  <data>
    <date>2008/1/1</date>
    <foo>1</foo>
    <bar>12</bar>
    <baz>100</baz>
  </data>
  ・
  ・
  ・
</excel>
見たいにしてみる。

--- foo.ps1 ---

  1. $filePath = Get-ChildItem foo.xls*  
  2. $excel = New-Object -comobject Excel.Application  
  3. $workBooks = $excel.Workbooks.Open($filePath)  
  4. #Sheet1を取得する  
  5. $workbooks.Worksheets | % { if ($_.Index -eq 1) { $sheet = $_; }}  
  6. @" 
  7. <?xml version="1.0" encoding="utf-8"?> 
  8. <excel> 
  9. "@  
  10.   
  11. foreach($i in 2..13) {  
  12.  $d = $sheet.Cells.Item($i,1).Text;  
  13.  $foo = $sheet.Cells.Item($i,2).Text;  
  14.  $bar = $sheet.Cells.Item($i,3).Text;  
  15.  $baz = $sheet.Cells.Item($i,4).Text;  
  16. @" 
  17.   <data> 
  18.     <date>$d</date> 
  19.     <foo>$foo</foo> 
  20.     <bar>$bar</bar> 
  21.     <baz>$baz</baz> 
  22.   </data> 
  23. "@  
  24.   
  25. }  
  26. @" 
  27. </excel> 
  28. "@  
  29.   
  30. $workBooks.Close()  
  31. $excel.Quit()