Tuesday, October 14, 2008
コマンドレット名


Get-Content

エイリアス


gc
cat
type


説明


-path または -literalPath パラメータに指定した項目の内容を読み取ります。
一度に1行の内容を読み込み、それぞれの行オブジェクトを返します。

書式


Get-Content [-path] <string[]>または[-literalPath] <string[]> [-totalCount] <long[]> [-readCount] <long[]> [-include <string[]>] [-exclude <string[]>] [-filter <string>] [-force] [-credential <PSCredential>] [-encoding] { <Unknown> | <String> | <Unicode> <Byte> | <BigEndianUnicode> <UTF8> | <UTF7> | <Ascii> |} [<CommonParameters>]

パラメータ
-path <string[]>


読み込みを行う項目のパスを指定します。パスにはワイルドカードを指定することができます。またカンマで区切ることで複数の項目を1度に読み込むことができます。


各サンプルで使用しているファイルは「サンプルで使用するテキストファイル」を参照ください


–––––––––– -Path パラメータの使用例1 ––––––––––


PS > PS C:\Work> Get-Content -Path "Test1.txt"
ABC
DEF
GHI


このコマンドを実行すると Test1.txt の内容を読み込んで表示します。


–––––––––– -Path パラメータの使用例2 ––––––––––


PS > PS C:\Work> Get-Content -Path "Test1.txt","Test2.txt"
ABC
DEF
GHI
JKL


このコマンドを実行すると Test1.txt と Test2.txt の内容を読み込んで表示します。
このように複数のファイルを一度に読み込んだ場合にはファイルの内容が連結された状態で表示されますので、どこまでがどのファイルの内容なのかを判断することはできませんので注意が必要です。


–––––––––– -Path パラメータの使用例3 ––––––––––


PS C:\Work> Get-Content -Path "Test*.txt"
ABC
DEF
GHI
JKL
ABC
DEF
GHI
SAMPLE1


このコマンドを実行すると、C:\Work内にある ファイル名の先頭が "Test" 拡張子が "txt"のファイルすべてを読み込んで表示します。
ただし、-Pathパラメータはエスケープ文字を含むファイルを取り扱うことはできないため、"Test`t.txt" のようなフィル名のデータは読み込むことができません。この場合は-literalPathパラメータを使用します。
この例では C:\Work 内に Test1.txt, Test2.txt, Test`t.txt, Test[1].txt のファイルを準備して実行したのですが"Test1.txt"のファイルが2度読み込まれるという現象が発生しています。
これは、フォルダ内に Test[1].txt というファイルが存在するため、このファイル名が-Pathパラメータに渡されたのが原因です。このことからワイルドカードを使用した読み込みには注意が必要です。


–––––––––– -Path パラメータの使用例4 ––––––––––


PS > PS C:\Work> Get-Content -Path "Test[1].txt"
ABC
DEF
GHI


このコマンドを実行すると Test1.txt の内容を読み込んで表示します。これは"Test[1].txt"の"[]"がワイルドカードとして認識されたためです。
ファイル名が"Test[1].txt"というファイルの読み込みを行う場合は-literalPath パラメータを使用します。


–––––––––– -Path パラメータの使用例5 ––––––––––


PS C:\Work> Get-Content -Path 'Test`t.txt'
SAMPLE1


このコマンドを実行すると、エスケープ文字列を含むファイル"Test`t.txt"の内容を読み込んで表示します。
エスケープ文字列を含むファイルを読み込む場合は、指定するパスを一重引用符で括る必要がありますので注意してください。(二重引用符で括った場合はエラーとなります)


-literalPath <string[]>


読み込みを行う項目のパスを指定します。-Pathパラメータと違ってパスにはワイルドカードを指定することができません。その代わり、
エスケープ文字を含むパスを指定することが可能です。エスケープ文字を含むパスを指定する場合は -literalPath パラメータを使用します。(PowerShellでは`(アクサングラーブ文字)がエスケープ文字として扱われます。)


–––––––––– -literalPath パラメータの使用例1 ––––––––––


PS > PS C:\Work> Get-Content -literalPath "Test1.txt"
ABC
DEF
GHI


このコマンドを実行すると Test1.txt の内容を読み込んで表示します。


–––––––––– -literalPath パラメータの使用例2 ––––––––––


PS > PS C:\Work> Get-Content -literalPath "Test1.txt","Test2.txt"
ABC
DEF
GHI
JKL


このコマンドを実行すると Test1.txt と Test2.txt の内容を読み込んで表示します。
このように複数のファイルを一度に読み込んだ場合にはファイルの内容が連結された状態で表示されますので、どこまでがどのファイルの内容なのかを判断することはできませんので注意が必要です。


–––––––––– -literalPath パラメータの使用例3 ––––––––––


PS C:\Work> Get-Content -literalPath 'Test`t.txt'
SAMPLE1


このコマンドを実行すると、エスケープ文字列を含むファイル"Test`t.txt"の内容を読み込んで表示します。
エスケープ文字列を含むファイルを読み込む場合は、指定するパスを一重引用符で括る必要がありますので注意してください。(二重引用符で括った場合はエラーとなります)


–––––––––– -literalPath パラメータの使用例4 ––––––––––


PS > PS C:\Work> Get-Content -literalPath "Test[1].txt"
SAMPLE1


このコマンドを実行すると Test[1].txt の内容を読み込んで表示します。これは"Test[1].txt"の"[]"がワイルドカードとして認識されずにファイル名の一部として認識されたためです。
"[]"をワイルドカードとして取り扱うには-Path パラメータを使用します。


-totalCount <long>


内容を何行読み込むかを指定します。規定値は-1となっており、すべての行を読み込みます。


–––––––––– -totalCount パラメータの使用例1 ––––––––––


PS C:\Work> Get-Content -Path "Test1.txt" -TotalCount 1
ABC


このコマンドを実行すると、Test1.txtファイルの内容を1行だけ読み込んで表示します。
-readCount <long>


パイプライン経由で一度に遅れる行数を指定します。規定値は0ですべての行を送ります。

ReadCount の値を大きくすると、最初の行を返すまでの時間は長くなりますが、処理全体の時間が短くなります。


–––––––––– -readCount パラメータの使用例1 ––––––––––


PS C:\Work> Get-Content -Path "Test1.txt" -ReadCount 1 | %{Write-Host $_}
ABC
DEF
GHI


このコマンドを実行すると、Test1.txtファイルの内容を1行ずつパイプライン経由で送り、コンソールへ出力します。


–––––––––– -readCount パラメータの使用例2 ––––––––––


PS C:\Work> Get-Content -Path "Test1.txt" -ReadCount 2 | %{Write-Host $_}
ABC DEF
GHI


このコマンドを実行すると、Test1.txtファイルの内容を2行ずつパイプライン経由で送り、コンソールへ出力します。
2行ずつ渡すので、受け取ったデータは2行分を1度に表示します。


-include <string[]>


-includeパラメータは、-pathパラメータで指定した項目の中から、対象を絞り込みます。
"*.txt"などパス要素やパターンを指定します。


–––––––––– -include パラメータの使用例1 ––––––––––


PS > Get-Content -Path "*.txt" -Include "Test1*.txt"


このコマンドレットは、-pathパラメータで指定した拡張子"*.txt"の中でも特に"Test1*.txt"のファイルを読み込みます。


-exclude <string[]>


-excludeパラメータは、-pathパラメータで指定した項目の中から、項目を除外します。
"*.txt"などパス要素やパターンを指定します。


–––––––––– -exclude パラメータの使用例1 ––––––––––


PS > Get-Content -Path "*.txt" -Exclude "Test1*.txt"


このコマンドレットは、-pathパラメータで指定した拡張子"*.txt"の中でも特に"Test1*.txt"以外のファイルを読み込みます。


-filter <string>


PS > Get-Content -Path "*.txt" -filter "test*.txt"


このコマンドレットは-includeパラメータ同様、-filterパラメータによって対象となるファイルを"test*.txt"に限定します。
-filterパラメータは、ほかのパラメータよりも効率がよいとされています。これは-includeパラメータや-excludeパラメータは、オブジェクト取得後にフィルタをするのですが、-filterパラメータは取得する時点でフィルタをかけるためです。


-encoding


読み込みに使用するエンコードを指定します。使用可能な文字エンコードの種類は Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii です。


Get-Content -Path Test1.txt -Encoding "UTF8"


このコマンドは Test1.txt を UTF8で読み込みます。


サンプルで使用するテキストファイル


使用例で使っているファイルは下記の通りで、C:\Workというフォルダに保存してあるものとします。


Test1.txt
ABC
DEF
GHI


Test2.txt
JKL


Test`t.txt
SAMPLE1


Test[1].txt
SAMPLE2
Tuesday, October 14, 2008 10:39:49 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Tuesday, October 07, 2008

今日はInvoke-Historyコマンドレットについてまとめてみました。

コマンドレット名
Invoke-History

エイリアス
ihy
r

説明
コマンド実行履歴からコマンドを実行します。Get-History コマンドレットを使用して取得したコマンドを Invoke-History に渡すか、コマンド実行履歴のIDを指定して実行を行います。

下記のように、パラメータなしで Invoke-History コマンドレットを実行すると、最新のコマンドを実行します。

PS > Invoke-History

書式
Invoke-History [[-iD] <string>] [-whatIf] [-confirm] [<CommonParameters>]

パラメータ
-iD <string>
履歴内のコマンドを実行します。履歴のIDを指定するか、コマンドの先頭文字をいくつか指定します。
文字を入力した場合は、最新の履歴から一致するものを探して実行します。
ID番号を指定する場合、Get-History コマンドレットで確認することができます。

–––––––––– -iD パラメータの使用例1 ––––––––––

PS > Invoke-History -id 1

このコマンドを実行すると、Get-History コマンドレットで確認可能な履歴のIDが1のコマンドを実行します。

–––––––––– -iD パラメータの使用例2 ––––––––––

PS > Get–History

  Id CommandLine
  – –––––––––––
   1 Get–Help Invoke–History –Detailed
   2 Get–History
   3 Get–Help Invoke–History –Detailed
   4 Get–Help Invoke–History –Detailed
   5 cls
   6 Get–History
   7 Get–ChildItem
   8 Dir
   9 Get–Content C:\Work\Test.txt

PS > Invoke–History –iD cl

はじめに Get-History コマンドレットで現時点までの履歴を確認しています。
次に、Invoke-History コマンドレットで-iD パラメータに文字 "cl"を指定すると、IDが5のコマンド "cls"がヒットするので、 clsコマンドを実行します。

Tuesday, October 07, 2008 11:18:56 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Monday, October 06, 2008

今日は、Get-Historyコマンドレットについてまとめてみました。

コマンドレット名

Add-History

エイリアス

なし

説明

現在のコマンド実行履歴に指定した履歴(HistoryInfoオブジェクト)を追加します。
指定可能なデータには Get-History コマンドレットの結果、Import-Clixml、または Import-Csv の HistoryInfo オブジェクトがあります。

書式

Add-History [[-inputObject] <PSObject[]>] [-passThru] [<CommonParameters>]

パラメータ
-inputObject <PSObject[]>
現在のコマンド実行履歴に指定した履歴(HistoryInfoオブジェクト)を追加します。
指定可能なデータには Get-History コマンドレットの結果、Import-Clixml、または Import-Csv の HistoryInfo オブジェクトがあります。

 

–––––––––– -inputObject パラメータの使用例1 ––––––––––
PS > Add-History (Get-History)
このコマンドを実行すると、Get-History コマンドレットの結果を現在の履歴に追加します。
–––––––––– -inputObject パラメータの使用例2 ––––––––––
PS > Get-History | Export-CSV C:\Work\History.csv
PS > Import-CSV C:\Work\History.csv | Add-History
このコマンドを実行すると、History.csvに格納された履歴を現在の履歴に追加します。
–––––––––– -inputObject パラメータの使用例3 ––––––––––
PS > Get-History | Export-Clixml C:\Work\History.xml
PS > Import-Clixml C:\Work\History.xml | Add-History
このコマンドを実行すると、History.xmlに格納された履歴を現在の履歴に追加します。


 

-passThru
通常 Add-History コマンドレットは結果オブジェクトをパイプラインへ渡しません。このパラメータを使用することでパイプラインを介して値を渡すようになります。
–––––––––– -passThru パラメータの使用例1 ––––––––––
PS > Import-Clixml C:\Work\History.xml | Add-History -passThru
このコマンドを実行すると、追加したコマンド実行履歴がコンソールに出力されます。

Monday, October 06, 2008 11:40:34 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Sunday, October 05, 2008

今日は、Get-Historyコマンドレットについてまとめてみました。

コマンドレット名
Get-History

エイリアス
ghy

説明
現在起動しているPowerShell上で入力したコマンド履歴の一覧を表示します。

下記は Get-History コマンドレットを実行してみた例です。
Windows PowerShellを起動してから現時点までに入力したコマンドの履歴が表示されます。
履歴にはIDが付与され、古い方から1となります。
保存される履歴の数は自動変数 $MaximumHistoryCount で決められておりデフォルト値は64です。
最大値を超えると古いものから順に削除されていきます。

PS > Get-History
Id CommandLine
–– –––––––––––
 1 Get-Help Get-History
 2 Get-Help Get-History -Detailed
 3 Get-History
 4 cd C:\Work2
 5 Get-History

書式
Get-History [[-id] <long[]>] [[-count] <int>] [<CommonParameters>]

パラメータ
-Id <long[]>
指定したIDの履歴を取得します。カンマで区切って複数のIDを指定することもできます。

–––––––––– -Id パラメータの使用例1 ––––––––––

PS > Get–History –Id 2

  Id CommandLine
  –– –––––––––––
   2 Get–Help Get–History -Detailed

このコマンドを実行するとIDが2の履歴を取得します。

–––––––––– -Id パラメータの使用例2 ––––––––––

PS > Get–History –Id 2,5

  Id CommandLine
  –– –––––––––––
   2 Get–Help Get–History -Detailed
   5 Get–History

このコマンドを実行すると、IDが2と5の履歴を取得します。

-count
取得する最新のエントリ数を指定します。

–––––––––– -count パラメータの使用例1 ––––––––––

PS > Get–History –count 3

  Id CommandLine
  –– –––––––––––
   3 Get–History
   4 cd C:\work
   5 Get–History

このコマンドを実行すると、最新の履歴3件を取得します。

–––––––––– -count パラメータの使用例2 ––––––––––

PS > Get–History –id 4 –count 3

  Id CommandLine
  –– –––––––––––
   2 Get–Help Get–History –Detailed
   3 Get–History
   4 cd C:\work

このコマンドを実行すると、IDが4までの最新の履歴3件を取得します。

<CommonParameters>


その他の使用例
–––––––––– 使用例1 ––––––––––

PS > Get–History | Where–Object {$_.CommandLine –like "*Det*"}

  Id CommandLine
  –– –––––––––––
   2 Get–Help Get–History –Detailed
このコマンドを実行すると、文字列「Det」を含む履歴を取得します。

–––––––––– 使用例2 ––––––––––

PS > Get–History | Export–Csv History.csv

このコマンドを実行すると、Get-History コマンドレットで取得可能な履歴を History.csvにエクスポートします。
このCSVファイルはAdd-History コマンドレットで再利用可能です。

関連項目
Add-History コマンドレット

Sunday, October 05, 2008 11:22:33 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Friday, October 03, 2008

   今日はAdd-Contentコマンドレットの-passThruパラメータについてまとめてみました。

-passThru
Add-Contentコマンドレットによって作成された値(-valueパラメータに渡した値)をパイプラインを介して渡せるようにします。

通常、Add-Contentコマンドレットはパイプラインを介して値を渡しません。よって
Add-Content -path "Test.txt" -Value "ABC" | {$_}

   上記のコマンドレットを実行しても、パイプラインにオブジェクトは渡されないため、何も出力せずに終了します。

–––––––––– -passThru パラメータの使用例1 ––––––––––
Add-Content -path "Test.txt" -Value "ABC" -passThru | {$_}

   パイプラインにオブジェクトを渡したい場合には、上記のように-passThruパラメータを使用します。
   このパラメータはスイッチパラメータのため値を指定する必要はありません。

–––––––––– -passThru パラメータの使用例2 ––––––––––
Add-Content -path "*.txt" -Value "ABC" -passThru | {$_}
このコマンドレットでは -pathパラメータで複数のテキストアイル(*.txt)を指定しているため、パイプラインには対象となったファイルの数だけ"ABC"という文字が渡されることになります。つまりカレントディレクトリに3つのテキストファイルが存在した場合には、パイプラインを介して3回"ABC"が送られます。
Friday, October 03, 2008 11:46:25 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, October 02, 2008

今日も PowerShell Wiki の方でAdd-Contentコマンドレットについてまとめています。

-include <string[]>
-includeパラメータは、-pathパラメータで指定した項目の中から、対象を絞り込みます。
"*.txt"などパス要素やパターンを指定します。
–––––––––– -include パラメータの使用例1 ––––––––––
Add-Content -Path "*.txt" -Value "ABC" -Include "test*.txt"

    このコマンドレットは、"ABC"という値を、拡張子が"*.txt"のファイルへ追記します。
    ただし、-Includeパラメータで"test*.txt"としているため、拡張子が"*.txt"のファイルの中でも、特にファイル名が"test*.txt"のものだけを対象とします。

-exclude <string[]>
-excludeパラメータは、-pathパラメータで指定した項目の中から、項目を除外します。
"*.txt"などパス要素やパターンを指定します。
–––––––––– -exclude パラメータの使用例1 ––––––––––
Add-Content -Path "*.txt" -Value "ABC" -Exclude "test*.txt"

    このコマンドレットは、"ABC"という値を、拡張子が"*.txt"のファイルへ追記します。 
    ただし、-Excludeパラメータで"test*.txt"としているため、拡張子が"*.txt"のファイルの中でも、特にファイル名が"test*.txt"を除外したものが対象となります。

Thursday, October 02, 2008 11:31:38 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Monday, September 29, 2008

前回 Add-Contentコマンドレットの-Pathパラメータ を紹介しました。

今回はAdd-Contentコマンドレットの-literalPathパラメータについてまとめた(http://pswiki.hiros-dot.net/) のでご紹介します。

-literalPath <string[]>

内容を追加する先のパスを指定します。ただし-pathパラメータと異なり、ワイルドカードを指定することができません。パスにワイルドーカード文字を含めてもワイルドカードとして認識されないためエラーが発生します。パスにエスケープ文字が含まれている場合は単一引用符で囲む必要があります。(PowerShellでは`(アクサングラーブ文字)がエスケープ文字として扱われます。)

注意)ワイルドカードは指定できない

Add-Content -literalPath "Test*.txt" -Value "abc"

はエラーになります。-pathパラメータはワイルドカードを使用して複数ファイルへの書き込みが可能ですが-literalPathはできません。ただしカンマ区切りによる複数ファイルの指定は可能です。

–––––––––– -literalPathパラメータの使用例1 ––––––––––
Add-Content -literalPath "test.txt" -Value "ABC"

このコマンドを実行すると、カレントディレクトリに存在する test.txt というファイルに"ABC"という文字列を追記します。ファイルが存在しない場合は新規で作成され"ABC"という文字列を書き込みます。

–––––––––– -literalPathパラメータの使用例2 ––––––––––
Add-Content -literalPath "test1.txt","test2.txt" -Value "ABC"

このコマンドを実行すると、test1.txt と test2.txtの2つのファイルに文字列"ABC"を追記します。ファイルが存在しない場合は新規で作成され"ABC"という文字列を書き込みます。

–––––––––– -literalPathパラメータの使用例3 ––––––––––
Add-Content -literalPath 'tes`t.txt' -Value "ABC"

このコマンドを実行すると、カレントディレクトリに存在する tes`t.txt というファイルに"ABC"という文字列を追記します。ファイルが存在しない場合には新規で作成されます。
この例のように、パスにエスケープ文字が含まれている場合は単一引用符(')で括って指定します。

–––––––––– -literalPathパラメータの使用例4 ––––––––––
Add-Content -literalPath "tes[]t.txt" -Value "ABC"

このコマンドを実行すると、カレントディレクトリに存在する tes[]t.txt というファイルに"ABC"という文字列を追記します。ファイルが存在しない場合には新規で作成されます。
この例のようにパスにワイルドカードパターンが含まれていても文字として取り扱います。

–––––––––– -literalPathパラメータのNG例1 ––––––––––
Add-Content -literalPath "Test*.txt" -Value "abc"

このコマンドレットは、パスにワイルドカード(*)が含まれているためにエラーとなります。これは*をワイルドカードではなく文字として認識し、ファイル名として取り扱おうとしたことが原因となります。

まとめ

-literalPathパラメータの特徴は、なんといってもワイルドカード文字をワイルドカードとしてではなく文字として取り扱うことでしょう。

パスにワイルドカードが含まれている場合には-literalPathパラメータを使用するということを是非覚えておいてください。

Monday, September 29, 2008 11:51:55 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Sunday, September 28, 2008

現在、PowerShell WikiでAdd-Contentコマンドレットの使用方法についてまとめています。(サイト自体は今年の7月に立ち上げていたのですがこれから始動といったところです)

では、本題です。


Add-Contentコマンドレットは

指定した項目やファイルに内容を追加することができます。内容を指定するには、コマンドに内容を入力するか、内容が入力されているオブジェクトを指定します。指定した項目やファイルが存在しない場合は、新規で作成され、指定した値が追記されます。


基本構文

Add-Content -Path "パス文字列" -Value "追記する値"

です。実際には数多くのパラメータがありますが、後日紹介していきたいと思います。

今回取り上げるのは-Pathパラメータです。


-Pathパラメータは

内容を追加する先のパスを指定します。パスにはワイルドカードを指定することができます。また、カンマで区切ることで複数のファイルを指定することができます。

エスケープ文字を含むパスを指定することはできません。エスケープ文字を含むパスを指定したい場合は-literalPathパラメータを使用します。(PowerShellでは`(アクサングラーブ文字)がエスケープ文字として扱われます。)


使用例

–––––––––– -Pathパラメータの使用例1 ––––––––––

Add-Content -Path "test.txt" -Value "ABC"

このコマンドを実行すると、カレントディレクトリに存在する test.txt というファイルに"ABC"という文字列を追記します。
ファイルが存在しない場合は新規で作成され"ABC"という文字列を書き込みます。

–––––––––– -Pathパラメータの使用例2 ––––––––––
Add-Content -Path "test1.txt","test2.txt" -Value "ABC"

このコマンドを実行すると、test1.txt と test2.txtの2つのファイルに文字列"ABC"を追記します。
ファイルが存在しない場合は新規で作成され"ABC"という文字列を書き込みます。

–––––––––– -Pathパラメータの使用例3 ––––––––––
Add-Content -Path "*.txt" -Value "ABC"


このコマンドを実行すると、カレントディレクトリにある拡張子が*.txtのファイルに"ABC"という文字列を追記します。


–––––––––– -PathパラメータのNG例1 ––––––––––

Add-Content -Path "tes`t.txt" -Value "ABC"

このコマンドレットはパスにエスケープ文字`tが含まれているため「パスに無効な文字が含まれています。」のエラーが発生します。
エスケープ文字が含まれているパスを指定したい場合には-Pathパラメータの代わりに-literalPathパラメータを使用します。

–––––––––– -PathパラメータのNG例2 ––––––––––
Add-Content -Path "tes[t.txt" -Value "ABC"

このコマンドレットはパスに[が含まれているため「指定されたワイルドカード パターンは無効です」のエラーが発生します。-Pathパラメータでは"["をワイルドカードととして認識します。この例で使用されている文字"["は正規表現で使用される文字であり"]"と対で使用しなければなりません。このようなファイル名を使用したい場合は-Pathパラメータの代わりに-literalPathパラメータを使用します。


まとめ

-Pathパラメータはワイルドカードを使用して、複数ファイルへ一気に同じ文字列を追記できるところがすごいですね。

ワイルドカードを使用できる分、-PathパラメータのNG例2のようにワイルドカード構成する文字を含むパスは指定できないという制限がありますが、-literalPathパラメータを使用すればこの問題は回避できます。

-Pathと-literalPathパラメータを使い分けるポイントとなりますね。

Sunday, September 28, 2008 11:48:54 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

Theme design by Jelle Druyts

Pick a theme: