「送る」にファイル内テキスト表示を設定する<2>~文字化け対応
5年ぶりに前回の続き。 時代の流れもあって、目にするファイルの多くがユニコードになってきた。前回のやつはシフトJIS前提なもので、文字化けする。ま、ユニコード対応自体は、さして難しくない。前のコードのgc -ra $sをgc -ra gc -ra -en utf8 $sにするだけだからね。 問題は、ショートカットの※リンク先欄の制限文字数。260文字が上限らしいが、とても2つ分は入らない。さらに、ファイルのエンコードを判定する処理も必要とあって、普通ならショートカット起動を諦めてps1なりバッチなりにするところ。※前回は「リンク先」じゃなく「項目の場所」だった。ここにも5年の時の流れ。 でも、それだと出るんですよ。ファイルを右クリックして「送る」から「内容表示」を選んだ途端、お化けならぬ端末の黒画面が。これを避けるのが「ショートカット」。リンク先にcmdとかpowershellに続けて実行内容を書けばその通りやってくれる。いわば、ミニスクリプトとして機能する。そして、ショートカットはプロパティで実行時の大きさを「最小化」にしてやることで、端末画面を見せなくすることができる。 で、考えたのが「表示u.lnk」「表示s.lnk」「内容表示.lnk」の3本構成。ユニコード用、SJIS用の表示ショートカットと文字判別をしそれぞれに振り分けるショートカット。「表示u.lnk」「表示s.lnk」はファイル属性を「隠しファイル」にしておけば、右クリックメニューにも現れない。表示u.lnkの「リンク先」powershell -w h "add-type -a system.windows.forms;function s($s){$d=[windows.forms.form]::new();new-object windows.forms.label -p @{parent=$d;text=gc -ra -en utf8 $s;autosize=1};$d.autoscroll=1;$d.showdialog()};s表示s.lnkの「リンク先」powershell -w h "add-type -a system.windows.forms;function s($s){$d=[windows.forms.form]::new();new-object windows.forms.label -p @{parent=$d;text=gc -ra;autosize=1};$d.autoscroll=1;$d.showdialog()};s内容表示.lnkの「リンク先」powershell -w h "function p($f){$u=$env:APPDATA+'\Microsoft\Windows\SendTo\表示u.lnk';$s=$u.replace('u.','s.');try{[IO.File]::ReadAllText($f, (new-object Text.UTF8Encoding(0, 1)));Start $u -A $f}catch{Start $s -A $f}};p