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上に実装してみた」が仮タイトルでした。
タイトルでネタバレはねぇ。