通过浏览器运行cmd命令、启动steam

4,626 阅读2分钟

这是我参与更文挑战的第9天,活动详情查看: 更文挑战

我们先来看看实现起来的效果,我们在浏览器中输入ping so.com

cmd_ping

试试打开计算器、启动steam

cmd_steam

要实现这个效果其实用到了浏览器自定义协议,我们可以通过自定义协议打开wechat、扣扣、emali应用等待。比如在web客服系统中通常会使用tencent://自定义协议提供一个扣扣聊天按钮,当我们点击时浏览器会启动外部应用。

我们将自定义协议写入注册表后,浏览器会根据协议启动我们的先导应用,如下在tencent://协议中启动了一个Timwp.exeTimwp.exe将URL参数解析后启动对应服务。

image-20210629225401310

据此我们就可以自己注册一个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

image-20210629225551325

接下来我们要编写一个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都会路由到这个应用啦。

cmd_chrome


我学废了,你呢?urlCmd.go还有许多改进空间,有兴趣的同学可以做一个自己的解析器试试哦。


文章有不足的地方欢迎在评论区指出。

欢迎收藏、点赞、提问。关注顶级饮水机管理员,除了管烧热水,有时还做点别的。