「選択範囲のURL・パスを開く」の版間の差分
ナビゲーションに移動
検索に移動
細 →ソースコード |
第2版 |
||
| 1行目: | 1行目: | ||
「'''日本語URL'''」など、ダメ文字を含むためにダブルクリックやコンテキストメニューの「URLを開く」コマンドでは開けない URL 文字列を '''既定のブラウザ'''で 開きます(http:// か https:// が先頭にあるもののみ)。<br> | |||
''' | 「<nowiki>mailto:</nowiki>」が付いていないメールアドレスも '''既定のメールクライアント''' で開きます。 | ||
また、文字列がファイルやフォルダのパスであればこれも '''既定のプログラム''' で開きます。 | |||
'''複数行''' にリストアップした URL やパスを一括で開いたり、特定のキーワードを範囲選択して実行することで「'''お気に入り'''」の URL やパスを開いたりできますので、簡易的なテキストランチャとしても使用できます。 | |||
仕様についてはソースコード内の ''/**コメントドキュメント*/'' の部分を参照してください。 | |||
== ソースコード == | == ソースコード == | ||
* ダウンロード: 「[[#ファイル:選択範囲のURL・パスを開く.zip|選択範囲のURL・パスを開く.zip]]」(アイコン入り) | |||
#title = "選択範囲のURL/パスを開く" | #title = "選択範囲のURL/パスを開く" | ||
| 14行目: | 19行目: | ||
/** | /** | ||
* ① | * ①: Mery では " < > 以外にも ! ' ( ) * [ ] ^ ` { | } が URL の'''ダメ文字'''扱いになっていますが、 | ||
* | * ダメ文字をふくむ URL 文字列でも既定のブラウザで開きます。 | ||
* | * ※文字列を「 " " 」で囲って丸投げするだけなので、URLエンコードはブラウザ任せです。 | ||
* | * 「'''日本語URL'''」への対応はブラウザ側の仕様に依存します。 | ||
* | * ※開けるのは先頭に '''http;//''' か '''https://''' がついた URL 文字列のみです。 | ||
* | * | ||
* | * ②: メールアドレスなら既定のメールクライアントでメッセージを新規作成します。 | ||
* | * ※'''mailto:''' の有無によらずにメールアドレス文字列を開きます。 | ||
* | * ※メールアドレスとおなじ名前のフォルダを相対パスや PATH 略記のパスとして優先的に開きたい場合は、 | ||
* | * ② のコードを下位(⑩の上)に移動させてください。 | ||
* ※メールアドレスの判定基準は「メールアドレス 正規表現」で検索トップにあったサイトからの拾い物です。 | |||
* ref. 『メールアドレスを表す現実的な正規表現 - Qiita』 | |||
* https://qiita.com/sakuro/items/1eaa307609ceaaf51123 | |||
* | |||
* ③: 選択範囲の文字列がファイルやフォルダのフルパスなら、実在確認して既定のプログラムで実行します | |||
* (環境変数を '''%PATH%''' 形式で短縮したパスも展開し、実在確認をして既定のプログラムで実行します)。 | |||
* ネットワークフォルダの '''\\パス''' も、実在確認をして既定のプログラムで実行します。 | |||
* ④: 環境変数を '''%PATH%''' 形式で短縮したパスの場合は、省略された拡張子も補完します。 | |||
* ※実行ファイルに引数を渡す場合は、パスを「 '''" "''' 」で囲ってください(後述)。 | |||
* | |||
* ⑤~⑦: アクティブなドキュメントのカレントディレクトリからの相対パスとして | |||
* ファイルやフォルダの実在確認ができるなら、既定のプログラムで実行します。 | |||
* ※処理できる相対パスの形式は、 | |||
* ⑤: 先頭にだけに '''..\''' または '''.../''' が付いたものか(拡張子を補完しない) | |||
* ⑥: カレントディレクトリまでのパスを完全に省略したもののみで、 | |||
* パスの途中にも '''.\''' などがあるものは処理しません。 | |||
* ⑦: ⑥のパターンにたいして、省略された拡張子を補完します。 | |||
* | |||
* ⑧: システム環境変数 '''PATH''' を省略したパスを補完し、実在確認をして既定のプログラムで実行します。 | |||
* ⑨: 拡張子 '''PathExt''' が省略されたものも、定義配列から実在確認を試行して実行します。 | |||
* ※WshShell.Run() は本来 PATH や PathExt (および App Paths)を補完して実行させられますが | |||
* 実在確認してから実行させないとマクロのエラーとして扱われてしまうので、 | |||
* ⑧,⑨ で処理するシステム環境変数 PATH は、定義配列に手動で列挙したもののみとします。 | |||
* ※App Paths も、Path の定義配列に親フォルダのパスを手動で追加しないと処理しません | |||
* (App Paths はプログラムのインストーラがレジストリに書き込んだ PATH の代用機能。 | |||
* キー名で実行するとキーの配下に記述されたプログラムを起動できます)。 | |||
* [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths] | |||
* | |||
* ⑩: '''file://'''~ への絶対パスを既定のプログラムで実行します。 | |||
* ※先頭の "file://" を外しローカルファイルとして実在確認をしてから | |||
* ドライブ名以降のパスを WshShell.Run() に投げて実行させます。 | |||
* | |||
* ⑪: なんでもいいから WshShell.Run() に投げて実行させます。 | |||
* shell:コマンドなどパスのかたちを取っていないものはこれでしか実行できませんが、ミスタイプや | |||
* ファイルやフォルダが実在しない場合にはマクロのエラーとして扱われるので「●非推奨」です。 | |||
* ※設定変数により ⑪ のコードは初期状態で無効化してあります。 | |||
* | |||
* ▼ 共通 ▼ | |||
* ・基本的に範囲選択して実行する前提です。 | |||
* 複数行の各行にひとつずつ列挙された URL/パス をそれぞれ実行することもできます | |||
* (それぞれを既定のプログラムで実行します)。 | |||
* 範囲選択なしのときは、アクティブな論理行の文字列を取得して URL/パス を実行します。 | |||
* 選択範囲や各行の先頭/末尾の「空白文字」「 <> 」は無視します。 | |||
* | * | ||
* | * ・① URL、② メールアドレス、⑩ ネットワークパスは、実在確認なしで実行します、 | ||
* | * ③~⑨ ローカルファイル/フォルダのパスは、実在確認して実行します。 | ||
* ・'''%PATH%''' 形式で略記されたパスは、展開してから実在確認して実行します。 | |||
* | * | ||
* | * ・選択範囲や各行内に「 '''" "''' 」で囲われた部分があれば、 | ||
* | * 「 '''" "''' 」内をパス(コマンド)と見做し、以降を引数(コマンドラインオプション)として処理します。 | ||
* <span style="color:#c00;">※※※ 基本的に引数つきのコマンドラインをする前提ではありません ※※※</span> | |||
* 引数部分の「 '''" "''' 」の有無は考慮せず、WshShell.Run() にそのまま渡します。 | |||
* 引数部分で環境変数 Path, PathExt でディレクトリパスや拡張子を省略されていても | |||
* マクロでは補完処理しません(環境変数 Path, PathExt の定義用配列も適用されません)。 | |||
* 引数部分は実在確認しないので、 %PATH% も展開しないでそのまま渡します。 | |||
* 選択範囲の先頭に「 '''" "''' 」で囲われた部分がない場合は、引数付きのコマンドであっても実行しません | |||
* (パスの中に半角スペースがあっても「 '''" "''' 」なしで開けることを優先するための仕様です)。 | |||
* | * | ||
* | * ・選択範囲の文字列の先頭が「 '''"''' 」でそれを閉じる「 '''"''' 」の位置が不適切(または閉じる「 '''"''' 」がない)場合、 | ||
* | * ⑥ のコードにより "アクティブなドキュメントのカレントフォルダ" が開くようです… | ||
* | * (これはこれで、あえて「 '''"''' 」だけでマクロを実行すると便利なのでデバッグしないで残しておきます)。 | ||
* また、選択範囲の文字列がドット「 '''.''' 」だけで実行すると | |||
* ③ のコードにより Mery 起動時の「カレントフォルダ(作業フォルダ)」が開きます… | |||
* (これもこれで面白いので、あえてデバッグしないで残しておきます)。 | |||
* | * | ||
* | * ・拡張子 PathExt の補完は、④, ⑦, ⑨ の場合のみとします。 | ||
* | * | ||
* | * ・「お気に入り」の URL やパスを特定の「キーワード」開くこともできます。 | ||
* | * | ||
* | * <b style="color:#c00;">以下のような 文字列/論理行 を開くことができます</b> | ||
*(行頭/行末の空白は無視し、無効な行はスキップします)。 | |||
▼ | ▼ 日本語や半角スペースなどのダメ文字を含むURL(http:// があるもののみ) ▼ | ||
https://www.haijin-boys.com/wiki/<nowiki>よくある質問#.E6.97.A5.E6.9C.AC.E8.AA.9E.E3.82.92.E5.90.AB.E3.82.80_URL_.E3.82.92.E8.AA.8D.E8.AD.98.E3.81.97.E3.81.9F.E3.81.84</nowiki> | "https://www.haijin-boys.com/wiki/<nowiki>よくある質問#.E6.97.A5.E6.9C.AC.E8.AA.9E.E3.82.92.E5.90.AB.E3.82.80_URL_.E3.82.92.E8.AA.8D.E8.AD.98.E3.81.97.E3.81.9F.E3.81.84"</nowiki> | ||
https://www.haijin-boys.com/wiki/<nowiki>マクロリファレンス:Selection インターフェイス</nowiki> | https://www.haijin-boys.com/wiki/<nowiki>マクロリファレンス:Selection インターフェイス</nowiki> | ||
▼ | |||
▼ メールアドレス(mailto: あり/なし) ▼ | |||
< hogehoge@example.com > | < hogehoge@example.com > | ||
▼ | |||
▼ ファイル/フォルダパス(絶対パス:フルパス) ▼ | |||
C:\Program Files | C:\Program Files | ||
"c:\windows\system32\notepad.exe" | "c:\windows\system32\notepad.exe" | ||
file:///c: | |||
▼ アクティブなドキュメントからの相対パス(..\ 形式の場合は、要 拡張子) ▼ | |||
"連続する重複行を削除" | |||
..\Mery.ini | |||
▼ 環境変数で短縮/省略されたパス ▼ | |||
%PROGRAMFILES%\internet explorer\iexplore | |||
"calc" | |||
regedit | |||
"notepad" "%PROGRAMFILES%\Mery\Mery.txt" | |||
"explorer" /select, %USERPROFILE%\ntuser.ini | |||
▼ インターネットアドレス形式のパスやネットワークパス、[●非推奨 shell:コマンド(※実在確認なし)] ▼ | |||
file:///c:/boot.ini | |||
\\Android\shared | |||
shell:Desktop | |||
* | * | ||
*/ | */ | ||
<source lang="javascript"> | <source lang="javascript" style="height:40em; overflow:auto;"> | ||
// ■ 「お気に入り(特定のキーワード)」を実行可能な URL/パス に変換する ■ | |||
var favoritesEnable = true; | |||
// ▼ 「お気に入り」の URL/パス とキーワードを登録 ▼ | |||
// \ は2つ重ね \\ にすること | |||
var favorites = new Array( | |||
[ "https://www.haijin-boys.com/", "blog", "ブログ" ], | |||
[ "https://www.haijin-boys.com/wiki/メインページ", "wiki", "ウィキ" ], | |||
[ "https://www.haijin-boys.com/wiki/マクロライブラリ", "マクロライブラリ", "ライブラリ" ], | |||
[ "https://www.haijin-boys.com/wiki/マクロリファレンス", "マクロリファレンス", "リファレンス" ], | |||
[ editor.FullName.replace( /mery\.exe$/i , "mery.txt" ), "readme" ], | |||
[ "%USERPROFILE%\\desktop" , "desktop", "デスクトップ" ], | |||
// [ "(※eメールクライアントのパス)" , "(※自分のeメールアドレス)" ], | |||
// [ "" , "" ], | |||
// [ "" , "" ], | |||
// [ "" , "" ], | |||
"" ); | |||
// カレントフォルダはアクティブなドキュメントの親フォルダ | |||
// ■ 「無題」のドキュメントの場合は Mery の実行フォルダ ■(変更する場合は末尾に \\ をつける) | |||
var $parentFolder = document.FullName ? document.Path | |||
: editor.FullName.replace( /mery\.exe$/i , "" ); | |||
// ■ 省略可能なフォルダパスの 環境変数 PATH の代わりに ■ | |||
// \ は2つ重ね \\ にすること (前に置いたものが優先) | |||
var $envPathArray = new Array( | |||
editor.FullName.replace( /\\mery\.exe$/i , "" ) , // Mery フォルダ | |||
editor.FullName.replace( /\\mery\.exe$/i , "\\macros" ) , // Mery\Macros フォルダ | |||
ScriptFullName.replace( RegExp( "\\" + ScriptName + "$" , "i" ) , "" ) , // このマクロの保存フォルダ | |||
"c:\\windows" , "c:\\windows\\system32" , | |||
); | |||
// ■ 省略可能な拡張子の環境変数 PathExt ■ (前に置いたものが優先) | |||
// ※ ".CPL"(コントロールパネルアプレット)は不可 → ショートカットファイルを Path 配列にあるフォルダに置けば実行可 | |||
var $pathExtArray = new Array( | |||
".LNK" , ".URL" , // リンク拡張子とインターネットショートカット拡張子 | |||
".COM" , ".EXE" , ".BAT" , ".CMD" , ".VBS" , ".VBE" , | |||
".JS", ".JSE" , ".WSH" , ".WSF" , ".MSC" , ".PSC1" , ".SCR" | |||
); | |||
// ■ アウトプットバーに結果を表示する? ■ (デバッグ用) | |||
var outputEnable = false; | |||
// ■ なんでもいいから WshSlell.Run() に投げる? ■ [非推奨] コード ⑪番 | |||
// カレントフォルダ/PATH/App Paths/PathExt の補完で実行されるかもしれないが、それ以外は Mery のエラー(マクロのエラー)になる | |||
var forceRunEnable = false; | |||
Status = "Open Sesame!"; | |||
// 日時を出力 YYYY-MM-DD hh:mm:ss UTC+9000 | |||
Output( DateTime( "-", true ) + '\nGo "Open Sesame !!" >>> ' | |||
+ ( document.FullName ? document.FullName : "「無題」ドキュメント" ) + '"' ); | |||
// | // 選択範囲がないときは論理行を選択 | ||
var s = document.selection; | var s = document.selection; | ||
var | var $str = s.IsEmpty ? document.GetLine( s.GetActivePointY( mePosLogical ), 0 ) | ||
: s.Text; | |||
// 空白文字列なら | |||
if ( $str.match( /^[\s ]*$/g ) ) { | |||
Output( "Text is Empty" ); | |||
Quit(); | |||
} | |||
var WshShell = new ActiveXObject( "WScript.Shell" ); | var WshShell = new ActiveXObject( "WScript.Shell" ); | ||
var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); | var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); | ||
// | // 選択範囲を各行ごとに開けるよう、論理行を配列に | ||
var $strArray = $str.split( "\n" ); | |||
var yy = s.GetTopPointY( mePosLogical ); | |||
// | |||
perLineLoop: | |||
for ( var i = 0, hit = 0; i < $strArray.length; i ++ ) { | |||
// 論理行の番号を取得 | |||
if ( outputEnable ) | |||
var $line = "[#" + ( yy + i ) + "] "; | |||
// 各行の先頭/末尾の空白文字と " < > を除去 | |||
var st = $strArray[i].replace( /^[\s <>]*|[\s <>]*$/g , "" ); | |||
// 選択範囲 (行) の文字列が特定のキーワードであれば「お気に入り」の URL/パス に変換する | |||
if ( favoritesEnable ) | |||
st = ConvertFavorites( st ); | |||
if ( st.match( /^[\s ]*$/ ) ) { | |||
Output( $line + "is Empty Line", 0 ); | |||
continue; | |||
} | |||
// ① 文字列がURLなら既定のブラウザで開く | |||
if ( st.match( /^"?https?:\/\// ) ) { | |||
WshShell.Run( '"' + st.replace( /^"|"$/g , "" ) + '"' ); | |||
Output( $line + "① Open Link: " + st , 1 ); | |||
continue perLineLoop; | |||
} | |||
// ② 文字列がメールアドレスなら既定のメールクライアントで開く(エンコードなし) | |||
if ( ! st.match( /:\/|:\\/ ) && st.length < 255 | |||
&& st.match( /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]{1,64}@[a-zA-Z0-9-]{1,63}(?:\.[a-zA-Z0-9-]+)*$/ ) | |||
) { | |||
WshShell.Run( "mailto:" + st.replace( /^"|"$|^mailto:/g , "" ) ) | |||
Output( $line + "② Open: " + "\"mailto:" + st.replace( /^"|"$|^mailto:/g , "" ) + '"' , 1 ); | |||
continue perLineLoop; | |||
}; // end ② | |||
if ( st.match( /^[\s \\/:,;"*?<>|]*$/ ) ) { | |||
Output( $line + "※ Bad character(s)" ); | |||
continue; | |||
} | |||
var $command, $command_Op; | |||
// 文字列に "" で囲われている部分があれば、"コマンド" と 引数 として分離する | |||
if ( st.match( /^"/ ) && st.substr( 1 ).search( /"(?=\s|$)/ ) ) { | |||
var $secondWQuoteID = st.substr( 1 ).search( /"/ ); | |||
$command = WshShell.ExpandEnvironmentStrings( st.substr( 1, $secondWQuoteID ) ); | |||
$command_Op = " " + st.substr( 2 + $secondWQuoteID ).replace( /^\s*/ , "" ); | |||
} | |||
else { | |||
$command = WshShell.ExpandEnvironmentStrings( st ); | |||
$command_Op = ""; | |||
} | |||
// 文字列中の %PATH% を展開した場合のフラグ(先頭3文字を比較) | |||
if ( $command.substr( 0, 3 ) != st.replace( /^"/ , "" ).substr( 0, 3 ) ) { | |||
var $expand = true; | |||
Output( $line + "※ Expand " + st + ": " + $command + $command_Op, 0 ); | |||
} | |||
// | // ③ 文字列が ファイル/フォルダ パスなら既定のプログラムで開く(実在確認して実行) | ||
if ( ! $command.match( /^[^.]\.+[\\/]/ ) | |||
WshShell.Run( '"' + | && ( Fso.FolderExists( $command ) || Fso.FileExists( $command ) ) | ||
) { | |||
WshShell.Run( '"' + $command + '"' + $command_Op ); | |||
Output( $line + "③ Open File / Folder: \"" + $command + '"' + $command_Op , 1 ); | |||
continue perLineLoop; | |||
} // end ③ | |||
// | // ④ %PATH% 形式の短縮パスで拡張子も省略されている場合(実在確認して実行) | ||
if ( $expand ) { | |||
percentPathExtLoop: | |||
for ( var j = 0; j < $pathExtArray.length; j ++ ) { | |||
var $percentPathExt = ( $command + $pathExtArray[j] ); | |||
if ( Fso.FileExists( $percentPathExt ) ) { | |||
WshShell.Run( '"' + $percentPathExt + '"' + $command_Op ); | |||
Output( $line + "④ Open File / Folder + .EXT: \"" | |||
+ $percentPathExt + '"' + $command_Op , 1 ); | |||
continue perLineLoop; | |||
} | |||
} | |||
} // end ④ | |||
// | // ⑤ 文字列が ..\相対パス または ../相対パス の場合(実在確認して実行) | ||
if ( $command.match( /^\.+(?:[\\/][^\\/:,;"*?<>|]+)+/ ) | |||
// | && ! $command.match( /(?:[\\/]{2,}|^[^.]+\.+[\\/])/ ) | ||
) { | |||
var $dotCount = $command.search( /[\\/]/ ); | |||
var $pathArray = $parentFolder.replace( /\\/g , "/" ).split( "/" ); | |||
for( var j = 0; j < $dotCount; j ++ ) { | |||
$pathArray.pop(); | |||
} | |||
var $relativePath = $pathArray.join( "\\" ) + $command.replace( /^\.+/ , "" ); | |||
if ( Fso.FolderExists( $relativePath ) || Fso.FileExists( $relativePath ) ) { | |||
WshShell.Run( '"' + $relativePath + '"' + $command_Op ); | |||
Output( $line + "⑤ Open as ..\\ Relative path: \"" | |||
+ $relativePath + '"' + $command_Op , 1 ); | |||
continue perLineLoop; | |||
} | |||
} // end ⑤ | |||
// | // ⑥ - ⑨ 文字列にドライブルートがない場合 | ||
if ( ! $command.match( /^[a-z]:[\\/]/i ) && ! $command.match( /(?:[\\/]{2,}|^\.+[\\/])/ ) ) { | |||
var $relativePath = $parentFolder + $command.replace( /^\\/ , "" ); | |||
if ( | |||
WshShell.Run( '"' + | // ⑥ 文字列がカレントフォルダ内の相対パスの場合(実在確認して実行) | ||
if ( $relativePath.replace( /\\+$/ , "" ) != $parentFolder.replace( /\\+$/ , "" ) | |||
&& ( Fso.FolderExists( $relativePath ) || Fso.FileExists( $relativePath ) ) | |||
) { | |||
WshShell.Run( '"' + $relativePath + '"' + $command_Op ); | |||
Output( $line + "⑥ Open as Relative path: \"" | |||
+ $relativePath + '"' + $command_Op , 1 ); | |||
continue perLineLoop; | |||
} // end ⑥ | |||
// ⑦ 文字列がカレントフォルダ内の相対パス(拡張子なし)の場合(実在確認して実行) | |||
else { | |||
relativePathExtLoop: | |||
for ( var j = 0; j < $pathExtArray.length; j ++ ) { | |||
var $relativePathExt = ( $relativePath + $pathExtArray[j] ); | |||
if ( Fso.FileExists( $relativePathExt ) ) { | |||
WshShell.Run( '"' + $relativePathExt + '"' + $command_Op ); | |||
Output( $line + "⑦ Open as Relative path + .EXT: \"" | |||
+ $relativePathExt + '"' + $command_Op , 1 ); | |||
continue perLineLoop; | |||
} | |||
} // end ⑦ | |||
} | |||
// ⑧ システム環境変数 Path を省略したパスなら | |||
sysEnvPathOuterLoop: | |||
for ( var k = 0; k < $envPathArray.length; k ++ ) { | |||
sysEnvPathInnerLoop: | |||
for ( var j = 0; j < $pathExtArray.length; j ++ ) { | |||
var $sysEnvPath = ( $envPathArray[k] + "\\" + $command.replace( /^\\/ , "" ) ); | |||
if ( Fso.FolderExists( $sysEnvPath ) || Fso.FileExists( $sysEnvPath ) ) { | |||
WshShell.Run( '"' + $sysEnvPath + '"' + $command_Op ); | |||
Output( $line + "⑧ Open PATH w/expand: \"" | |||
+ $sysEnvPath + '"' + $command_Op , 1 ); | |||
continue perLineLoop; | |||
} // end ⑧ | |||
// ⑨ 拡張子 PathExt とシステム環境変数 Path を省略したパスなら | |||
if ( ! $command.match( /\\[^\\/:,;"*?<>|]+\.[^\\/:,;"*?<>|]+$/ ) ) { | |||
var $sysEnvPathExt = ( $sysEnvPath + $pathExtArray[j] ); | |||
if ( Fso.FileExists( $sysEnvPathExt ) ) { | |||
WshShell.Run( '"' + $sysEnvPathExt + '"' + $command_Op ); | |||
Output( $line + "⑨ Open PATH w/expad + .EXT: \"" | |||
+ $sysEnvPathExt + '"' + $command_Op , 1 ); | |||
continue perLineLoop; | |||
} | |||
} // end ⑨ | |||
} // end sysEnvPathinnerLoop | |||
} // end sysEnvPathOuterLoop | |||
} // end ⑥ - ⑨ | |||
// ⑩ 文字列が file:// ~ の場合(実在確認して実行) | |||
if ( $command.match( /^file:\/\// ) ) { | |||
var $command_Test = CommandTest( $command, "file://" ); | |||
if ( $command_Test ) { | |||
WshShell.Run( '"' + $command_Test + '"' + $command_Op ); | |||
Output( $line + "⑩ Open File / Folder on localhost: \"" | |||
+ Fso.GetAbsolutePathName( $command_Test ) + '"' + $command_Op , 1 ); | |||
continue perLineLoop; | |||
} | |||
} // end ⑩ | |||
// ⑪ なんでもいいからそのまま WshSlell.Run() に投げる | |||
if ( forceRunEnable ) { | |||
WshShell.Run( $command + $command_Op ); | |||
WshShell.Run( '"' + $command + '"' + $command_Op ); | |||
Output( $line + "⑪ Force Try: " + $command + $command_Op , 1 ); | |||
continue perLineLoop; | |||
} // end ⑪ | |||
else | |||
Output( $line + "× " + st ); | |||
} // end perLineLoop | |||
if ( ! hit ) { | |||
Status = " URL / パス として開けませんでした"; | |||
} | } | ||
// | // ------------------------------------------------------------ | ||
var | /* 関数 ConvertFavorites( st ) */ | ||
// お気に入り URL/パス へのキーワードを置換する | |||
for( var | function ConvertFavorites( str ) { | ||
var dist = str; | |||
Outer: | |||
for ( var j = 0; j < favorites.length; j ++ ) { | |||
if ( ! favorites[j] || ! favorites[j][0] ) | |||
continue; | |||
Inner: | |||
for ( var k = 1; k < favorites[j].length; k ++ ) { | |||
if ( ! favorites[j][k] ) | |||
continue; | |||
if ( favorites[j][k] == str ) { // ヒットしたら | |||
dist = favorites[j][0]; // いちばん左の要素を返す | |||
Output( $line + '※ Favorite ' + '"' + str + '": ' + dist ); | |||
break Outer; | |||
} | |||
} | |||
} | |||
return dist; | |||
} | } | ||
/* 関数 Output( string, num ) */ | |||
// アウトプットバーに結果を出力する | |||
function Output( str, num ) { | |||
if ( outputEnable ) // 出力許可フラグ | |||
OutputBar.Writeln( str ); | |||
if ( num ) | |||
hit += num; // ヒットフラグをインクリメント | |||
} | |||
/* 関数 DateTime( bar, utc ) */ | |||
// 現在日時を日本時間 "YYYY-MM-DD hh:mm:ss UTC+9000" で返す | |||
// 引数を省略した場合は "YYYY/MM/DD hh:mm:ss" で返す | |||
function DateTime( separator, utc ) { | |||
var date = new Date(); | |||
var bar = separator ? separator : "/"; | |||
var utc = utc ? " " + date.toString().replace( /^.+(UTC\+\d{4}).+$/ , "$1" ) : ""; | |||
// 文字列中の半角1ケタの数字を0埋めして2ケタで返す Pad( str ) | |||
var Pad = function( str ) { | |||
return str.replace( /\b[0-9]\b/g , function( $0 ) { // 半角英数で囲われていない1ケタの数字 | |||
return "0" + $0; | |||
} ) }; | |||
return Pad( | |||
date.getFullYear() + bar + ( date.getMonth() + 1 ) + bar + date.getDate() + " " | |||
+ date.toLocaleTimeString( "ja-JP" ) | |||
+ utc ); | |||
} | |||
/* 関数 CommandTest( $command, "file://" ) */ | |||
// "file:// ~" をローカルファイルとして実在確認する | |||
function CommandTest( str, scheme ) { | |||
// ドライブ名 "c:/" の部分があるかチェックして "c:/ ~ " のパスが実体があるか確認 | |||
var $driveNameID = str.slice( scheme.length ).search( /[^.\\/]:[\\/]/ ); | |||
if ( $driveNameID >= 0 ) { | |||
if ( Fso.FolderExists( str.slice( scheme.length + $driveNameID ) ) | |||
|| Fso.FileExists( str.slice( scheme.length + $driveNameID ) ) | |||
) { | |||
return str.slice( scheme.length + $driveNameID ); | |||
} | |||
} | |||
} | } | ||
</source> | </source> | ||
== メモ == | == メモ == | ||
試作品です。動作の確実性については全く自信ありません。<br> | |||
試作品です。動作の確実性については全く自信ありません。 | |||
<br> | |||
---- | |||
*2018/12/05 (sukemaru) | |||
:・一応、相対パスで記述した M3U プレイリストファイルからメディアファイルを開くことはできるようです。 | |||
---- | |||
*2018/12/05 (sukemaru) | |||
:・環境変数 PATH や PathExt を補完する代替機能、%PATH% の展開、「お気に入り」の URL / パスの登録、複数行にリストアップした URL やパスの一括処理など、思いつきで機能を盛ってみましたがコードを整理できていません。 | |||
:・環境変数 PATH の取得は自動化することもできますが、通常の使用では不要なものも多く、優先度(順番)も最適化されていないので手動で登録するかたちにしてあります。 | |||
:・デバッグ用にアウトプットバーへの出力コードが入ったままになっていますが、設定用の変数で無効化してあります。 | |||
---- | |||
<br> | |||
* ascii 文字 | * ascii 文字 | ||
2018年12月8日 (土) 21:57時点における版
「日本語URL」など、ダメ文字を含むためにダブルクリックやコンテキストメニューの「URLを開く」コマンドでは開けない URL 文字列を 既定のブラウザで 開きます(http:// か https:// が先頭にあるもののみ)。
「mailto:」が付いていないメールアドレスも 既定のメールクライアント で開きます。
また、文字列がファイルやフォルダのパスであればこれも 既定のプログラム で開きます。
複数行 にリストアップした URL やパスを一括で開いたり、特定のキーワードを範囲選択して実行することで「お気に入り」の URL やパスを開いたりできますので、簡易的なテキストランチャとしても使用できます。
仕様についてはソースコード内の /**コメントドキュメント*/ の部分を参照してください。
ソースコード
- ダウンロード: 「選択範囲のURL・パスを開く.zip」(アイコン入り)
#title = "選択範囲のURL/パスを開く"
#tooltip = "選択範囲のURLやパスを既定のプログラムで開く"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",40
/**
* ①: Mery では " < > 以外にも ! ' ( ) * [ ] ^ ` { | } が URL のダメ文字扱いになっていますが、
* ダメ文字をふくむ URL 文字列でも既定のブラウザで開きます。
* ※文字列を「 " " 」で囲って丸投げするだけなので、URLエンコードはブラウザ任せです。
* 「日本語URL」への対応はブラウザ側の仕様に依存します。
* ※開けるのは先頭に http;// か https:// がついた URL 文字列のみです。
*
* ②: メールアドレスなら既定のメールクライアントでメッセージを新規作成します。
* ※mailto: の有無によらずにメールアドレス文字列を開きます。
* ※メールアドレスとおなじ名前のフォルダを相対パスや PATH 略記のパスとして優先的に開きたい場合は、
* ② のコードを下位(⑩の上)に移動させてください。
* ※メールアドレスの判定基準は「メールアドレス 正規表現」で検索トップにあったサイトからの拾い物です。
* ref. 『メールアドレスを表す現実的な正規表現 - Qiita』
* https://qiita.com/sakuro/items/1eaa307609ceaaf51123
*
* ③: 選択範囲の文字列がファイルやフォルダのフルパスなら、実在確認して既定のプログラムで実行します
* (環境変数を %PATH% 形式で短縮したパスも展開し、実在確認をして既定のプログラムで実行します)。
* ネットワークフォルダの \\パス も、実在確認をして既定のプログラムで実行します。
* ④: 環境変数を %PATH% 形式で短縮したパスの場合は、省略された拡張子も補完します。
* ※実行ファイルに引数を渡す場合は、パスを「 " " 」で囲ってください(後述)。
*
* ⑤~⑦: アクティブなドキュメントのカレントディレクトリからの相対パスとして
* ファイルやフォルダの実在確認ができるなら、既定のプログラムで実行します。
* ※処理できる相対パスの形式は、
* ⑤: 先頭にだけに ..\ または .../ が付いたものか(拡張子を補完しない)
* ⑥: カレントディレクトリまでのパスを完全に省略したもののみで、
* パスの途中にも .\ などがあるものは処理しません。
* ⑦: ⑥のパターンにたいして、省略された拡張子を補完します。
*
* ⑧: システム環境変数 PATH を省略したパスを補完し、実在確認をして既定のプログラムで実行します。
* ⑨: 拡張子 PathExt が省略されたものも、定義配列から実在確認を試行して実行します。
* ※WshShell.Run() は本来 PATH や PathExt (および App Paths)を補完して実行させられますが
* 実在確認してから実行させないとマクロのエラーとして扱われてしまうので、
* ⑧,⑨ で処理するシステム環境変数 PATH は、定義配列に手動で列挙したもののみとします。
* ※App Paths も、Path の定義配列に親フォルダのパスを手動で追加しないと処理しません
* (App Paths はプログラムのインストーラがレジストリに書き込んだ PATH の代用機能。
* キー名で実行するとキーの配下に記述されたプログラムを起動できます)。
* [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths]
*
* ⑩: file://~ への絶対パスを既定のプログラムで実行します。
* ※先頭の "file://" を外しローカルファイルとして実在確認をしてから
* ドライブ名以降のパスを WshShell.Run() に投げて実行させます。
*
* ⑪: なんでもいいから WshShell.Run() に投げて実行させます。
* shell:コマンドなどパスのかたちを取っていないものはこれでしか実行できませんが、ミスタイプや
* ファイルやフォルダが実在しない場合にはマクロのエラーとして扱われるので「●非推奨」です。
* ※設定変数により ⑪ のコードは初期状態で無効化してあります。
*
* ▼ 共通 ▼
* ・基本的に範囲選択して実行する前提です。
* 複数行の各行にひとつずつ列挙された URL/パス をそれぞれ実行することもできます
* (それぞれを既定のプログラムで実行します)。
* 範囲選択なしのときは、アクティブな論理行の文字列を取得して URL/パス を実行します。
* 選択範囲や各行の先頭/末尾の「空白文字」「 <> 」は無視します。
*
* ・① URL、② メールアドレス、⑩ ネットワークパスは、実在確認なしで実行します、
* ③~⑨ ローカルファイル/フォルダのパスは、実在確認して実行します。
* ・%PATH% 形式で略記されたパスは、展開してから実在確認して実行します。
*
* ・選択範囲や各行内に「 " " 」で囲われた部分があれば、
* 「 " " 」内をパス(コマンド)と見做し、以降を引数(コマンドラインオプション)として処理します。
* ※※※ 基本的に引数つきのコマンドラインをする前提ではありません ※※※
* 引数部分の「 " " 」の有無は考慮せず、WshShell.Run() にそのまま渡します。
* 引数部分で環境変数 Path, PathExt でディレクトリパスや拡張子を省略されていても
* マクロでは補完処理しません(環境変数 Path, PathExt の定義用配列も適用されません)。
* 引数部分は実在確認しないので、 %PATH% も展開しないでそのまま渡します。
* 選択範囲の先頭に「 " " 」で囲われた部分がない場合は、引数付きのコマンドであっても実行しません
* (パスの中に半角スペースがあっても「 " " 」なしで開けることを優先するための仕様です)。
*
* ・選択範囲の文字列の先頭が「 " 」でそれを閉じる「 " 」の位置が不適切(または閉じる「 " 」がない)場合、
* ⑥ のコードにより "アクティブなドキュメントのカレントフォルダ" が開くようです…
* (これはこれで、あえて「 " 」だけでマクロを実行すると便利なのでデバッグしないで残しておきます)。
* また、選択範囲の文字列がドット「 . 」だけで実行すると
* ③ のコードにより Mery 起動時の「カレントフォルダ(作業フォルダ)」が開きます…
* (これもこれで面白いので、あえてデバッグしないで残しておきます)。
*
* ・拡張子 PathExt の補完は、④, ⑦, ⑨ の場合のみとします。
*
* ・「お気に入り」の URL やパスを特定の「キーワード」開くこともできます。
*
* 以下のような 文字列/論理行 を開くことができます
*(行頭/行末の空白は無視し、無効な行はスキップします)。
▼ 日本語や半角スペースなどのダメ文字を含むURL(http:// があるもののみ) ▼
"https://www.haijin-boys.com/wiki/よくある質問#.E6.97.A5.E6.9C.AC.E8.AA.9E.E3.82.92.E5.90.AB.E3.82.80_URL_.E3.82.92.E8.AA.8D.E8.AD.98.E3.81.97.E3.81.9F.E3.81.84"
https://www.haijin-boys.com/wiki/マクロリファレンス:Selection インターフェイス
▼ メールアドレス(mailto: あり/なし) ▼
< hogehoge@example.com >
▼ ファイル/フォルダパス(絶対パス:フルパス) ▼
C:\Program Files
"c:\windows\system32\notepad.exe"
▼ アクティブなドキュメントからの相対パス(..\ 形式の場合は、要 拡張子) ▼
"連続する重複行を削除"
..\Mery.ini
▼ 環境変数で短縮/省略されたパス ▼
%PROGRAMFILES%\internet explorer\iexplore
"calc"
regedit
"notepad" "%PROGRAMFILES%\Mery\Mery.txt"
"explorer" /select, %USERPROFILE%\ntuser.ini
▼ インターネットアドレス形式のパスやネットワークパス、[●非推奨 shell:コマンド(※実在確認なし)] ▼
file:///c:/boot.ini
\\Android\shared
shell:Desktop
*
*/
// ■ 「お気に入り(特定のキーワード)」を実行可能な URL/パス に変換する ■
var favoritesEnable = true;
// ▼ 「お気に入り」の URL/パス とキーワードを登録 ▼
// \ は2つ重ね \\ にすること
var favorites = new Array(
[ "https://www.haijin-boys.com/", "blog", "ブログ" ],
[ "https://www.haijin-boys.com/wiki/メインページ", "wiki", "ウィキ" ],
[ "https://www.haijin-boys.com/wiki/マクロライブラリ", "マクロライブラリ", "ライブラリ" ],
[ "https://www.haijin-boys.com/wiki/マクロリファレンス", "マクロリファレンス", "リファレンス" ],
[ editor.FullName.replace( /mery\.exe$/i , "mery.txt" ), "readme" ],
[ "%USERPROFILE%\\desktop" , "desktop", "デスクトップ" ],
// [ "(※eメールクライアントのパス)" , "(※自分のeメールアドレス)" ],
// [ "" , "" ],
// [ "" , "" ],
// [ "" , "" ],
"" );
// カレントフォルダはアクティブなドキュメントの親フォルダ
// ■ 「無題」のドキュメントの場合は Mery の実行フォルダ ■(変更する場合は末尾に \\ をつける)
var $parentFolder = document.FullName ? document.Path
: editor.FullName.replace( /mery\.exe$/i , "" );
// ■ 省略可能なフォルダパスの 環境変数 PATH の代わりに ■
// \ は2つ重ね \\ にすること (前に置いたものが優先)
var $envPathArray = new Array(
editor.FullName.replace( /\\mery\.exe$/i , "" ) , // Mery フォルダ
editor.FullName.replace( /\\mery\.exe$/i , "\\macros" ) , // Mery\Macros フォルダ
ScriptFullName.replace( RegExp( "\\" + ScriptName + "$" , "i" ) , "" ) , // このマクロの保存フォルダ
"c:\\windows" , "c:\\windows\\system32" ,
);
// ■ 省略可能な拡張子の環境変数 PathExt ■ (前に置いたものが優先)
// ※ ".CPL"(コントロールパネルアプレット)は不可 → ショートカットファイルを Path 配列にあるフォルダに置けば実行可
var $pathExtArray = new Array(
".LNK" , ".URL" , // リンク拡張子とインターネットショートカット拡張子
".COM" , ".EXE" , ".BAT" , ".CMD" , ".VBS" , ".VBE" ,
".JS", ".JSE" , ".WSH" , ".WSF" , ".MSC" , ".PSC1" , ".SCR"
);
// ■ アウトプットバーに結果を表示する? ■ (デバッグ用)
var outputEnable = false;
// ■ なんでもいいから WshSlell.Run() に投げる? ■ [非推奨] コード ⑪番
// カレントフォルダ/PATH/App Paths/PathExt の補完で実行されるかもしれないが、それ以外は Mery のエラー(マクロのエラー)になる
var forceRunEnable = false;
Status = "Open Sesame!";
// 日時を出力 YYYY-MM-DD hh:mm:ss UTC+9000
Output( DateTime( "-", true ) + '\nGo "Open Sesame !!" >>> '
+ ( document.FullName ? document.FullName : "「無題」ドキュメント" ) + '"' );
// 選択範囲がないときは論理行を選択
var s = document.selection;
var $str = s.IsEmpty ? document.GetLine( s.GetActivePointY( mePosLogical ), 0 )
: s.Text;
// 空白文字列なら
if ( $str.match( /^[\s ]*$/g ) ) {
Output( "Text is Empty" );
Quit();
}
var WshShell = new ActiveXObject( "WScript.Shell" );
var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
// 選択範囲を各行ごとに開けるよう、論理行を配列に
var $strArray = $str.split( "\n" );
var yy = s.GetTopPointY( mePosLogical );
perLineLoop:
for ( var i = 0, hit = 0; i < $strArray.length; i ++ ) {
// 論理行の番号を取得
if ( outputEnable )
var $line = "[#" + ( yy + i ) + "] ";
// 各行の先頭/末尾の空白文字と " < > を除去
var st = $strArray[i].replace( /^[\s <>]*|[\s <>]*$/g , "" );
// 選択範囲 (行) の文字列が特定のキーワードであれば「お気に入り」の URL/パス に変換する
if ( favoritesEnable )
st = ConvertFavorites( st );
if ( st.match( /^[\s ]*$/ ) ) {
Output( $line + "is Empty Line", 0 );
continue;
}
// ① 文字列がURLなら既定のブラウザで開く
if ( st.match( /^"?https?:\/\// ) ) {
WshShell.Run( '"' + st.replace( /^"|"$/g , "" ) + '"' );
Output( $line + "① Open Link: " + st , 1 );
continue perLineLoop;
}
// ② 文字列がメールアドレスなら既定のメールクライアントで開く(エンコードなし)
if ( ! st.match( /:\/|:\\/ ) && st.length < 255
&& st.match( /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]{1,64}@[a-zA-Z0-9-]{1,63}(?:\.[a-zA-Z0-9-]+)*$/ )
) {
WshShell.Run( "mailto:" + st.replace( /^"|"$|^mailto:/g , "" ) )
Output( $line + "② Open: " + "\"mailto:" + st.replace( /^"|"$|^mailto:/g , "" ) + '"' , 1 );
continue perLineLoop;
}; // end ②
if ( st.match( /^[\s \\/:,;"*?<>|]*$/ ) ) {
Output( $line + "※ Bad character(s)" );
continue;
}
var $command, $command_Op;
// 文字列に "" で囲われている部分があれば、"コマンド" と 引数 として分離する
if ( st.match( /^"/ ) && st.substr( 1 ).search( /"(?=\s|$)/ ) ) {
var $secondWQuoteID = st.substr( 1 ).search( /"/ );
$command = WshShell.ExpandEnvironmentStrings( st.substr( 1, $secondWQuoteID ) );
$command_Op = " " + st.substr( 2 + $secondWQuoteID ).replace( /^\s*/ , "" );
}
else {
$command = WshShell.ExpandEnvironmentStrings( st );
$command_Op = "";
}
// 文字列中の %PATH% を展開した場合のフラグ(先頭3文字を比較)
if ( $command.substr( 0, 3 ) != st.replace( /^"/ , "" ).substr( 0, 3 ) ) {
var $expand = true;
Output( $line + "※ Expand " + st + ": " + $command + $command_Op, 0 );
}
// ③ 文字列が ファイル/フォルダ パスなら既定のプログラムで開く(実在確認して実行)
if ( ! $command.match( /^[^.]\.+[\\/]/ )
&& ( Fso.FolderExists( $command ) || Fso.FileExists( $command ) )
) {
WshShell.Run( '"' + $command + '"' + $command_Op );
Output( $line + "③ Open File / Folder: \"" + $command + '"' + $command_Op , 1 );
continue perLineLoop;
} // end ③
// ④ %PATH% 形式の短縮パスで拡張子も省略されている場合(実在確認して実行)
if ( $expand ) {
percentPathExtLoop:
for ( var j = 0; j < $pathExtArray.length; j ++ ) {
var $percentPathExt = ( $command + $pathExtArray[j] );
if ( Fso.FileExists( $percentPathExt ) ) {
WshShell.Run( '"' + $percentPathExt + '"' + $command_Op );
Output( $line + "④ Open File / Folder + .EXT: \""
+ $percentPathExt + '"' + $command_Op , 1 );
continue perLineLoop;
}
}
} // end ④
// ⑤ 文字列が ..\相対パス または ../相対パス の場合(実在確認して実行)
if ( $command.match( /^\.+(?:[\\/][^\\/:,;"*?<>|]+)+/ )
&& ! $command.match( /(?:[\\/]{2,}|^[^.]+\.+[\\/])/ )
) {
var $dotCount = $command.search( /[\\/]/ );
var $pathArray = $parentFolder.replace( /\\/g , "/" ).split( "/" );
for( var j = 0; j < $dotCount; j ++ ) {
$pathArray.pop();
}
var $relativePath = $pathArray.join( "\\" ) + $command.replace( /^\.+/ , "" );
if ( Fso.FolderExists( $relativePath ) || Fso.FileExists( $relativePath ) ) {
WshShell.Run( '"' + $relativePath + '"' + $command_Op );
Output( $line + "⑤ Open as ..\\ Relative path: \""
+ $relativePath + '"' + $command_Op , 1 );
continue perLineLoop;
}
} // end ⑤
// ⑥ - ⑨ 文字列にドライブルートがない場合
if ( ! $command.match( /^[a-z]:[\\/]/i ) && ! $command.match( /(?:[\\/]{2,}|^\.+[\\/])/ ) ) {
var $relativePath = $parentFolder + $command.replace( /^\\/ , "" );
// ⑥ 文字列がカレントフォルダ内の相対パスの場合(実在確認して実行)
if ( $relativePath.replace( /\\+$/ , "" ) != $parentFolder.replace( /\\+$/ , "" )
&& ( Fso.FolderExists( $relativePath ) || Fso.FileExists( $relativePath ) )
) {
WshShell.Run( '"' + $relativePath + '"' + $command_Op );
Output( $line + "⑥ Open as Relative path: \""
+ $relativePath + '"' + $command_Op , 1 );
continue perLineLoop;
} // end ⑥
// ⑦ 文字列がカレントフォルダ内の相対パス(拡張子なし)の場合(実在確認して実行)
else {
relativePathExtLoop:
for ( var j = 0; j < $pathExtArray.length; j ++ ) {
var $relativePathExt = ( $relativePath + $pathExtArray[j] );
if ( Fso.FileExists( $relativePathExt ) ) {
WshShell.Run( '"' + $relativePathExt + '"' + $command_Op );
Output( $line + "⑦ Open as Relative path + .EXT: \""
+ $relativePathExt + '"' + $command_Op , 1 );
continue perLineLoop;
}
} // end ⑦
}
// ⑧ システム環境変数 Path を省略したパスなら
sysEnvPathOuterLoop:
for ( var k = 0; k < $envPathArray.length; k ++ ) {
sysEnvPathInnerLoop:
for ( var j = 0; j < $pathExtArray.length; j ++ ) {
var $sysEnvPath = ( $envPathArray[k] + "\\" + $command.replace( /^\\/ , "" ) );
if ( Fso.FolderExists( $sysEnvPath ) || Fso.FileExists( $sysEnvPath ) ) {
WshShell.Run( '"' + $sysEnvPath + '"' + $command_Op );
Output( $line + "⑧ Open PATH w/expand: \""
+ $sysEnvPath + '"' + $command_Op , 1 );
continue perLineLoop;
} // end ⑧
// ⑨ 拡張子 PathExt とシステム環境変数 Path を省略したパスなら
if ( ! $command.match( /\\[^\\/:,;"*?<>|]+\.[^\\/:,;"*?<>|]+$/ ) ) {
var $sysEnvPathExt = ( $sysEnvPath + $pathExtArray[j] );
if ( Fso.FileExists( $sysEnvPathExt ) ) {
WshShell.Run( '"' + $sysEnvPathExt + '"' + $command_Op );
Output( $line + "⑨ Open PATH w/expad + .EXT: \""
+ $sysEnvPathExt + '"' + $command_Op , 1 );
continue perLineLoop;
}
} // end ⑨
} // end sysEnvPathinnerLoop
} // end sysEnvPathOuterLoop
} // end ⑥ - ⑨
// ⑩ 文字列が file:// ~ の場合(実在確認して実行)
if ( $command.match( /^file:\/\// ) ) {
var $command_Test = CommandTest( $command, "file://" );
if ( $command_Test ) {
WshShell.Run( '"' + $command_Test + '"' + $command_Op );
Output( $line + "⑩ Open File / Folder on localhost: \""
+ Fso.GetAbsolutePathName( $command_Test ) + '"' + $command_Op , 1 );
continue perLineLoop;
}
} // end ⑩
// ⑪ なんでもいいからそのまま WshSlell.Run() に投げる
if ( forceRunEnable ) {
WshShell.Run( $command + $command_Op );
WshShell.Run( '"' + $command + '"' + $command_Op );
Output( $line + "⑪ Force Try: " + $command + $command_Op , 1 );
continue perLineLoop;
} // end ⑪
else
Output( $line + "× " + st );
} // end perLineLoop
if ( ! hit ) {
Status = " URL / パス として開けませんでした";
}
// ------------------------------------------------------------
/* 関数 ConvertFavorites( st ) */
// お気に入り URL/パス へのキーワードを置換する
function ConvertFavorites( str ) {
var dist = str;
Outer:
for ( var j = 0; j < favorites.length; j ++ ) {
if ( ! favorites[j] || ! favorites[j][0] )
continue;
Inner:
for ( var k = 1; k < favorites[j].length; k ++ ) {
if ( ! favorites[j][k] )
continue;
if ( favorites[j][k] == str ) { // ヒットしたら
dist = favorites[j][0]; // いちばん左の要素を返す
Output( $line + '※ Favorite ' + '"' + str + '": ' + dist );
break Outer;
}
}
}
return dist;
}
/* 関数 Output( string, num ) */
// アウトプットバーに結果を出力する
function Output( str, num ) {
if ( outputEnable ) // 出力許可フラグ
OutputBar.Writeln( str );
if ( num )
hit += num; // ヒットフラグをインクリメント
}
/* 関数 DateTime( bar, utc ) */
// 現在日時を日本時間 "YYYY-MM-DD hh:mm:ss UTC+9000" で返す
// 引数を省略した場合は "YYYY/MM/DD hh:mm:ss" で返す
function DateTime( separator, utc ) {
var date = new Date();
var bar = separator ? separator : "/";
var utc = utc ? " " + date.toString().replace( /^.+(UTC\+\d{4}).+$/ , "$1" ) : "";
// 文字列中の半角1ケタの数字を0埋めして2ケタで返す Pad( str )
var Pad = function( str ) {
return str.replace( /\b[0-9]\b/g , function( $0 ) { // 半角英数で囲われていない1ケタの数字
return "0" + $0;
} ) };
return Pad(
date.getFullYear() + bar + ( date.getMonth() + 1 ) + bar + date.getDate() + " "
+ date.toLocaleTimeString( "ja-JP" )
+ utc );
}
/* 関数 CommandTest( $command, "file://" ) */
// "file:// ~" をローカルファイルとして実在確認する
function CommandTest( str, scheme ) {
// ドライブ名 "c:/" の部分があるかチェックして "c:/ ~ " のパスが実体があるか確認
var $driveNameID = str.slice( scheme.length ).search( /[^.\\/]:[\\/]/ );
if ( $driveNameID >= 0 ) {
if ( Fso.FolderExists( str.slice( scheme.length + $driveNameID ) )
|| Fso.FileExists( str.slice( scheme.length + $driveNameID ) )
) {
return str.slice( scheme.length + $driveNameID );
}
}
}
メモ
試作品です。動作の確実性については全く自信ありません。
- 2018/12/05 (sukemaru)
- ・一応、相対パスで記述した M3U プレイリストファイルからメディアファイルを開くことはできるようです。
- 2018/12/05 (sukemaru)
- ・環境変数 PATH や PathExt を補完する代替機能、%PATH% の展開、「お気に入り」の URL / パスの登録、複数行にリストアップした URL やパスの一括処理など、思いつきで機能を盛ってみましたがコードを整理できていません。
- ・環境変数 PATH の取得は自動化することもできますが、通常の使用では不要なものも多く、優先度(順番)も最適化されていないので手動で登録するかたちにしてあります。
- ・デバッグ用にアウトプットバーへの出力コードが入ったままになっていますが、設定用の変数で無効化してあります。
- ascii 文字
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
- Mery のエディタ上で URL として扱われる文字群(ascii)
[-\\0-9A-Z_a-z#$%+,./=?@~&:;] http://example.com/#$%+,-./0123456789=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~&:;\
- Mery における URL のダメ文字群(ascii)
[ !"'()*<>\[\]^`{|}]
http://example.com/!"'()*<>[]^`{|}
- ファイル名のダメ文字
\ / : , ; " * ? < > |
スポンサーリンク