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()  

PowerShellでExcel操作

|
foo.xlsがスプリクトと同じフォルダにあるとして・・・

--- foo.ps1 ---

  1. $filePath = Get-ChildItem foo.xls*  
  2. $excel = New-Object -comobject Excel.Application  
  3. $excel.Visible = $True  
  4. $workBooks = $excel.Workbooks.Open($filePath)  
  5.   
  6. #Sheet1を取得する  
  7. $workbooks.Worksheets | % { if ($_.Index -eq 1) { $sheet = $_; }}  
  8.   
  9. #A1の値が表示される  
  10. $sheet.Cells.Item(1,1).Text  
  11.   
  12. #文字のColorIndexが表示される  
  13. $sheet.Cells.Item(1,1).Font.ColorIndex  
  14.   
  15. #セルのColorIndexが表示される  
  16. $sheet.Cells.Item(1,1).Interior.ColorIndex  
  17.   
  18. $workBooks.Close()  
  19. $excel.Quit()  

Microsoft.VisualBasic.FileIOでCSVの読み込み

| 2008年9月28日日曜日
使ったCSVファイル
--- foo.csv ---
"aaa,aaa","aaa","aaa"
"bbb","bbb,bbb","bbb"
"ccc","ccccccc","c,c"
--- ---

Booで読んでみた
--- foo.boo ---

  1. import System  
  2. import Microsoft.VisualBasic.FileIO  
  3.   
  4. p = TextFieldParser("foo.csv")  
  5. p.TextFieldType = FieldType.Delimited  
  6. p.SetDelimiters(",")  
  7.   
  8. while (not p.EndOfData):  
  9.   r = p.ReadFields()  
  10.   
  11.   for i in r:  
  12.     print i  

--- 結果 ---
aaa,aaa
aaa
aaa
bbb
bbb,bbb
bbb
ccc
ccccccc
c,c
--- ---

楽チン過ぎてちょっとカルチャーショック!!

VBA 2次元配列

| 2008年9月23日火曜日
VBAで2次元配列の作り方

1.セルの値を丸ごと配列に入れる。

Dim values As Variant
values = Range("A1:B10")

アクセス方法(A4の値)
values(1, 4)

行の長さを求めるには
Ubound(values)

列の長さは、(ここでは2列目)
Ubound(values, 2)

2.セルを使わずに初期化して作る。

Dim values As Variant
values = Array(Array(11, 12, 13) , Array(21, 22, 23))

アクセス方法(2行目の1列目の値 21)
values(1)(0)

行の長さ
Ubound(values)

列の長さ(2列目)
Ubound(values(1))

自PCのIPアドレスを取得する

|
複数ある場合は、foreachでまわして探す。

$localHostName = [System.Net.Dns]::GetHostName()
$localIP = [System.Net.Dns]::GetHostByName( $localHostName )
$localIP.AddressList[0].ToString()

ディスクの空き容量

|
PowerShell

空き容量の%
$d = New-Object System.IO.DriveInfo("C")
$d.TotalFreeSpace / ( $d.TotalSize / 100)

ディスクサイズ(GB)
$d.TotalSize / 1GB

リムーバブルディスクの取り出し

|
よく忘れるのでメモ。

PowerShell
$Shell.Application.NameSpace(17).ParseName('D:\').InvokeVerb("取り出し(&J)")

VBScript
CreateObject("Shell.Application").NameSpace("D:\").Items.Item.InvokeVerb "取り出し(&J)"

Excel/VBAでスペース区切り出力する

| 2008年6月16日月曜日
 Excelで固定長でTextファイルで保存する際に、.prn(スペース区切り)で保存すると、Excelの仕様で240文字までしか一行で出力できなかったので、簡単なスペース区切りができるマクロを作成してみました。
 かなり適当に作ってあります。
 範囲指定は「A1:H10」のような感じで入力してください。
 ファイル名は、元ファイルと同じ場所で、シート名.txtで保存されます。

--- 以下 コード ---

Sub SpaseSeparatedValues()
Dim i, j As Integer

Dim fileName As String
fileName = ActiveWorkbook.Path & "\" & ActiveSheet.Name & ".txt"

Dim scope As String
scope = InputBox("スペース区切りで出力したい範囲をしていしてください。", "SpaseSeparatedValues")

Dim data As Variant
data = Range(scope)

Dim fileNo As Integer

fileNo = FreeFile()
Open fileName For Output As #fileNo

Dim printLine As String

For i = 1 To UBound(data)
printLine = ""
For j = 1 To UBound(data, 2)
printLine = printLine & data(i, j) & Space(Int(Cells(i, j).ColumnWidth) - Len(data(i, j)))
Next
Print #fileNo, printLine
Next
Close #fileNo
End Sub

VineLinux4.2でmonoを使ってみる

| 2008年3月7日金曜日
 久しぶりにLinuxを使ったけど、思ったより早い。前にUbuntoを使ったときは、なんか、もっさりしてる感じだったから、あんまり使わなかったけど、これならだいぶいい。
 仕事では、ずっとWindowsだからなんか、ちょっと戸惑うけど。
 C#でプログラミングしたいので、monoをインストールしてみる。ソースから入れたほうが、最新のものを試せるけど、まずは、Vineのパッケージを試してみる。

apt-get install mono-core
apt-get install mono-devel
apt-get install mono-winforms

 バージョン的には少し古いけど、十分使えるだろう。早速、テストコードをコンパイル。思ったより、あっさりとコンパイルできた。ただ、フォームを表示して、メッセージボックスを出しただけだから、たいしたことはないけどLinuxでC#が動くと、ちょっとびっくり。
 ただ、バージョンが古いからなのか、partialで分割クラスが使えない。テストコードははじめ、Program.cs、Form1.cs、Form1.Designer.csにしていたけど、コンパイルでpartialがどうとかでるので、ひとつにまとめた。
 あと、namespaceを使うとこれもコンパイルできない。なんでだ?そのnamespaseにはこのアプリはない。見たいなエラーになる。やっぱり最新のものを入れたほうがいいな。
 こんど、ソースからインストールしてみよう。なんか、面倒くさそうな気がするけどね。その時には、monodevelopも入れたいな。

viよく使うコマンドメモ

| 2008年3月5日水曜日
最近ログをチェックすることが多いので、こんなんばっかり。バイナリを見るのは、設定ファイルがシリアル化してた場合・・・

文字数カウント
:%s/./&/g

fooを含む行を削除
:%g/foo/d

fooを含まない行を削除
:%v/foo/d

空白行を削除
:%g/^ *$/d

バイナリエディタ
:%!xxd
:%!xxd -r

Windows Temporary Folderについて

| 2008年3月2日日曜日
 C#なんかでTempフォルダを使いたくなった時、その場所は、System.IO.Path.GetTempPath()で取得するけど、この時、得られるフォルダの場所は環境変数に定義されている順に先に見つかったのを返してくる。具体的には、

1 TMP C:\Document and Setting\LocalSetting\Temp\
2 TEMP C:\Document and Setting\LocalSetting\Temp\
3 USERPROFILE C:\Document and Setting\

 っとこれに関しては、これで良いんだけど、気になったのがこのTempフォルダはいつクリアされるのか?っという事だ。
 Tempフォルダというとなんとなく、システム側で勝手に消してくれると思っていたけど、調べてみると実は違った。
 確かに、ディスクのクリーンアップで消してはくれるけど、これは勝手にWindowsがしてくれる訳じゃなく、ユーザが自分でする必要がある。それまでは、ユーザが自分でわかってTemp領域のファイルをクリアするまで、そのまま残り続けるって事になる。
 もし、自分で作ったアプリケーションでTempフォルダを使うなら、そこに置いた一時ファイルはちゃんと、アプリで消してあげないと、どんどん溜まってしまうことになる。まぁ溜まっても限界まできたら「ディスクのクリーンアップをして下さい。」メッセージがでるから、ほって置いてもかまわないのかもしれないし、最近のHDDはデカイからそれほど問題にはならないのかもしれない。
 でも、少なくとも、自分が書く時には汚した所は自分で綺麗にして終了させるようにしたほうが礼儀正しいだろう。

Vimperator

| 2008年2月29日金曜日
 ここで存在を知ったんだけど、神だ。最高だ。ちょっとたまにおかしな動きをするけど、すばらしい。マジで感動した。
 ただ、ここまで拡張できるFireFoxが凄すぎると思うのは自分だけだろうか?

自分が良く使うコマンドだけ、メモ。

f : リンク先を選択(大文字で打てば、タブで開く、小文字だとアクティブなタブで開く)
H : 戻る
L : 進む
j : 一行下にスクロール
k : 一行上にスクロール
C-f : 下にスクロール
C-b : 上にスクロール
y:URLをヤンク
Y:選択文字をヤンク

f[ : ページ内でのウインドウ移動 右のページ?
f] : 同じく 左のページ?かな
gt : タブ移動 右のタブ
gT : タブ移動 左のタブ
gh : ホームページ
d : タブを閉じる

検索するのはアクティブな検索バー

p:ヤンクした文字を検索
P:ヤンクした文字を新しいタブで検索
:o foo : 現在のタブでfooを検索
:t foo : 新しいタブを開いてfooを検索
:q : 終了、複数タブの場合はアクティブなタブを閉じる

:bmarks : ブックマークを開く、開いてアドレスをクリックしたらEscで閉じる
:help : 英語だけど、ヘルプ
:set guioptions+=mT : ツールバーとメニューバーを表示
:set guioptions-=mT : 非表示

VineLinux4.2

| 2008年2月27日水曜日
 去年の12月に出てたみたいだけど、全然試してなかった。さっきダウンロードしたから、週末にでもインストールして、遊んでみよう。
 気になったのは、ダウンロード速度。なんで、こんなに早いんだ?家の環境はかなり遅いと思ってるんだけど・・・。10分もかからずに落とせるとありがたいよ。前は、一晩かかってたからね。
 最近はLinux関係の雑誌をあんまり見かけないから、インストールCDを自分で焼かないといけなくて、面倒だな。5年くらい前にはLinux系の雑誌っていっぱいあったように思うけど・・・寂しい限りだ。

プロフェッショナルとは・・・

| 2008年2月22日金曜日
「ファンを圧倒し、選手を圧倒し、圧倒的な結果を残す、ということです。」

イチローカッコイイ(^ ^)/
イチローのようになることは無理かもしれないけど(たぶん、無理だけど・・・)それでも、できるだけ近づきたいなぁ~。
自分も、お金を貰って働いているんだから、お客さんを圧倒するような仕事ップリをしてみたいね。そのためには、もっと勉強して、一つの仕事に対してもっと考えないといけないな。どうしても、嫌いだったり、興味がない仕事だと適当にやっつけでやってしまうから。