PowerShell: ◆PowerShellスクリプトをExeに変換する
ちょっと使う機会があったのだが、パラメータ指定で躓いたのでメモしておく。
EXEで実行する時はスクリプト実行時と同じ指定ではパラメータが取ってこれない。
調べてみると以下の様に「arguments」指定が必要らしい。
| >hoge.exe –arguments –param テストパラメータ |
PowerShell: ◆PowerShellスクリプトをExeに変換する
ちょっと使う機会があったのだが、パラメータ指定で躓いたのでメモしておく。
EXEで実行する時はスクリプト実行時と同じ指定ではパラメータが取ってこれない。
調べてみると以下の様に「arguments」指定が必要らしい。
| >hoge.exe –arguments –param テストパラメータ |
McAfeeのDatバージョンとWindowsUpdateの最終更新日を毎月報告せよ、と会社からのありがたーいお達し。
いまどき、「力技でやるんかい」って突っ込みはうちの会社には通用しない。
これまでは某H社の馬鹿高いツールを使っていたのだが、よっぽど評判が悪いのか待てど暮らせどWindows8には対応してこない。
ActiveDirectoryでも入れてちょっとしたツールでも作って情報収集すれば一発なのだが、何があっても(目先の)節約至上主義の会社なので力技をこよなく好む。
とりあえず自分だけは楽をしようとスクリプトを書いてみた。
|
McAfeeのDatバージョンについてはレジストリに持っている値を使ってみました。(確実かどうかは判りません)
WindowsUpdateについては、きっとやり方が色々あるのでしょうが、今回は以下のサイトを参考にしました。
Hey, Scripting Guy! コンピューターに追加されたすべての更新プログラムの一覧を取得する方法はありますか
12行目の「QueryHistory」メソッドで履歴の開始位置と件数を指定する様なので最新の1件を取得してみました。
そのまま実行すると結果をメッセージボックス表示、パラメータを指定するとメール送信としてみました。
------
WindowsUpdateの日付については「Get-HotFix」なんてコマンドレットがあるので、そちらのほうがきっと簡単ですよね・・・。
起動中のIEをアクティブにするにはタスクマバーから選択するのが一般的だろう。
通常、ひとつのEXEしか起動していないアプリでは単純にタスクバーをクリックすればよい。
複数のEXEやIEのように複数のタブを開いているアプリケーションはカーソルを持っていくと表示されるサムネイルをクリックすることになる。
一見すばらしい機能なのだが、IEで多くのタブを開いているとサムネイル表示にもたつくこともある。
また、一般的には直近に使っていたタブを使うことが多いと思われる事からサムネイルを省略してとりあえず復帰してよ、っと思うことも多い。
たとえばタスクバーの1番目にIEを表示しているとすると、「Win + 1」で復帰すること自体は可能だ。
しかし、この機能はなぜか必ず先頭のタブを表示してしまう。(><)
単純にもとの状態に復帰するのがなかなか難しい。
「Alt + Tab」や「Win + Tab」なんかは大げさすぎるし、況やフリーソフトのタスクスイッチャーをやである。
どうしてもIEの頻度が最多なので、ダイレクトにIEに戻りたいのだ。
しかたが無いので、PowerShellでちょっと作ってみた。
アクティブにするだけならVBのライブラリーを使ってすぐできるのだが、最大化とかになるといまだにAPIの出番っぽい。
APIについては関数化されている方がいらっしゃるので、そのまま使わせて頂いた。
PowerShellからWin32APIを呼ぶ - 潜在推力
(New-PMethod関数とNew-PType関数)
| 001 002 003 004 005 006 007 008 009 010 011 012 | # ----------------------------------------------------------------------- $showWindow = New-PMethod "user32.dll" ([Bool]) "ShowWindow" @([IntPtr], [Int32]) $setForegroundWindow = New-PMethod "user32.dll" ([Bool]) "SetForegroundWindow" @([IntPtr]) # ----------------------------------------------------------------------- $ps = ,(ps iexplore) $psMain = $ps[0] | ?{$_.MainWindowTitle} $showWindow.Invoke($psMain.MainWindowHandle, 3) $setForegroundWindow.Invoke($psMain.MainWindowHandle) |
IEはひとつのWindowで複数のプロセスが動いているのでどれを使えば良いのか良くはわからないのだが、とりあえずMainWindowTitleがあるものを使ってみた。
複数のIEを立ち上げているときはうまい具合に直近に使っていたほうが表示されるようだ。
とりあえず今のところうまく動いているが、非力なマシンでは常駐化とかを考えないと使用に耐えないだろう。(PC起動時もバックグラウンドでごちゃごちゃ動いているので落ち着くまでは遅い)
私はこれにショートカットを割り当て、多機能マウスのボタンに割り当てて使っている。
なんにしても本来PowerShellねたでは無いと思うので具合が良いようであれば別途移植を考えたい。
以下の記事を読んでいて気づいたこと。
Unblocking Download Files - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources
ダウンロードフォルダーのパスを「$Home\Downloads」で取ってきているが、私の環境では取得できなかった。
私は基本的にプロファイルにぶら下がったフォルダーはすべてDドライブに移動しているので「D:\Downloads」になっている。
全うな取得方法を探してみたのだが、スペシャルフォルダーとかには「Downloads」は見当たらない。
止む無く、レジストリーを見渡したらIEのキーにDownloadsがあったのでとりあえずそれを使う事とした。
| PS>$ieRegKey = "hkcu:\Software\Microsoft\Internet Explorer\Main" |
もう少し全うな方法があるのかしらん・・・
ForEachステートメントなどでは「continue」や「break」が使える(PowerShell: ◆ループを抜ける)が、Foreach-Objectコマンドレットではうまく行かないようだ。
頼まれてCSVを編集するスクリプトを作った。
CSVなら簡単簡単と思ったのだが(実際すぐにできたのだが)、出力されたCSVを見て、「ダブルクォーテーション無しにできる?」と言われてはたと考えてしまった。
簡単にできそうなものなのだが、コマンドレットでは対応していない感じ・・・。
ネットで調べても、「あとからReplaceして消せ」みたいな意見が主流。
そもそもニーズがあまり無いのかしらん・・・。
でも~、ExcelなんかでCSV作るとダブルクォーテーションは付いていないのよね。
なんかいただけない感じ。
仕方なく、ダブルクォーテーションを消したのだが、もうひとつおかしな点を指摘された。
項目の後ろにあるスペースが削られてしまうのだと。
見てみると、後ろのスペースは1つ(1バイト)になってしまう。
元のデータにダブルクォーテーションがついていないからなのですかね。
しかも、調べてみると、インポートでも削られるしエクスポートでも削られる仕様の様だ・・・。(><)
結構厳しいなあ・・・。
暫定的に、適当なエンドマークをスペースの後ろにくっ付けてスペースが削除されないようにしておき、後でエンドマークを削るなんて処理でごまかした。
まったく別の方法として、CSV系のコマンドレットを使わずに、CSVを配列に入れて処理して、最後にまたくっ付けるなんてのも有りか。
添え字参照になるので、保守性が今一つなのと、なんといってもこいつは処理が重い。
コマンドレットで対応しないかなぁ・・・。