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

で、取得できる。