プロンプトの変更

http://www.leeholmes.com/blog/default,date,2005-06-12.aspx
を参考に、プロンプトを変更してみた。

一目瞭然だと思うが、無理やり説明すると。
カレントディレクトリだけの名前を取得するのにswitch文で正規表現を使った。
ドライブ直下の時はそれだとうまく行かないので、その時はdefaultで対処。
文字列のフォーマッティングはStringのFormat関数を使った。

MSH>function prompt {
>> switch -regex ((get-location).path) {
>> "(?<current>[^\\]+$)" {
>> $c = $matches.current
>> }
>> default {
>> $c = $_
>> }
>> }
>> [String]::Format("[{0}] {1} >", $c, (get-history -count 1).id)
>> }
>>
[C:\] 0 >cd windows
[WINDOWS] 1 >cd system32
[system32] 2 >

サンプル:ファイルのSHA1ハッシュを計算する。

MSH> function GetSha1 {
>> $path = $args[0]
>> $bytes = [System.IO.File]::ReadAllBytes($path)
>> $sha1 = new-object System.Security.Cryptography.SHA1Managed
>> $hash = $sha1.ComputeHash($bytes)
>> $retval = ""
>> foreach ($b in $hash) {$retval += $b.ToString("x2")}
>> $retval
>> }
>>
MSH> GetSha1("C:\TEMP\Console1\bin\Debug\Console1.exe")
2c0371c737f9785fc6db4f35ba0973eaa29e1fd0

従来の環境では、ライブラリのインターフェースとコマンドラインのインターフェースが著しく異なっていたために、コマンドラインのプログラムという形でライブラリをラップする必要があった。
このため、コマンドを作らないとライブラリが呼び出せなかったし、ライブラリとは異なるコマンドの使い方を別途覚える必要が生じた。

Monad Shellの場合、いきなりシェルから.NET Frameworkが使える。
コンソールアプリを作る時も、シェルスクリプトを書くときも、同じように.NET Frameworkを使う。
すばらしい。
この環境から始めた人は、UNIXの混沌には耐えられないだろうな。

.NET関連の操作

Microsoft Command Shell(Monad Shell)で遊んだ続き。
.NET Frameworkがそのまま使えるってのを試してみた。
かなり面白い。rubyでいう所のirbみたい。気に入りました。

サンプル:ファイルのダウンロード

New-ObjectというCmdletを使うとインスタンスを作成できる。

MSH> $c = new-object System.Net.WebClient
MSH> $c.DownloadFile("http://www.google.com/", "c:/temp.html")

サンプル:メール送信

これも同様。

MSH> $cl = new-object System.Net.Mail.SmtpClient
MSH> $cl.Host = "smtp"
MSH> $msg = new-object System.Net.Mail.MailMessage
MSH> $from = new-object System.Net.Mail.MailAddress("hoge@fuga")
MSH> $to = $from
MSH> $msg = new-object System.Net.Mail.MailMessage($from, $to)
MSH> $msg.Body = "aaaaa"
MSH> $msg.Subject = "test subject"
MSH> $cl.Send($msg)

staticなMethodを呼ぶ

[クラス名]::メソッド名()って感じで呼び出せる。

MSH> [System.Enum]::GetValues([System.IO.FileAccess])
Read
Write
ReadWrite
MSH>

Enumにアクセス

これもStatic Methodと同様で、[クラス名]::Enum名。
ちなみにプロパティの場合も同じ感じ。

MSH> $out = new-object System.IO.FileStream("C:/temp.txt",
>> [System.IO.FileMode]::Create,
>> [System.IO.FileAccess]::Write)
>>
MSH> $c = new-object System.Net.WebClient
MSH> $a = $c.DownloadData("http://www.yahoo.co.jp/")
MSH> $out.Write($a, 0, $a.Length)
MSH> $out.Close()
MSH>

アセンブリのLoad

[Reflection.Assembly]::LoadWithPartialName("System.Web")

Cmdletを試す

引き続きMicrosoft Command Shell(Monad Shell)で遊ぶ。
sh等の既存のシェルで言う所のbuiltin Commandに該当するのがCmdletだ。
verb-nounという形式に命名法が統一されているのに感心した。
もちろん、普通使いたいコマンドにはaliasが切ってあるので、cdとかlsできる。

まぁ、まずは触ってみようということで、とりあえずレジストリをいじってみた。

まずは目的の位置に移動。

MSHのプロンプトを起動した後、まずは移動して、Get-Itemで現在の内容を見る。

MSH> cd hkcu:\software\microsoft\windows\currentversion
MSH> get-item run


   Hive: Registry::HKEY_CURRENT_USER\software\microsoft\windows\currentversion

SKC  VC Name                           Property
---  -- ----                           --------
 0   1 run                            {ctfmon.exe}

New-Propertyで新しい項目を登録する。

Windowsの起動時に電卓が立ち上がるようにしてみた。

MSH> new-property -path run -property "calc.exe" -value "C:\windows\system32\cal
c.exe"


MshPath       : Registry::HKEY_CURRENT_USER\software\microsoft\windows\currentv
               ersion\run
MshParentPath : Registry::HKEY_CURRENT_USER\software\microsoft\windows\currentv
               ersion
MshChildName  : run
MshDrive      : HKCU
MshProvider   : System.Management.Automation.ProviderInfo
calc.exe      : C:\windows\system32\calc.exe

値が変わって、calc.exeが増えているのがわかる。

MSH> get-item run


   Hive: Registry::HKEY_CURRENT_USER\software\microsoft\windows\currentversion

SKC  VC Name                           Property
---  -- ----                           --------
 0   2 run                            {ctfmon.exe, calc.exe}

実際に登録されているかどうか、Get-Propertyで確認する。

MSH> get-property -path run -property calc.exe


MshPath       : Registry::HKEY_CURRENT_USER\software\microsoft\windows\currentv
               ersion\run
MshParentPath : Registry::HKEY_CURRENT_USER\software\microsoft\windows\currentv
               ersion
MshChildName  : run
MshDrive      : HKCU
MshProvider   : System.Management.Automation.ProviderInfo
calc.exe      : C:\windows\system32\calc.exe

はい、確かにcalc.exeがレジストリに登録されています。

Remove-Propertyで削除する。

本当に起動時に電卓が立ち上がってもジャマなので。

MSH> remove-property -path run -property calc.exe
MSH> get-item run


   Hive: Registry::HKEY_CURRENT_USER\software\microsoft\windows\currentversion

SKC  VC Name                           Property
---  -- ----                           --------
 0   1 run                            {ctfmon.exe}

.NETのオブジェクトも扱えるようだが、ちょっとまだ良くやり方が分からない。
っていうか、本当にドキュメントが無い。

Microsoft Command Shellの関連ページ

Monad Shellの関連ページ。
http://www.globe.to/~oka326/?cmd=read&page=Note%2FdotNET%2FMSH&word=Note%2FdotNET%2FMSH
System Error | Channel 9
開発者のblog
Arul Kumaravel's WebLog – Windows PowerShell technology blog

日本語のページがほとんど無い。
ってか、プログラム付属のドキュメントが一番詳しい。英語だけど。

Microsoft Command Shellの入手

Microsoft Command Shell(Monad)のベータテスターになってみた。
以下、ベータ版を手に入れるまで。

  1. beta.microsoft.comにアクセスする。
  2. Microsoft Passportのアカウントを取ってログイン。
  3. Guest IDにmshPDCと入力してOK。
  4. Homeのページの下の方の「Microsoft Command Shell Preview」を選択。
  5. 左側のSurveyの所にある「Longhorn Command Shell」を選択。
  6. フォームを入力。住所や電話番号もきちんと書かないと、ずーっと待たされる。
  7. 24時間くらいでMicrosoftから(英語の)返事が来る。
  8. 返事が着てからさらに24時間くらい待つと、ログインした後の画面の左側にDownloadsというリンクが出て来る。
  9. DownloadするのにActiveXを使うので、インストールできる権限が必要。
  10. 動かすには.NET 2.0Beta2が必要。

ASP.NET 2.0 Beta2でのデータベース接続文字列の取得方法

けっこうハマった所。
web.configのConnectionStringsセクションにデータベースの接続文字列が格納できるようになっている。Visual StudioのWizardを使用した場合もここに格納される。
この、データベース接続文字列にプログラムからアクセスするときの方法が、ASP.NET 2.0のBeta2では変更されている。

今まではSystem.Configuration.ConfigurationSettingsというクラスが管理していたのだが、Beta2ではSystem.Web.Configuration.WebConfigurationManagerというクラスに変わった。
具体的に文字列にアクセスするコードは、以下のようになる。

Beta1の時:
System.Configuration.ConfigurationSettings.ConnectionStrings
["AppConnectionString"].ConnectionString

Beta2の時:
System.Web.Configuration.WebConfigurationManager.ConnectionStrings
["AppConnectionString"].ConnectionString

今日ざっと調べた限りでは、今のところ世の中に転がっているサンプルソースはベータ1のが多い。