我們先來看看實現起來的效果,我們在瀏覽器中輸入ping so.com
試試開啟計算器、啟動steam
要實現這個效果其實用到了瀏覽器自定義協議,我們可以通過自定義協議開啟wechat、扣扣、emali應用等待。比如在web客服系統中通常會使用tencent://
自定義協議提供一個扣扣聊天按鈕,當我們點選時瀏覽器會啟動外部應用。
我們將自定義協議寫入登錄檔後,瀏覽器會根據協議啟動我們的先導應用,如下在tencent://
協議中啟動了一個Timwp.exe
,Timwp.exe
將URL引數解析後啟動對應服務。
據此我們就可以自己註冊一個cmd
協議來啟動我們的應用。我們將如下urlCmd.reg
登錄檔檔案匯入到登錄檔HKEY_CLASSES_ROOT
項中,當然也可以手動在登錄檔中新增項和字串來實現,我們告訴登錄檔我要註冊一個URL Protocol
,他的目錄結構為HKEY_CLASSES_ROOT\cmd\shell\open\command
。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\cmd]
@="URL: cmd protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\cmd\shell]
[HKEY_CLASSES_ROOT\cmd\shell\open]
[HKEY_CLASSES_ROOT\cmd\shell\open\command]
@="C:\\Windows\\system32\\urlCmd.exe \"%1\""
匯入後看起來是這樣的,我們要啟動的先導應用為C:\Windows\system32\urlCmd.exe
接下來我們要編寫一個urlCmd.exe
來實現我們需要的功能,這裡我們通過go來編寫,我們將傳過來的URL解析為<command> <arg>
形式,然後呼叫cmd來執行。注意傳參是經過URL編碼的,在下面urlCmd.go
我們只做了空格的解碼。
//urlCmd.go
package main
import (
"fmt"
"log"
"os"
"os/exec"
"strings"
"time"
)
func main() {
var cmd_args, cmd_com string // 帶引數 不帶參
cmd_all := os.Args[1:] // [cmd://<command>%20<arg>] [cmd://<command>/]
cmd_cmd := strings.Split(string(cmd_all[0]), "//") // [cmd: <command>%20<arg>] [cmd: <command>/]
cmd_pre := strings.Split(string(cmd_cmd[1]), "%20") // [<command> <arg>] [<command>/]
if len(cmd_pre) == 1 {
cmd_args = "" // 引數為空
} else {
cmd_args = strings.Replace(cmd_pre[1], "/", "", 1)
}
cmd_com = strings.Replace(cmd_pre[0], "/", "", 1)
fmt.Printf("\ncommand: %v\nargs: %v\n", cmd_com, cmd_args)
cmd := exec.Command("cmd", "/c", cmd_com, cmd_args)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
log.Fatalf("err:%v", err)
}
time.Sleep(2 * time.Second)
}
我們build一下編譯成exe檔案
go bulid urlCmd.go
將urlCmd.exe
放到C:\Windows\system32\
目錄下即可,這樣我們在瀏覽器以cmd://
協議開啟的URL都會路由到這個應用啦。
我學廢了,你呢?urlCmd.go
還有許多改進空間,有興趣的同學可以做一個自己的解析器試試哦。
文章有不足的地方歡迎在評論區指出。
歡迎收藏、點贊、提問。關注頂級飲水機管理員,除了管燒熱水,有時還做點別的。