以前自己也写过Windows下自动打开多个浏览器测试某个URI,提高浏览器兼容性测试效率。

但是写的browse.bat文件还是最基础简陋的

@echo off
if '%1'=='-c' (
start /d "C:\Program Files\Google\Chrome\Application\" chrome.exe -new-tab %2
exit
)
if '%1'=='-f' (
start /d "C:\Program Files\Mozilla Firefox" firefox.exe -new-tab %2
exit
)
if '%1'=='-i' (
start /d "C:\Program Files\Internet Explorer" iexplore.exe %2
exit
)
if '%1'=='-d' (
rundll32 url.dll,FileProtocolHandler %2
exit
) if '%1'=='-a' (
call browse -c %2
call browse -f %2
call browse -i %2
) else (
explorer %1

今天恰巧看到cygwin安装目录下用perl写的url_handler.pl,感觉作者的思路挺有趣。

代码共赏析:C:\cygwin\bin\url_handler.pl

    if ($ENV{BROWSER}) {
push(@try, split(/:/, $ENV{BROWSER}));
} else { # set some defaults
push(@try, 'firefox -a firefox -remote openURL\(%s\)');
push(@try, 'mozilla -remote openURL\(%s\)');
push(@try, 'opera -remote openURL\(%s\)');
push(@try, 'galeon -n');
push(@try, 'lynx'); # prefer lynx over links as it can handle news:-urls
push(@try, qw('links2 -g' links w3m));
push(@try, 'kfmclient newTab'); # has no useful return-value on error
}

上面的亮点:

1.使用了@try这样一个思路,尝试打开.(没有理解perl的@try的含义?)

2.没有用很多的if-else而是用push放入一个数组(没有查阅过perl的push含义?)

#! /usr/bin/perl -w
# example of how to call an appropriate viewer
#
# URLs must start with a scheme and shell metas should be already quoted
# (tin doesn't recognize URLs without a scheme and it quotes the metas) use strict;
use warnings; (my $pname = $) =~ s#^.*/##;
die "Usage: $pname URL" if $#ARGV != 0; # version Number
my $version = "0.1.1"; my ($method, $url, $match, @try);
$method = $url = $ARGV[];
$method =~ s#^([^:]+):.*#$1#io; # shell escape
$url =~ s#([\&\;\`\'\\\"\|\*\?\~\<\>\^\(\)\[\]\{\}\$\010\013\020\011])#\\$1#g; if ($ENV{"BROWSER_".uc($method)}) {
push(@try, split(/:/, $ENV{"BROWSER_".uc($method)}));
} else {
if ($ENV{BROWSER}) {
push(@try, split(/:/, $ENV{BROWSER}));
} else { # set some defaults
push(@try, 'firefox -a firefox -remote openURL\(%s\)');
push(@try, 'mozilla -remote openURL\(%s\)');
push(@try, 'opera -remote openURL\(%s\)');
push(@try, 'galeon -n');
push(@try, 'lynx'); # prefer lynx over links as it can handle news:-urls
push(@try, qw('links2 -g' links w3m));
push(@try, 'kfmclient newTab'); # has no useful return-value on error
}
} for my $browser (@try) {
# ignore empty parts
next if ($browser =~ m/^$/o);
# expand %s if not preceded by odd number of %
$match = $browser =~ s/(?<!%)((?:%%)*)%s/$$url/og;
# expand %c if not preceded by odd number of %
$browser =~ s/(?<!%)((?:%%)*)%c/$:/og;
# reduce dubble %
$browser =~ s/%%/%/og;
# append URL if no %s expansion took place
$browser .= " ".$url if (!$match);
# leave loop if $browser was started successful
last if (system("$browser 2>/dev/null") == );
}
exit ; __END__ =head1 NAME url_handler.pl - Spawn appropriate viewer for a given URL =head1 SYNOPSIS B<url_handler.pl> I<URL> =head1 DESCRIPTION B<url_handler.pl> takes an URL as argument and spawns the first executable
viewer found in either B<$BROWSER_I<SCHEME>> or B<$BROWSER>. =head1 ENVIRONMENT =over =item B<$BROWSER_I<SCHEME>> The user's preferred utility to browse URLs of tye I<SCHEME>. May actually
consist of a sequence of colon-separated browser commands to be tried in
order until one succeeds. If a command part contains %s, the URL is
substituted there, otherwise the browser command is simply called with the
URL as its last argument. %% is replaced by a single percent sign (%), and
%c is replaced by a colon (:).
Examples: =over 4 =item $BROWSER_FTP="wget:ncftp" =item $BROWSER_GOPHER="lynx:links" =item $BROWSER_MAILTO="mutt:pine -url" =item $BROWSER_NEWS="lynx" =item $BROWSER_NNTP="lynx" =back Z<> =item B<$BROWSER> The user's preferred utility to browse URLs for which there is no special
viewer defined via B<$BROWSER_I<SCHEME>>. Again it may actually consist of a
sequence of colon-separated browser commands to be tried in order until one
succeeds. If a command part contains %s, the URL is substituted there,
otherwise the browser command is simply called with the URL as its last
argument. %% is replaced by a single percent sign (%), and %c is replaced
by a colon (:).
Examples: =over =item $BROWSER="firefox -a firefox -remote openURL\(%s\):opera:konqueror:links2 -g:lynx:w3m" =back =head1 SECURITY B<url_handler.pl> was designed to work together with B<tin>() which only
issues shell escaped absolute URLs thus B<url_handler.pl> does not try hard
to shell escape its input nor does it convert relative URLs into absolute
ones! If you use B<url_handler.pl> from other applications be sure to at
least shell escaped its input! =head1 AUTHOR Urs Janssen E<lt>urs@tin.orgE<gt> =head1 SEE ALSO http://www.catb.org/~esr/BROWSER/
http://www.dwheeler.com/browse/secure_browser.html =cut

自己写的browse.bat与perl写的url_handler.pl的比较的更多相关文章

  1. 横竖两个数字塔的效果BAT批处理怎么写?

    横竖两个数字塔的效果BAT批处理怎么写?@echo offfor /l %%a in (0,1,1) do (        for /l %%i in (0,1,9) do (        for ...

  2. 再议perl写多线程端口扫描器

    再议perl写多线程端口扫描器 http://blog.csdn.net/sx1989827/article/details/4642179 perl写端口多线程扫描器 http://blog.csd ...

  3. 瞧一瞧,看一看呐,用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!!

    瞧一瞧,看一看呐用MVC+EF快速弄出一个CRUD,一行代码都不用写,真的一行代码都不用写!!!! 现在要写的呢就是,用MVC和EF弄出一个CRUD四个页面和一个列表页面的一个快速DEMO,当然是在不 ...

  4. 刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)

    游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式: ...

  5. php 写内容到文件,把日志写到log文件

    php 写内容到文件,把日志写到log文件 <?php header("Content-type: text/html; charset=utf-8"); /******** ...

  6. 以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewControllers方法即可达到效果了

    以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewC ...

  7. 出错的方法有可能是JDK,也可能是程序员写的程序,无论谁写的,抛出一定用throw

    应对未检查异常就是养成良好的检查习惯. 已检查异常是不可避免的,对于已检查异常必须实现定义好应对的方法. 已检查异常肯定跨越出了虚拟机的范围.(比如“未找到文件”) 如何处理已检查异常(对于所有的已检 ...

  8. C++代写,代写C++,C++程序代写,C++ assignment代写

    C++代写,代写C++,C++程序代写 关于C++代写,我们的涉猎范围: C++数据结构.算法题目 C++操作系统os题目 C++网络编程networking题目 C++ Linux题目 C++ Wi ...

  9. 剖析手写Vue,你也可以手写一个MVVM框架

    剖析手写Vue,你也可以手写一个MVVM框架# 邮箱:563995050@qq.com github: https://github.com/xiaoqiuxiong 作者:肖秋雄(eddy) 温馨提 ...

随机推荐

  1. 从零上手Python关键代码

    来源 https://www.kesci.com/home/project/59e4331c4663f7655c499bc3

  2. 2018-2019-2 网络对抗技术 20165318 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165318 Exp3 免杀原理与实践 免杀原理及基础问题回答 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil- ...

  3. 关于ThinkPHP执行长时间任务可能导致PHP使用内存越来越大的问题

    ThinkPHP执行长时间任务时,可能导致PHP使用内存越来越大,最后因为内存超出配置限额而程序挂掉. 其实这在很久以前就无意之中发现的一个问题. 3.x之前有这个问题,5.0以后的,应该是已修复了的 ...

  4. Lock和Condition在JDK中LinkedBlockingQueue的应用

    Lock和Condition在JDK中LinkedBlockingQueue的应用,核心源码注释解析如下: import java.util.concurrent.LinkedBlockingQueu ...

  5. oracle备份恢复之recover database的四条语句区别

    1  recover database using backup controlfile2  recover database until cancel3  recover database usin ...

  6. slf4j+logback搭建超实用的日志管理模块

    文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们 ...

  7. Java不定参数Object… obj 和 Object[] 的区别

    Java不定参数Object… obj 和 Object[] 的区别 简述: java中方法重载可以实现参数不同自动匹配对应方法.但现实中也存在这种问题.普通传参对于形如下面的方法,却显得臃肿而失优雅 ...

  8. vue 如何在循环中 "监听" 的绑定v-model数据

    vue 如何在循环中 "监听" 的绑定v-model数据 阅读目录 vue 如何在循环中 "监听" 的绑定v-model数据 1. 普通属性的值进行监听 2. ...

  9. 深度:Hadoop对Spark五大维度正面比拼报告!

    每年,市场上都会出现种种不同的数据管理规模.类型与速度表现的分布式系统.在这些系统中,Spark和hadoop是获得最大关注的两个.然而该怎么判断哪一款适合你? 如果想批处理流量数据,并将其导入HDF ...

  10. BZOJ4816 SDOI2017 数字表格 莫比乌斯反演

    传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...