「
選択範囲のURL・パスを開く
」を編集中 (節単位)
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
=== 実行コード === <syntaxhighlight lang="javascript"> // 「ひらけゴマ!!」 // ログ:日時を出力 YYYY-MM-DD hh:mm:ss.sss UTC+9000 // ログ:Go "Open Sesame !!" >> アクティブなドキュメントのパス Output( DateTime_ms( start ) + '\nGo "Open Sesame !!" >> ' + ( document.FullName ? document.FullName : "「無題」ドキュメント" ) ); // 選択範囲がないときは論理行を選択 var s = document.selection; var $str = s.IsEmpty ? document.GetLine( s.GetActivePointY( mePosLogical ), 0 ) : s.Text; // 先頭行の行番号(論理行) var ty = s.GetTopPointY( mePosLogical ); var by = s.GetBottomPointY( mePosLogical ); // 全体が空白文字列なら if ( $str.match( /^[\s ]*$/g ) ) { // ログ:[#先頭行-#最終行] is Empty. Output( "[#" + ty + ( ty != by ? "-#" + by : "" ) + "] is Empty." ); } // 行ごとのループ処理開始 else { var WshShell = new ActiveXObject( "WScript.Shell" ); var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); // 選択範囲を各行ごとに開けるよう、論理行で分割して配列に var $strArray = $str.split( "\n" ); perLineLoop: // hit フラグを 0 にセット for ( var i = 0, hit = 0; i < $strArray.length; i ++ ) { // 論理行の番号を取得(デバッグログ用) // [#行番号] if ( outputEnable ) { var $line = "[#" + ( ty + i ) + "] "; } // 各行の先頭/末尾の空白文字と < > を除去 // ※「 " 」は除外した → コマンドライン判定に必要 $strArray[i] = $strArray[i].replace( /^[\t <>]*|[\t <>]*$/g , "" ); // 行コメントや箇条書きの行頭記号も除去(2019/03/15 追加) var st = $strArray[i].replace( /^[\t ]*\/\/[\t ]*|^[\t <>=\-⁃・・•◦‣○●■◆▼▲※→⇒〜~†*:;#']*|[\t <>]*$/g , "" ); // ログ:[#行番号] ※ Remove bullets and comment-delimiters. if ( st.length != $strArray[i].length ) { Output( $line + "※ Remove bullets and comment-delimiters: " + ( $strArray[i].slice( 0, - st.length ) ), 0 ); } // 文字列全体が対になるカッコで囲われていたらカッコを除去する(2019/03/15 追加) if ( removeBracketsEnable ) { removeBracketsLoop: for ( var b = 0; b < brackets.length - 1; b ++ ) { if ( st.length > 1 && b % 2 == 0 && st.charAt( 0 ) == brackets[ b ] && st.charAt( st.length - 1 ) == brackets[ b + 1 ] ) { st = st.slice( 1, st.length - 1 ).replace( /^[\t ]*|[\t ]*$/g , "" ); // ログ:[#行番号] ※ Remove Brackets: 開きカッコ & 閉じカッコ Output( $line + "※ Remove brackets: " + brackets[b] + " & " + brackets[b+1], 0 ); } } } // 空行をスキップ if ( st.match( /^[\t ]*$|^"[\t ]*"?$/ ) ) { // ログ:[#行番号] × Empty Line. Output( $line + "× Empty Line.", 0 ); continue perLineLoop; } // 選択範囲 (行) の文字列が特定のキーワードであれば「お気に入り」の URL/パス に変換する // ログ:[#行番号] ※ Favorite: "キーワード" >> URL/パス if ( favoritesEnable ) { st = ConvertFavorites( st ); } // ① 文字列がURLなら既定のブラウザで開く(エンコードなし) if ( st.match( /"?https?:\/\/|"?ftp:\/\// ) ) { var $url = st.slice( st.search( /"?https?:\/\/|"?ftp:\/\// ) ); WshShell.Run( '"' + $url.replace( /^"|"$/g , "" ) + '"' ); // ログ:[#行番号] ① Open Link: URL Output( $line + "① Open Link: " + $url , 1 ); continue perLineLoop; } // end ① // ② 文字列がメールアドレスなら既定のメールクライアントで開く(エンコードなし) if ( ! st.match( /(?:\:\/|\:\\)/ ) && st.length < 255 && st.match( /[: \t]*?[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]{1,64}@[a-zA-Z0-9-]{1,63}(?:\.[a-zA-Z0-9-]+)*$/ ) ) { var $mail = st.replace( /^.*?[: \t]*?([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]{1,64}@[a-zA-Z0-9-]{1,63}(?:\.[a-zA-Z0-9-]+)*).*$/ , "$1" ); WshShell.Run( "mailto:" + $mail.replace( /^"|"$|^mailto:/g , "" ) ) // ログ:[#行番号] ② Open: メールアドレス Output( $line + '② Open: "mailto:' + st.replace( /^"|"$|^mailto:/g , "" ) + '"' , 1 ); continue perLineLoop; } // end ② // ファイル名の禁止文字だけの文字列はスキップ // ※ 「"」を含めると「"」1文字でカレントフォルダは開かなくなる if ( st.match( /^[\s \\/:,;*?<>|]*$/ ) ) { // ログ:[#行番号] ③' Bad character(s): 文字列 Output( $line + "③'Bad character(s): " + st ); continue perLineLoop; } // ⓪ ファイルパス+(行,桁) 形式なら Mery で開く (2019/03/15 追加) if ( st.match( /^[a-z]\:\\/i ) && st.match( /\(\d+(?:,\d+)?\)[:]?$/ ) ) { var $file = st.replace( /^(.+)\(\d+(?:,\d+)?\)[:]?$/ , "$1" ); var $line_Num = st.replace( /^.+\((\d+)(?:,\d+)?\)[:]?$/ , "$1" ); var $column_Num = st.replace( /^.+\(\d+,(\d+)\)[:]?$/ , "$1" ); if ( Fso.FileExists( $file ) ) { // コマンドライ用文字列 "Mery.exe" /l yy /cl xx "filepath" に置換 var $meryCommandline = '"' + editor.FullName + '" /l ' + $line_Num + ( $column_Num ? ( ' /cl ' + $column_Num ) : "" ) + ' "' + $file + '"'; WshShell.Run( $meryCommandline ); // ログ:[#行番号] ⓪ Open with Mery: コマンドライン文字列 Output( $line + "⓪ Open /w Mery: " + $meryCommandline , 1 ); continue perLineLoop; } } // end ⓪ var $command, $command_Op, $isExpanded; // 文字列の先頭に "" で囲われている部分があれば、"コマンド" と 引数 として分離する // "コマンド" 部分の環境変数 %PATH% はフルパスに展開する 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 ( st.match( /%/ ) && $command.substr( 0, 3 ) != st.replace( /^"/ , "" ).substr( 0, 3 ) ) { $isExpanded = true; // ログ:[#行番号] ※ Expand: 文字列 >> "コマンド" 引数 Output( $line + "※ Expand: " + st + " >> " + $command + $command_Op, 0 ); } // 以下、フォルダ/ファイルの実在確認は $command にたいしておこなう // ③ 文字列が ファイル/フォルダ パスなら既定のプログラムで開く(実在確認して実行) if ( ! $command.match( /^[^.]\.+[\\/]|^[\\/]{2}[\s:,;*?<>|]|^\.+\s*$/ ) && ( Fso.FolderExists( $command ) || Fso.FileExists( $command ) ) ) { WshShell.Run( '"' + Fso.GetAbsolutePathName( $command ) + '"' + $command_Op ); // ログ:[#行番号] ③ Open File / Folder: "コマンド" 引数 Output( $line + '③ Open File / Folder: "' + Fso.GetAbsolutePathName( $command ) + '"' + $command_Op , 1 ); continue perLineLoop; } // end ③ // ④ %PATH% 形式の短縮パスで拡張子も省略されている場合(実在確認して実行) if ( $isExpanded ) { percentPathExtLoop: for ( var j = 0; j < $pathExtArray.length; j ++ ) { var $percentPathExt = ( $command + $pathExtArray[j] ); if ( Fso.FileExists( $percentPathExt ) ) { WshShell.Run( '"' + $percentPathExt + '"' + $command_Op ); // ログ:[#行番号] ④ Open File / Folder + .EXT: "コマンド.EXT" 引数 Output( $line + '④ Open File / Folder + .EXT: "' + $percentPathExt + '"' + $command_Op , 1 ); continue perLineLoop; } } } // end ④ var $relativePath; // ⑤ 文字列が ..\相対パス または ../相対パス の場合(実在確認して実行) // ※ 先頭以外に .\ や ./ があるものは不可 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(); } $relativePath = $pathArray.join( "\\" ) + $command.replace( /^\.+/ , "" ); if ( Fso.FolderExists( $relativePath ) || Fso.FileExists( $relativePath ) ) { WshShell.Run( '"' + $relativePath + '"' + $command_Op ); // ログ:[#行番号] ⑤ Open as ..\ Relative path: "補完済み相対パス" 引数 Output( $line + '⑤ Open as ..\\ Relative path: "' + $relativePath + '"' + $command_Op , 1 ); continue perLineLoop; } } // end ⑤ // ⑥ - ⑨ 文字列にドライブルートがない場合 if ( ! $command.match( /^[a-z]:[\\/]/i ) && ! $command.match( /(?:[\\/]{2,}|^\.+[\\/])/ ) ) { $relativePath = $parentFolder + $command.replace( /^\\/ , "" ); // ⑥ 文字列がカレントフォルダ内の相対パスの場合(実在確認して実行) if ( $relativePath.replace( /\\+$/ , "" ) != $parentFolder.replace( /\\+$/ , "" ) && ( Fso.FolderExists( $relativePath ) || Fso.FileExists( $relativePath ) ) ) { WshShell.Run( '"' + Fso.GetAbsolutePathName( $relativePath ) + '"' + $command_Op ); // ログ:[#行番号] ⑥ Open as Relative path: "補完済み相対パス" 引数 Output( $line + '⑥ Open as Relative path: "' + Fso.GetAbsolutePathName( $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( '"' + Fso.GetAbsolutePathName( $relativePathExt ) + '"' + $command_Op ); // ログ:[#行番号] ⑦ Open as Relative path + .EXT: "補完済み相対パス" 引数 Output( $line + '⑦ Open as Relative path + .EXT: "' + Fso.GetAbsolutePathName( $relativePathExt ) + '"' + $command_Op , 1 ); continue perLineLoop; } } // end ⑦ } // ⑧ システム環境変数 PATH(代替 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 ); // ログ:[#行番号] ⑧ Open sys PATH w/expand: "展開したフルパス" 引数 Output( $line + '⑧ Open sys 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 ); // ログ:[#行番号] ⑨ Open sys PATH w/expand + .EXT: "展開したフルパス.EXT" 引数 Output( $line + '⑨ Open sys PATH w/expand + .EXT: "' + $sysEnvPathExt + '"' + $command_Op , 1 ); continue perLineLoop; } } // end ⑨ } // end sysEnvPathinnerLoop } // end sysEnvPathOuterLoop } // end ⑥ - ⑨ // ⑩ 文字列が file:// ~ の場合(実在確認して実行) // ※ file:// 以降のドライブレターから後ろの部分で実在確認する if ( $command.match( /^file:\/\// ) ) { var $command_Test = CommandTest( $command, "file://" ); if ( $command_Test ) { WshShell.Run( '"' + $command_Test + '"' + $command_Op ); // ログ:[#行番号] ⑩ Open File / Folder on localhost: "フルパス" 引数 Output( $line + '⑩ Open File / Folder on localhost: "' + Fso.GetAbsolutePathName( $command_Test ) + '"' + $command_Op , 1 ); continue perLineLoop; } } // end ⑩ // ⑪ なんでもいいからそのまま WScript.Shell.Run() に投げる // ※ 実在しないパスで強制実行すると、このマクロのエラー扱いになるので "非推奨" if ( forceRunEnable ) { // 設定項目の変数 WshShell.Run( $command + $command_Op ); //WshShell.Run( '"' + $command + '"' + $command_Op ); // ← ダブルクオートで囲うなら // ログ:[#行番号] ⑪ Force Try: "コマンド" 引数 Output( $line + "⑪ Force Try: " + $command + $command_Op , 1 ); continue perLineLoop; } // end ⑪ // 実在確認できない無効なパス else { // ログ:[#行番号] × Bad strings: 文字列 Output( $line + "× Bad strings: " + st ); // continue perLineLoop; } } // end perLineLoop } // end else (行ごとのループ処理) // 処理終了時刻の取得と所要時間の計算 var end = new Date(); var elapsed = end.getTime() - start.getTime(); var elapsedStatus = "[ " + ( ( elapsed / 1000 ) + "000" ).replace( /(\.)(\d{3})(0*)/, "$1$2" ) + " sec. ]"; // ログ:elapsed: [ s.sss sec. ] // ログ:'Finish "Close Sesame !!" Output( "elapsed: " + elapsedStatus ); // Output( DateTime_ms( end ) ); Output( 'Finish "Close Sesame !!"\n' ); // ステータスバーに終了表示 if ( hit ) { Status = " Open Sesame! 。。。 " + hit + " hit(s) " + elapsedStatus + " " + DateTime_ms( end ).substr( 0, 19 ); // Status = " Open Sesame!! ( " + hit + "件を実行 ) " + elapsedStatus + " " + DateTime_ms( end ).substr( 0, 19 ); } else { Status = " Open Sesame ... Fault! " + elapsedStatus + " " + DateTime_ms( end ).substr( 0, 19 ); // Status = " URL / パス として開けませんでした。 " + elapsedStatus + " " + DateTime_ms( end ).substr( 0, 19 ); } // ------------------------------------------------------------ /** * 関数 Output( string, num ) * アウトプットバーに結果を出力する */ function Output( str, num ) { if ( outputEnable ) { // 出力許可フラグ OutputBar.Writeln( str ); } if ( num ) { hit += num; // ヒットフラグをインクリメント } } /** * 関数 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]; // いちばん左の要素を返す // ログ:[#行番号] ※ Favorite: "キーワード" >> URL/パス Output( $line + '※ Favorite: ' + '"' + str + '" >> ' + dist ); break Outer; } } // end Inner loop [j][k] } // end Outer loop [j] return dist; } /** * 関数 DateTime_ms( date ) * 現在日時を日本時間 "YYYY-MM-DD hh:mm:ss.sss UTC+9000" で返す(年月日の区切り: "-" ) */ function DateTime_ms( d ) { if ( ! d ) { d = new Date(); } var pad = function( str ) { return str.replace( /[0-9]+/g , function( $0 ) { return $0.length < 2 ? "0" + $0 : $0; } ); } return d.getFullYear() + "-" + pad( ( d.getMonth() + 1 ) + "-" + d.getDate() +" " + d.toLocaleTimeString() ) + "." + ( d.getMilliseconds() + "000" ).substr( 0, 3 ) + " UTC+0900"; } /** * 関数 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 ); } } } </syntaxhighlight>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク