先ほどの例はPCにPython環境が設定されていなければ動作しないものだった。
しかし、PowershellはVista以降のPCには標準搭載されている機能なので、汎用性がある。
PowershellはそもそもWSHの後釜として作られたものでWMIへのアクセスなどがWSHに比べて格段に容易に記述することができる他、WSHと比較して最大?の進歩といえば「.NETの全機能を利用できる」ということである。
1: Set objShell = CreateObject("WScript.Shell")
2: Set objExec = objShell.Exec("powershell -command [math]::sqrt(2)")
3: objExec.StdIn.Close()
4: fb.trace("2の平方根 = "+objExec.StdOut.Readall())
5: set objExec = Nothing
6: set objShell = Nothing
算術計算には[Math]::関数が利用できる。
1: Set objShell = CreateObject("WScript.Shell")
2: Set objExec = objShell.Exec("powershell -command [Console]::Beep(440, 1000)")
3: objExec.StdIn.Close()
4: set objExec = Nothing
5: set objShell = Nothing
Beep音を鳴らすこともできる。上ではド。
ちなみに少し音楽理論を、周波数と音階の関係は基音を69のC(440Hz)とすると
f = 440 * 2 ^((n-69)/12)となる。
なので、WSH Panel Mod経由でPowerShellからNETのBeep関数を利用してドレミファソラシドを鳴らすスクリプトは以下のようになる。
1: Set objShell = CreateObject("WScript.Shell")
2: cmd = "[Console]::Beep("+CStr(440*2^((69-69)/12))+", 1000);"
3: cmd = cmd + "[Console]::Beep("+CStr(440*2^((71-69)/12))+", 1000);"
4: cmd = cmd + "[Console]::Beep("+CStr(440*2^((73-69)/12))+", 1000);"
5: cmd = cmd + "[Console]::Beep("+CStr(440*2^((74-69)/12))+", 1000);"
6: cmd = cmd + "[Console]::Beep("+CStr(440*2^((76-69)/12))+", 1000);"
7: cmd = cmd + "[Console]::Beep("+CStr(440*2^((78-69)/12))+", 1000);"
8: cmd = cmd + "[Console]::Beep("+CStr(440*2^((80-69)/12))+", 1000);"
9: cmd = cmd + "[Console]::Beep("+CStr(440*2^((81-69)/12))+", 1000);"
10: Set objExec = objShell.Exec("powershell -command "+cmd)
11: objExec.StdIn.Close()
12: set objExec = Nothing
13: set objShell = Nothing
基音のドはn=69なので上の数式に当てはめると
f(周波数)=440*2^((69-69)/12)=440*2^(0/12)=440Hzとなる
レはドの#の次の音なので
f(周波数)=440*2^((71-69)/12)=440*2^(2/12)となる
ちなみに隣り合っている音(ミとファ、シとド)などではnは1しか増えない、それ以外は2ずつ増えていることがわかる。
なお、このスクリプトを実行させるために色々試行錯誤はしたが中々思うように動かないことがあった。
その際、MSDNコミュニティで親切に質問に答えてくださったMVPの牟田口大介さんには感謝しもしきれません。
0 件のコメント:
コメントを投稿