VBScriptで数値を0で埋めて表示してみる

| 2011年10月12日水曜日


VBScriptでは0埋めでフォーマットする関数は標準で用意されていないようだ。

こんな感じで書いて

Format("0000000000", 120)

0000000120

っと表示したかったけど楽にはできないみたい。

そこでちょっとしたものを書いてみた。

普通に0埋め用のフォーマットをする関数なら他でも紹介されていたので、ここではエラー処理などは無視して、関数にするほどもない、一箇所だけそんな0埋めでフォーマットをしたい人向けにした。

内容は単純で、

  • 表示したい桁 - 数値の桁
  • その結果の数値をSpace関数で数値分の空白文字にする
  • 空白文字をReplace関数を使って指定した文字に置き換える
っというのを一行でしているだけ。
VBScriptでちょっとしたバッチのために、だらだらと関数を書いたり、共通関数を外だしするのもなんだし。
小さいバッチはあっさりしてた方がメンテナンスも楽だからね。
  1. 'VBScriptで数値を0で埋めて表示する  
  2.   
  3. '表示したい桁数  
  4. length = 10  
  5.   
  6. '表示する数値  
  7. value = 120  
  8.   
  9. '0で埋める  
  10. character = 0  
  11.   
  12. '10桁表示で120を表し、空いている部分は0で埋める  
  13. result = Replace(Space(length - Len(value)) & value, Space(1), character)  
  14.   
  15. WScript.Echo result ' => 0000000120  

Windowsでvimのopsplorer.vimを使ってみた。

| 2011年10月10日月曜日


vimをIDEっぽくできないかと探していると、opsplorer.vimなるものを見つけた。

  1. vim onlineからダウンロード。 リンク:opsplorer.vim
  2. pluginフォルダにopsplorer.vimを配置。(KaoriYaのvimを使っているなら runtime/pluginの下)
  3. vimを起動して :opsplorer
見つけたのはいいが、使ってみるも動かない。

どうやら、Windowsには対応していないようだ。
紹介サイトのスクリーンショットがMacばっかりだったからなんとなく察したけど。
他にも困っている人がいるだろうとさらに調べると対応版を作ってくれている人がいた。


mattn
opsplorer.vimをwin32でも動くようにしてみた。便利かどうかは知らない。http://gist.github.com/333696


十分に便利でありがたいです。
githubで公開されているようなのでダウンロードして、pluginフォルダにおいてみる。

起動するとうまく動いてくれたようだ。

が!

ここでちょっとした問題が・・・
フォルダの展開やファイルの選択系はWindowsに対応してくれたようだけど、コマンド系(ファイルのコピーやリネーム、削除)ができない。

ソースを見てみると、ファイルを削除しているであろう関数FileDelete()の中で呼び出してるコマンドが"rm"だった・・・
これはWindowsでは動かんだろうな。

system()関数で呼び出されるのは、たぶん、CMDのコマンドだろうからここは"del"でないといけないはず。

PowerShellを常時使ってるから、このあたりの機能はなくてもいいんだけど、連休中にやることもなかったので、vimマクロはほとんど触ったことがないけどいじってみた。

詳細は一番下にリンクを張ったコードをダウンロードして見てもらえばいいけど、外部コマンドを呼んでいるっぽいところを変更しただけ。

let i=system("rm -f ".filename)


if has("win32")
let filename = substitute(filename,".*[\\/]",'','')
let i=system("del /Q ".filename)
else
let i=system("rm -f ".filename)
endif

Windowsならフォルダの区切り文字を整理して、"del"コマンドを呼ぶ。
削除、コピー、リネーム、移動を変更してみた。
大体動いているようだけど、なぜか移動だけは動かなかった。
わかる人、助けて下さいm(_ _)m

他にも困ってる人がいると思うので変更したソースを公開する。
本来はgithubを使ったほうがいいんだろうけど、アカウントを持ってないので今回はやめておく。



Windows7のPowerShellでDVDドライブからのディスク取り出し

| 2011年7月18日月曜日

Windows7を使い始めて、リムーバブルディスクの取り出しをやってみると動かなかったので修正。

前のようにWScript.Shellを使って

> $shell = New-Object -ComObject WScript.Shell
> $Shell.Application.NameSpace(17).ParseName('D:\').InvokeVerb("取り出し(&J)")

っとやろうとしたけどShellの下にApplication.NameSpaceってのがないらしく呼び出せなかった。
そこで調べてみるとWMPlayerの機能を呼び出しても取り出しができそうだったので、そっちでやってみた。

> $wmp = New-Object -ComObject WMPlayer.OCX.7
> $wmp.cdromCollection.Item(0).Eject()

自分の場合はドライブが1つしかないので試せないけど、複数ドライブなら”Item(0)”の部分を変えればいけると思う。

Oracle SQLでDATE型とUNIXタイムを相互に変換する

| 2011年5月4日水曜日
SQLだけでやると一文が長くなってしまうので、頻繁に利用するなら
PL/SQLで関数を作っておいた方がいいと思う。

自分の場合は一回限りなのでSQLのみでやりたかった。

※Oracle XEで検証

-- DATE型からUNIXタイムに
select trunc(to_number(
to_date('調べたい日時を入れる', 'YYYY/MM/DD HH24:MI:SS')
- to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
) * (24 * 60 * 60)
) as unixtimestmp
from dual;

-- 例 2011年5月4日 午前1時20分30秒
select trunc(to_number(
to_date('2011/05/04 01:20:30', 'YYYY/MM/DD HH24:MI:SS')
- to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
) * (24 * 60 * 60)
) as unixtimestmp
from dual;

結果: 1304472030

-- UNIXタイムからDATE型に
-- ここではわかりやすいようにto_charで変換して出力している
select to_char((
to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
+ (調べたいUNIXタイムを入れる/ (24 * 60 * 60))
), 'YYYY/MM/DD HH24:MI:SS') as utc
from dual;

-- 例 1304472030 (2011年5月4日 午前1時20分30秒)
select to_char((
to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
+ (1304472030 / (24 * 60 * 60))
), 'YYYY/MM/DD HH24:MI:SS') as utc
from dual;

結果: 2011/05/04 01:20:30

-- 調べたいUNIXタイムが標準時で記録されていた場合
-- 日本標準時で出力したければ、9時間足す必要がある
select to_char((
to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
+ ((1304472030 + (9 * 60 * 60))/ (24 * 60 * 60))
), 'YYYY/MM/DD HH24:MI:SS') as jst
from dual;

結果: 2011/05/04 10:20:30

PowerShellで作成したフォルダに直ぐに移動(ただのメモ)

| 2010年12月1日水曜日
フォルダを作成するとき、直ぐにそのフォルダに移動して作業をしたいことが多いと思う。

でも、フォルダが多い場所で作成すると、目的のフォルダに移動するのはなかなか時間がかかる。
特に日本語のフォルダに移動するときは、Tabを連打したり、フォルダ名の一部を入力、またはペースとして補完するなど、わりと面倒くさい。

そんな時、作成したフォルダに直ぐに移動するには、PowerShellでは以下のようにすればよい。

> mkdir "適当なフォルダ名" | cd $_

mkdirをすると、DirectoryInfoオブジェクトが返ってくるのでそれをパイプして移動する。

※単純だけど、なんとなく忘れてしまいそうなTipsなのでメモ

Pingの結果をPowerShellっぽく取得してみる

| 2010年11月30日火曜日
PowerShellからPing打つことはもちろんできるが、バッチファイルの中で利用すると結果が一々コンソールに出力されてちょっと邪魔な時がある。

バッチファイルの中で知りたいのは、そのIPのマシンが生きているかどうかなので、結果は「True」か「False」で十分だ。

そこで、Pingの結果をラップしてPowerShellで扱いやすいようにしてみる。

■使い方
> Get-PingResult www.google.com #成功時
Value Reply
----- -----
True {www.l.google.com [66.249.89.104]に ping を送...

> $a = Get-PingResult www.google.com #変数に入れてみる
> $a.Reply
www.l.google.com [66.249.89.104]に ping を送信しています 32 バイトのデータ:
66.249.89.104 からの応答: バイト数 =32 時間 =19ms TTL=57
66.249.89.104 からの応答: バイト数 =32 時間 =21ms TTL=57
66.249.89.104 からの応答: バイト数 =32 時間 =19ms TTL=57
66.249.89.104 からの応答: バイト数 =32 時間 =20ms TTL=57
66.249.89.104 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 19ms、最大 = 21ms、平均 = 19ms

> Get-PingResult www.google.coma #失敗時
Value Reply
----- -----
False ping 要求ではホスト www.google.coma が見つかり...

  1. function Get-PingResult([String]$IP) {
  2.  $reply = C:\Windows\System32\PING.EXE $IP
  3.  #余分な空白行を削除する
  4.  $reply = $reply | % { if ($_ -ne "") { $_ }}
  5.  #上手くいったかどうかは結果の行数で判断する
  6.  $success = 9
  7.  $result = New-Object psobject
  8.  if ($reply.Length -eq $success) {
  9.   $result | Add-Member -MemberType NoteProperty -Name "Value" -Value $true
  10.  } else {
  11.   $result | Add-Member -MemberType NoteProperty -Name "Value" -Value $false
  12.  }
  13.  $result | Add-Member -MemberType NoteProperty -Name "Reply" -Value $reply
  14.  return $result
  15. }

PowerShellで文字列をバイトで区切って切り出す

|
メールの本文を生成する場合などに、きれいにフォーマットするためスペースなどで埋めたり、文字数でカットして成形したい時がある。
ただ、PowerShellだと、半角の「ABCD」というのと、全角の「ABCD」はおなじ4文字としてカウントされる。
そこでVBのLeftBのようにバイト数で切り取ってみる。

■使い方
> Get-SubStringBytes "ABCD" 2 2 #半角文字を2バイト目から2バイト切り取る
CD
> Get-SubStringBytes "ABCD" 2 2 #全角文字を・・・(略)
  1. function Get-SubStringBytes([String]$Text, [int]$StartIndex = 0, [int]$Length = 0) {
  2. $enc = [System.Text.Encoding]::Default
  3. $bytes = $enc.GetBytes($Text)
  4. return $enc.GetString($bytes, $StartIndex, $Length)
  5. }