OSC2012 愛媛でEjectコマンドユーザ会の展示を見てインスパイアされた(ことにする)。
#方眼紙に飽きたとか言わない。
Ejectコマンドユーザ会
http://eject.kokuda.org/
イケメンの某氏と立ち話で「Windowsとか安い端末で実装されてるといいよね。」などと
OSCらしくない他力本願寺なことを零してしまったので、反省して自分で実装することにした。
#EjectコマンドがLinuxのコマンドだと後で知ったくらいなので申し訳ない。
Windows上でサーバを立てることになるわけだけど
本家がPHPでLinuxコマンドを叩いているのもあって
流行りのP系言語のフレームワークとか使うのがカッコイイよねぇと思う。
ということで探してみた。
PowerShell Ad-Hoc Web Server (paws)
http://paws.codeplex.com/
これが何かというと今最もホットなスクリプト言語であるPowerShellのみで実装された
Webフレームワークである。
Windows7上であればこのスクリプトだけでサービスが提供できる(らしい)。
#素のPowerShellでソケット叩いてます。
解凍したらすぐ動くと期待していたのだが色々エラーが出た。
スクリプトの文字コードが違うらしい。
ってことで秀丸の欧州コードで読んでUTF-16で保存する応急処置。
そうすると普通に動いた。すばらしい。
で、「run-test-form.ps1」と「WebApp.TestForm.ps1」を改変してサーバアプリを書いてみた。
「WebApp.Eject.ps1」が以下のようになる。
EjectにShell.Applicationを使うのが定番らしいのだが、Closeが出来なかったので
VB4以来COM好きの私としてはWMPlayer.OCXを使用した。
もし、興味がある人は試してください。
必要ないと思いますが、要望あれば他のソースも出すかもしれません。
. .\Lib.WebPage.ps1 #==================================================================== # # EJECT WEB APPLICATION # #==================================================================== #-------------------------------------------------------------------- Function Get-HtmlEjectForm { @" <FORM action="eject-form" method="GET"> <P> <INPUT type="submit" value="Eject"> </P> </FORM> "@ } #-------------------------------------------------------------------- Function Get-HtmlCloseForm { @" <FORM action="close-form" method="GET"> <P> <INPUT type="submit" value="Close"> </P> </FORM> "@ } #-------------------------------------------------------------------- Function Let-CDROM-Eject { $wmp = New-object -COM WMPlayer.OCX for($i = 0; $i -lt $wmp.cdromcollection.count; $i++) { $wmp.cdromcollection.item($i).eject() } } #-------------------------------------------------------------------- Function Let-CDROM-Close { $wmp = New-object -COM WMPlayer.OCX for($i = 0; $i -lt $wmp.cdromcollection.count; $i++) { $wmp.cdromcollection.item($i).eject() $wmp.cdromcollection.item($i).eject() } } #-------------------------------------------------------------------- Function Process-Web-GET { param ( [psobject] $WebRequest ) [psobject] $WebResponse = New-WebResponse $WebResponse.WebRequest = $WebRequest $WebResponse.Resource = $null $WebResponse.ResponseCode = "501 Not Implemented" # Construct the request path. [string] $ResourcePath = $WebRequest.WebServer.ApplicationFolder [string] $ResourceName = $WebRequest.ResourceName [string] $html = "" if( $ResourceName -eq "" ) { # Show the test form. $html = "" $html += Get-HtmlHeader $WebRequest "Test Form" "" $html += Get-HtmlEjectForm $html += Get-HtmlFooter $WebRequest "" } elseif( $ResourceName -eq "eject-form" ) { # Eject ! Let-CDROM-Eject $html = "" $html += Get-HtmlHeader $WebRequest "Test Form" "" $html += Get-HtmlCloseForm $html += Get-HtmlFooter $WebRequest "" } elseif( $ResourceName -eq "close-form" ) { # Close ! Let-CDROM-Close $html = "" $html += Get-HtmlHeader $WebRequest "Test Form" "" $html += Get-HtmlEjectForm $html += Get-HtmlFooter $WebRequest "" } if( $html -ne "" ) { $WebResponse.Resource = New-Resource $WebResponse.Resource.Root = "" $WebResponse.Resource.Path = $WebRequest.ResourceName $WebResponse.Resource.Name = "" $WebResponse.Resource.Mime = "text/html" $WebResponse.Resource.Data = AsciiString2Bytes( $html ) $WebResponse.Resource.Size = $WebResponse.Resource.Data.Length $WebResponse.ResponseCode = "200 OK" } else { $WebResponse.ResponseCode = "404 Not Found" } if( $WebResponse.Resource -eq $null ) { # Not found $WebResponse.ResponseCode = "404 Not Found" } # Send the response. [bool] $b = Send-WebResponse $WebResponse $true if( $b -eq $false ) { return $false } # Return, OK return $true }
-
- -
Powershell習作「EjectコマンドをWindows上に実装してみた」が仮タイトルでした。
タイトルでネタバレはねぇ。