Precision Computing - Running PowerShell Scripts from Cmd.exe
DonutRapt、会社でも自宅でも常にヘビーに利用しまくってるタブブラウザ。
便利なんだけどタブが100以上とか溜まってくると次回起動時にタブを忘れてくれることがあってそれだけが問題だったんだけど、1ヶ月くらい前に「ファイル」→「保存拡張」→「タブリストを保存(Ctrl+4)」なるコマンドを発見。なーんだ、これ使えば簡単じゃん!ってことで、以後時々これを使ってタブをバックアップしてる。
ただその機能を使うと TabList.txt って固定ファイル名でバックアップされるから、自分はわざわざバックアップ後にDonutRaptのアプリケーションフォルダを開いて TabList_20060927.txt みたいに手で日付をつけ直してた。
こうすれば、いつ時点のバックアップか一目で分かるし「1年前にどんなサイト見てたかな~」なんて後で懐かしむこともできるし。
で先週末、面倒だから一連の作業をスクリプトにしちゃえーなんて思って(しまってw)、ならRuby使えば簡単だけど折角だからPowerShellだと(思ってしまったw)。
PowerShell、まだ正式リリースじゃないからWebサイトにも情報が少ないし、あっても英語のサイトがほとんど。マニュアルも英語だし、しかもマニュアルをダウンロードしようと思ってもエラーでダウンロードできない。だから実際にガシガシ組もうと思うと細かいところで躓いてWeb検索に時間が掛かる。(いま会社のPCにマニュアルを保存してたのを思い出した。少し助かった^^)
まぁそんなこんな思うところはあるものの、取り敢えず作ってみたのがこれ。
copy "TabList.txt" ("TabList_" + [DateTime]::Now.ToString("yyyyMMdd_HHmmss") + ".txt")
(9/28 もう少し考えて、今はコピー元ファイルの更新日時を付加するようにしてます)
$target = Get-ChildItem TabList.txt
copy TabList.txt ("TabList_" + $target.LastWriteTime.ToString("yyyyMMdd_HHmmss") + ".txt")
スクリプト自体はばっちり動いたんだけど、別なところでまたハマったw
実行するのに一々コマンドプロンプトを開いてDonutRaptのフォルダに移動して手打ちで実行指示するのは手でファイル名を変えるより面倒になってるじゃん!ってことで、まず拡張子(.ps1)をPowerShellと関連付けてダブルクリックで実行できるようにした。こうすればスクリプトのショートカットをQuickLaunchにでも入れとけばいつでもどこでもタスクバーからクリック一発だもんね^^
さてスクリプトファイルをクリック!
むむ、動かない。。。
'C:\Documents' is not recognized as a cmdlet, function, operable program, or script file.
At line:1 char:13
+ C:\Documents <<<< and Settings\user\My Documents\apps\DonutRAPT\TabList.ps1
拡張子関連付けのレジストリ設定にもちゃんと
"C:\Program Files\Windows PowerShell\v1.0\powershell.exe" "%1"
って設定されてるのにおかしいなぁーなんて調べ回ってたんだけど分からない。かろうじて分かったというか推測できたのは、「どうもPowerShellの起動オプションに『指定のスクリプトファイルを実行しろ』ってオプションがないっぽい?」ってこと。
普通オプション文字列でスペースを含むパスを渡す場合、それを "C:\ス ペ ー ス あり\script.ps1" みたいにダブルクォートしないといけないんだけど、囲ってしまうとPowerShell側はそれをファイルではなくコマンド文字列として解釈してしまうらしい。ちなみにダブルクォートせずに
> powershell ./tablist.ps1
ってすると、これはちゃんと実行できる。
で、仕事が落ち着いてきたからまた調べててやっと見つけたのが冒頭でリンクしてるサイト。
powershell "& '%1'"
なるほど、ダブルクォートするとコマンドとして解釈されてしまうのなら、外部スクリプト実行コマンドのパラメータに指定してやれってことですかw
PowerShellにスクリプトファイル指定のオプションさえ無いのは納得いかないけど、これくらいの次善策をすぐに思いつけないのも自分の頭が回ってないなーなんて凹む^^;
****
関連付けする場合の設定手順。
拡張子 .ps1 を PowerShell.exe に関連付けたあと、レジストリエディタで
"C:\Program Files\Windows PowerShell\v1.0\powershell.exe" "%1"
を検索(数ヶ所見つかる可能性あり)。それを
"C:\Program Files\Windows PowerShell\v1.0\powershell.exe" "& '%1'"
に書き換えればOK。
(10/12追記)
1.0 RC2は実行ファイルの場所が変更されてます。
%systemroot%\system32\WindowsPowerShell\v1.0\powershell.exe
↓ 上記の環境変数を展開した文字列で検索
(例) C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe
ただし、この検索文字列で検索すると
"C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe" -p "%1"
こーゆーのも検索ヒットするけど、これはオプションが違うから変更しちゃ駄目(な筈)。