用于打开URL列表之一的批处理文件

时间:2009-08-29 02:10:43

标签: batch-file

我有一个网站列表。我想要一个批处理文件,当我第一次执行bat文件时,它将只打开列表中的第一个网站,当我第二次执行批处理文件时,它将只打开列表中的第二个网站,当我执行第三个网站时时间它只打开列表中的第三个网站,依此类推。 有人建议我遵循解决方案:

@echo off & setLocal EnableDELAYedExpansion

if not exist %TEMP%\runnum echo 1> %TEMP%\runnum
set /p R=<%TEMP%\runnum
set N=

for /f "tokens=* delims= " %%a in (myfile) do (
set /a N+=1
if !N! equ !R! echo firefox %%a blabla
)
set /a R+=1
echo !R!> %TEMP%\runnum

但我不知道(myfile)blabla的含义是什么,因为我对脚本或编程一无所知。 有人可以帮我进一步。假设我的网站列表是:

http://meebo.com
http://yahoo.com
http://google.com
http://orkut.com
http://facebook.com
http://msn.com
http://cnn.com
http://myspace.com
http://twitter.com

4 个答案:

答案 0 :(得分:5)

这实际上并不那么难。 myfile成为存储网址列表的文件名,blabla只是传递给Firefox的其他参数。

虽然有几点可以改进:

  • 依靠Firefox并不是最好的选择。我建议使用

    start "" "%%a"
    

    相反,因为它产生默认浏览器而不是硬编码特定浏览器。

  • 当您的文件中的网站数量达到并且可能只是生成一个新的Firefox窗口时,您的批处理将失败。下面我创建了一个批处理,消除了这两个问题:

    @echo off
    setlocal enableextensions
    rem fetch the first URL
    set /p URL=<list.txt
    rem Open the browser with that URL
    start "" "%URL%"
    rem Remove the URL from the front of the file ...
    more +1 list.txt | findstr /r /v "^$" > tmp_list.txt
    rem ... and put it to the end
    echo.%URL%>>tmp_list.txt
    del list.txt
    ren tmp_list.txt list.txt
    endlocal
    

此版本不依赖于特定的浏览器。它将简单地滚动文件本身,删除第一个URL并再次粘贴到最后。所以只要你有你的URL文件(在这种情况下是list.txt),它就是自包含的。代码也可以在我的SVN repository中找到。

ETA:解释该批次的某些部分:

set /p URL=<list.txt

这将list.txt中的第一行存储在环境变量URL中。通常set /p会提示用户输入。通过将文件重定向到此命令,我们基本上假装文件的内容是用户输入。

start "" "%URL%"

将打开网页,文档,文件夹等等。 start自动完成The Right Thing™(主要是:))。如果我们给它一个URL,它将打开它的默认浏览器,这是我们在这里使用的。 URL周围的两个引号将确保URL中&之类的字符将正确传递给浏览器,否则它们具有特殊含义。遗憾的是,在使用带start的引号时,start后面的两个引号是必要的。否则start会将URL解释为新控制台窗口的窗口标题,这可能不是我们想要的。

more +1 list.txt | findstr /r /v "^$" > tmp_list.txt

这有几个部分。首先more +1导致输出文件,跳过第一行。我们记得,第一行是我们想要打开的第一个URL(应该已经发生过了)。我们想要做的是从文件的开头删除该URL并将其放到最后。所以第一步是从头开始删除它,这是more +1 list.txt在这里做的。

然后,无论more打印件被传递到findstrfindstr是一个通常用于搜索字符串的便利工具。我们在这里做的是启用带有/r的正则表达式(一种程序员用于处理文本的梦想工具 - 如果可以的话,他们会用正则表达式编写完整的程序,但我离题了)。然后/v会导致findstr打印每行而不是,然后匹配我们指定的内容。我们在这里搜索的模式是"^$",这只是“空行”的注册。

因此,在一行中,我们从文件中删除第一行,从中删除任何空行。 (那些空行会导致批处理文件做出奇怪的事情。请记住start 主要是正确的吗?这就是一个这样的情况。文件中的空行会导致资源管理器窗口显示当前文件夹,而不是带有下一个网页的浏览器。所以我们需要摆脱它们。)

最后,我们将这些命令的所有内容写入一个名为tmp_list.txt的新文件中。别担心,它不会徘徊太久。

echo.%URL%>>tmp_list.txt

这会将刚打开的URL追加到我们的临时列表中。没什么好看的。

del list.txt
ren tmp_list.txt list.txt

最后,我们删除旧列表,并将临时名称重命名为旧名称。

ETA :由于您要求一次性打开多个页面的版本,以下是一个快速而肮脏的黑客,它可以实现:

@echo off
setlocal enableextensions
set num=3
for /l %%i in (1,1,%num%) do call :start
endlocal
goto :eof

:start
set /p URL=<list.txt
start "" "%URL%"
more +1 list.txt | findstr /r /v "^$" > tmp_list.txt
echo.%URL%>>tmp_list.txt
del list.txt
ren tmp_list.txt list.txt
goto :eof

这次没有冗长的解释。这篇文章已经足够长了。您可以通过更改文件顶部附近的num变量来控制打开的页数。

set num=5

将导致打开五页而不是三页。

答案 1 :(得分:2)

扩展了Ventero的“Dirty hack”,让文本文件中的行循环遍历整个文本文件,打开它们然后结束。像魅力一样工作

@echo off
setlocal enableextensions
setlocal EnableDelayedExpansion
set "cmd=findstr /R /N "^^" Give.txt | find /C ":""

for /f %%a in ('!cmd!') do set number=%%a

set num=%number%
for /l %%i in (1,1,%num%) do call :start
endlocal
goto :eof

:start
set /p URL=<Give.txt
start "" "%URL%"
more +1 Give.txt | findstr /r /v "^$" > tmp_list.txt
echo.%URL%>>tmp_list.txt
del Give.txt
ren tmp_list.txt Give.txt
goto :eof

希望其他人制作并发布,所以我会成为其他人=)

答案 2 :(得分:1)

由于

我有一个空格(%20)的网址,确实需要:
start "" "(URL with space)"

另外,我发现如果没有加载IE,它会在加载时忽略我的批处理文件中的硬编码列表,导致列表中只有一个URL实际工作。第一次启动后的延迟效果很好:

 rem  allow IE to load, otherwise it will only show 1 URL   
 rem  N=Nothing shown  D=default (Y for Y/N)  T=timeout (7 sec)  
@choice /N /D Y /T 7 > nul:

答案 3 :(得分:1)

我刚刚找到了一个不支持/ D和/ T的旧的choice.com:

 rem  older versions of choice may need:  choice /N /Ty,7 > nul:

如果有疑问,请使用 choice /?:)